2017-07-17 2 views
2

J'essaie d'écrire un jeu 2D avec un monde infini dans Unity. Il devrait être comme Terraria sauf "infini" dans toutes les directions. Ainsi, les morceaux sont générés, stockés et chargés sur le pouce au fur et à mesure que le joueur se déplace. Ma question est la suivante: comment les morceaux sont-ils stockés et chargés plus tard en mémoire? Je n'ai pas trouvé de tutoriel sur ce sujet. Je suppose que de tels grands tableaux doivent être stockés sur le disque, mais n'est pas IO disque lent? Disons que j'essaye de charger un gros carré de 5 morceaux autour du joueur (le morceau central où le joueur se tient et 2 morceaux dans chaque direction). Est-ce que cela veut dire que si le joueur continue à aller et venir entre deux morceaux, je vais devoir continuer à charger et à stocker 5 morceaux de chaque côté de ce morceau chargé? Ce ne serait pas très lent?Comment les mondes infinis sont-ils stockés et restaurés?

+0

Si le chargement prend beaucoup de temps, vous souhaiterez peut-être l'étaler sur plusieurs cadres pour éviter les problèmes. Vous pouvez également utiliser une plus grande distance de seuil de déchargement si vous vous attendez à ce que les joueurs fassent beaucoup de va-et-vient. –

+0

Je ne connais pas la réponse exacte mais je me suis posé des questions sur la même chose récemment et je pense que diviser un monde en morceaux et sauvegarder ces morceaux sur un disque est la meilleure option. Bien sûr, lorsque vous chargez votre monde, vous lisez d'abord TOUTES les données stockées sur le disque - vous n'avez donc pas besoin de le faire à la volée (comme vous l'avez dit - le disque IO est plutôt lent) - et chargez les visuels proches à vous – Fiffe

+0

D'abord déterminer, si le disque IO est vraiment "trop" lent. Bien sûr, c'est plus lent que l'accès en mémoire, mais la question est de savoir combien de données sont dans un morceau ou pour être plus précis, combien de données doivent être stockées pour un morceau. Quelques kilo-octets ne devraient même pas être remarquables. Si la "fenêtre" de 5 morceaux est trop petite, gardez simplement 7 ou 9 ou autant de fois que nécessaire chargé. Avez-vous besoin de décharger un morceau immédiatement? L'enregistrement puis le déchargement peuvent être effectués de manière complètement asynchrone. Est-ce que le joueur tourne et retourne? Puis arrêtez le déchargement. Le joueur court dans une direction? Pouvez-vous vous permettre de charger plus de morceaux de cette façon? – Corak

Répondre

1

Ce que vous pouvez faire est de charger des morceaux si le joueur est à 2 blocs mais ne les déchargez pas à moins que le joueur ne soit à 4 blocs.

Alors disons que le joueur marche droit: (ici X est le joueur, a b c.. sont les morceaux, en [] sont des morceaux chargés dans le rayon de chargement, et () sont des morceaux chargés dans le rayon de déchargement)

a b c (d) (e) [f] [g] [X] [i] [j] k l 

S'il décide de retourner au bloc g, alors le bloc e n'a pas besoin d'être chargé (il l'est déjà) et le bloc j n'est pas déchargé (il n'est pas en dehors du rayon de déchargement).

a b c (d) [e] [f] [X] [h] [i] (j) k l 

S'il veut revenir à gros morceau h, encore une fois, pas de morceaux doivent être chargés ou déchargés. Il peut donc faire des allers-retours entre les morceaux sans avoir à les laisser tomber/décharger.