J'ai récemment lu comment créer des mondes procéduraux ... mais comment en enregistrer un?
Dans des jeux comme Terraria ou Minecraft, les utilisateurs peuvent modifier librement le paysage, mais ce monde ne peut pas être recréé à partir de la graine de départ. Quelles techniques sont utilisées pour sauver des mondes procéduraux mais modifiables?
Enregistrez la graine que vous avez utilisée pour générer le monde, et les modifications sous forme de "commandes" atomiques ou les résultats de celles-ci.
Ensuite, lors du chargement de la partie enregistrée, vous procédez comme suit:
Générez de façon procédurale la partie du monde que vous visitez actuellement.
Appliquez les commandes enregistrées ou remplacez les éléments générés par ceux enregistrés.
Mise à jour: Et bien sûr, il y a la possibilité de sauvegarder votre monde généré comme un monde normal, si les ressources sont disponibles (comme on le voit dans Minecraft). Dans ce cas, vous ne devez enregistrer que les parties du monde qui ont déjà été visitées (sinon la génération procédurale serait à peu près inutile), tuile par tuile. Cela consomme plus de ressources de disque dur et / ou de base de données, mais nécessitera moins de puissance CPU lors du chargement d'un jeu.
En plus des modifications, il a probablement aussi besoin de sauvegarder la graine qui a été utilisée pour construire le monde procédural ;-)
bummzack
@bummzack Oui bien sûr, j'ai oublié de le mentionner, car c'est évident :-) Je vais modifier ma réponse.
Marton
10
Je ne suis pas tout à fait sûr que régénérer le monde à partir de la graine soit la meilleure idée. La génération de monde implique généralement des algorithmes complexes et prend donc du temps: nous générons des mondes aléatoires non pas pour économiser de l'espace en général mais pour profiter du caractère aléatoire. Je considérerais donc que sauver le monde entier dans un format binaire serait plus efficace.
Jonathan Connell
2
Vous dites donc que pour sauver un monde généré de manière procédurale, vous le générez, puis l'enregistrez? Ce n'est pas une réponse très complète.
MichaelHouse
2
@ Random832 Minecraft fait sauver le monde dans un format binaire, au lieu de le régénérer de la graine et rejouant les modifications. Pour contourner le problème de la sauvegarde du monde entier, Minecraft enregistre uniquement les morceaux qui ont été générés jusqu'à présent. Au fur et à mesure que vous explorez le monde, votre sauvegarde augmente.
Joseph Mansfield
8
L'enregistrement d'un monde généré de manière procédurale revient à enregistrer toutes les données de carte de tuiles.
Vous voudrez probablement sauver le monde au format binaire, en supposant que le monde est construit à partir de différents types de tuiles, vous devrez:
Décidez du nombre total de différents types de tuiles (selon cela, vous aurez besoin de plus ou moins de bits pour représenter chaque tuile)
Définissez la largeur et la hauteur du monde visité (modifié).
Représentez le monde tuile par tuile de la tuile la plus à gauche (y compris le ciel) rangée par rangée jusqu'à la tuile la plus à droite.
Si vous souhaitez économiser de l'espace, utilisez DEFLATE ou un algorithme similaire pour compresser ce tableau 2d (représenté en 1-d) http://en.wikipedia.org/wiki/DEFLATE
Utilisez les E / S de fichiers appropriées pour votre API pour stocker les données sur le disque.
Vous pouvez également utiliser la même méthode pour enregistrer une carte basée sur un voxel.
Le stockage d'un modèle de carte basé sur des sommets est plus complexe.
Si vous le souhaitez, vous pourrez peut-être l'enregistrer dans un fichier png en codant par couleur chaque tuile. Cela vous permettra de la vue d' ensemble le résultat rapidement , sans l' aide d' un observateur spécialisé.
wolfdawn
4
À propos de Minecraft, le monde utilise des voxels, il est donc assez facile d'enregistrer, plus d'informations ici:
Comme déjà dit, enregistrez une graine utilisée pour générer le monde, et adaptez votre format de sauvegarde à la composition de votre monde (cubes, atomes, etc ...).
Quelle que soit la structure de données que vous utilisez pour stocker le monde en mémoire, vous pouvez l'utiliser comme modèle pour écrire et lire à partir du disque. La partie procédurale de votre jeu remplira ces structures de données la première fois, si aucune donnée n'est disponible sur le disque. Ensuite, lorsque vous êtes prêt à décharger une zone de la mémoire, écrivez-la sur le disque telle qu'elle a été générée ou modifiée.
Chaque fois que vous êtes prêt à charger une nouvelle zone en mémoire, vérifiez d'abord si elle a été générée avant et enregistrée sur le disque. Si tel est le cas, chargez-le depuis le disque plutôt que depuis vos algorithmes de génération procédurale.
En règle générale, cela se ferait avec des morceaux de terrain. Vous pouvez soit enregistrer chaque bloc dans son propre fichier, soit créer une structure de disque plus complexe qui contient des données dans un seul fichier avec une table de recherche. Il existe d' autres questions sur les bons moyens de sauvegarder vos données sur le disque.
L'enregistrement d'un monde généré de manière procédurale revient à enregistrer toutes les données de carte de tuiles.
Vous voudrez probablement sauver le monde au format binaire, en supposant que le monde est construit à partir de différents types de tuiles, vous devrez:
Vous pouvez également utiliser la même méthode pour enregistrer une carte basée sur un voxel.
Le stockage d'un modèle de carte basé sur des sommets est plus complexe.
Souhaitez-vous que j'élabore sur ce sujet?
la source
À propos de Minecraft, le monde utilise des voxels, il est donc assez facile d'enregistrer, plus d'informations ici:
http://www.minecraftwiki.net/wiki/Region_file_format
http://www.minecraftwiki.net/wiki/Level_Format
Comme déjà dit, enregistrez une graine utilisée pour générer le monde, et adaptez votre format de sauvegarde à la composition de votre monde (cubes, atomes, etc ...).
la source
Quelle que soit la structure de données que vous utilisez pour stocker le monde en mémoire, vous pouvez l'utiliser comme modèle pour écrire et lire à partir du disque. La partie procédurale de votre jeu remplira ces structures de données la première fois, si aucune donnée n'est disponible sur le disque. Ensuite, lorsque vous êtes prêt à décharger une zone de la mémoire, écrivez-la sur le disque telle qu'elle a été générée ou modifiée.
Chaque fois que vous êtes prêt à charger une nouvelle zone en mémoire, vérifiez d'abord si elle a été générée avant et enregistrée sur le disque. Si tel est le cas, chargez-le depuis le disque plutôt que depuis vos algorithmes de génération procédurale.
En règle générale, cela se ferait avec des morceaux de terrain. Vous pouvez soit enregistrer chaque bloc dans son propre fichier, soit créer une structure de disque plus complexe qui contient des données dans un seul fichier avec une table de recherche. Il existe d' autres questions sur les bons moyens de sauvegarder vos données sur le disque.
la source