Comment pouvez-vous mettre toutes les images d'un jeu dans 1 fichier?

67

Je viens de terminer un jeu de base RPG écrit en C ++ SFML, je me suis beaucoup investi dans le jeu et je voudrais le distribuer, mais j'ai rencontré un petit problème.

Le problème, c’est que j’ai bien plus de 200 images et fichiers cartographiques (c’est-à-dire des fichiers .txt qui contiennent des codes de carte), le tout dans le même dossier que l’exécutable; tant de ressources, je n'ai jamais vu un jeu qui vous montre toutes les ressources directement, je crois plutôt qu'elles regroupent les ressources dans un certain fichier.

Eh bien, c’est ce que j’essaie d’obtenir: j’espère pouvoir regrouper toutes les images dans un fichier (peut-être aussi les fichiers .txt), puis pouvoir les lire ou les ajouter facilement.

Bugster
la source
J'ai vu du code où toutes les images ont été emballées dans une chaîne dans le code. Mais cela a été fait en raison d'exigences. (C’était un concours Java de 64 Ko)
Omar Kooheji le
Désolé, c’était une compétition java de 4Kb. Pas un 64Kb.
Omar Kooheji

Réponses:

62

Les programmeurs de jeux ont utilisé l'une des deux méthodes principales de stockage de données:

  • stocker chaque fichier de données dans un fichier séparé
  • stocker chaque fichier de données dans un format d'archive personnalisé

L'inconvénient de la première solution est le problème de l'espace disque gaspillé, ainsi que celui des installations plus lentes.

La deuxième solution offre ses propres pièges. Premièrement, vous devez écrire votre propre image / son / etc. des routines de chargement utilisant une API personnalisée pour accéder aux données archivées. Un autre inconvénient est que vous devez d'abord créer votre propre utilitaire d'archivage pour créer les archives.

TAR / GZ risque de ne pas être une très bonne idée, car vous ne pouvez pas extraire des fichiers spécifiques car vous en avez besoin. C'est la raison pour laquelle de nombreux jeux utilisent les archives ZIP, ce qui vous permet d'extraire des fichiers individuels à votre guise (un bon exemple est Quake 3, dont les fichiers PK3 ne sont rien d'autre que des fichiers ZIP avec une extension différente).

EDIT: "Cacher" la structure des dossiers du jeu et "Ne garder" que les exécutables

Une autre solution est souvent utilisée pour "masquer" les fichiers de jeu dans la structure de dossiers. Conservez uniquement vos exécutables et peut-être un fichier Lisez-moi dans le répertoire principal et déplacez les fichiers du jeu dans un sous-dossier nommé "data" ou un autre fichier associé.

EDIT: Gamedev Tuts Plus a une belle ressource

EDIT: libarchive

Une solution potentielle libarchive, qui est une bibliothèque d'archivage qui gérera l'extraction de fichiers à partir d'une archive telle qu'un fichier ZIP. Il vous permet même d’affecter le fichier extrait à un pointeur FILE standard, ce qui rendrait l’interface avec toute autre bibliothèque potentiellement plus simple.

EDIT: fichiers au format ZIP avec extension alternative

Ici, j'aime le commentaire de @Joachim Sauer

L'utilisation de fichiers au format ZIP avec des extensions alternatives a également une grande tradition en dehors des jeux: Java le fait , le format OpenDocument (aussi appelé format OpenOffice / LibreOffice) le fait , même Office Open XML (ou le "nouveau" format Microsoft Office) il fait .

Mahbubur R Aaman
la source
2
Ouais, Thief / SystemShock2 a utilisé des fichiers .zip qui ont aussi été renommés. En Java, vous pouvez utiliser quelque chose comme TrueZip pour accéder aux fichiers compressés comme s'il s'agissait de fichiers de dossiers. J'imagine qu'il existe des bibliothèques similaires pour C ++.
Nick
18
L'utilisation de fichiers au format ZIP avec des extensions alternatives a également une grande tradition en dehors des jeux: Java le fait , le format OpenDocument (aussi appelé format OpenOffice / LibreOffice) le fait , même Office Open XML (ou le "nouveau" format Microsoft Office) le fait ...
Joachim Sauer
5
@Sish. Selon la plate-forme, la quantité d'espace disque occupée par un grand nombre de petits fichiers peut être considérablement supérieure à celle d'un seul fichier volumineux, même si ce fichier volumineux n'est pas compressé du tout ( .tarpar exemple). Cela concerne la manière dont les données sont physiquement stockées sur le disque.
TRiG
1
Ah c'est vrai. Cela ne devrait pas être beaucoup, à moins qu'il y en ait beaucoup , mais dans ce cas, cela peut effectivement s'accumuler. Je peux imaginer que l'installation et la désinstallation prennent également un coup avec beaucoup de petits fichiers.
Svish
2
Légèrement lié au commentaire de Kylotan, voici un article de Jonathan Blow sur le dev-blog de The Witness sur l'utilisation des archives et leur interaction avec le mécanisme de correction de Steam. "Le témoin regroupe la plupart de ses données dans un seul fichier de 2 Go stocké au format .zip. Avant de télécharger la version initiale sur Steam, j'ai pris une mesure de protection pour réduire au minimum la taille des patchs, ou alors je pensais [...] (Imagine que les fichiers sont stockés dans un ordre aléatoire: chaque patch implique probablement que chaque joueur re-télécharge le jeu entier!) "
Eric
39

Une autre solution souvent utilisée pour "masquer" les fichiers du jeu est la structure de dossiers. Conservez uniquement vos exécutables et peut-être un fichier Lisez-moi dans le répertoire principal et déplacez les fichiers du jeu dans un sous-dossier "données". Je ne pense pas que ce soit très rare. De nombreux jeux que je connais stockent leur contenu de cette manière.

Tom Van Green
la source
8
+1 Si l'espace disque ou la protection ne sont pas un problème, c'est la solution la plus simple.
Laurent Couvidou
1
+1 parce que l'autre gars a dit +1. Vous ne pouvez pas vous tromper, hein? (Blague à part, bonne réponse.)
jcora
Ceci, à mon avis, est le choix idéal. Si le système de fichiers ne peut pas gérer cela efficacement, il est cassé et vous devriez vous appuyer sur le fabricant du système d'exploitation pour l'améliorer.
Omnifarious
3
@Omnifarious Ce n'est pas toujours vrai, par exemple, lors de la lecture d'un disque optique, même avec un système de fichiers parfait, il est courant de compresser des fichiers afin de prévenir toute recherche excessive (l'accélération peut être assez surprenante). Mais ceci est une histoire totalement différente pour les disques durs, et j'ai tendance à penser que le PO est dans ce cas.
Laurent Couvidou
3
@ Mr.Beast Vous avez manqué mon point. Je parle de disques optiques. J'ai travaillé pour un studio où le travail d'un programmeur à temps plein était essentiel pour s'assurer que les fichiers soient placés le plus efficacement possible sur un DVD, afin d'obtenir le meilleur temps de chargement possible. Je suis sûr qu'il serait heureux d'apprendre qu'il aurait pu compter sur le système de fichiers DVD;)
Laurent Couvidou
22

J'aime beaucoup PhysFS pour ça. Il vous permet d'accéder à des dossiers ou à des archives zip avec le même code. Cela fonctionne bien pour toutes les étapes de la vie des Jeux.

  1. Au cours du développement : accédez directement aux ressources depuis une hiérarchie de dossiers. De cette façon, les archives compressées ne sont pas gênantes et vous pouvez effectuer une itération rapide.
  2. Déploiement initial : zippez vos ressources pour un déploiement facile / des installations rapides. Aucun code n'a besoin de changer. Il suffit de pointer PhysFS sur le zip au lieu du dossier.
  3. Mises à jour / Modding: PhysFS peut charger plusieurs archives zip où les ressources d'une remplacent l'autre. Les mises à jour peuvent être aussi simples qu’un nouveau zip contenant uniquement les fichiers modifiés. De même pour le modding.

mise à jour:

J'ai utilisé le didacticiel fourni avec le code source et la documentation de doxygen pour apprendre à PhysFS. L'API est vraiment assez simple, vous passerez plus de temps à apprendre à charger des images dans SFML via des mémoires tampons plutôt que par chemin de fichier.

deft_code
la source
4
J'utilise PhysFS pour mon projet actuel et je l'adore. Je n'ai pas toujours besoin de régénérer mon fichier d'archive de contenu; Je peux simplement déposer une version mise à jour dans le chemin de recherche et BAM! Ça marche.
Zack The Human
Après quelques réponses, j'ai décidé d'aller avec physFS. Souhaitez-vous recommander un bon tutoriel? :)
Bugster
12

Je suggère d'utiliser un fichier ZIP. C'est un format omniprésent et vous trouverez des bibliothèques prêtes à l'emploi qui vous permettent de charger des fichiers à partir d'un fichier ZIP. Une recherche rapide sur Google a même révélé un chargeur zip pour sfml .

bummzack
la source
3

Eh bien, vous pouvez tricher comme ils l'ont mentionné :) Vous pouvez créer une feuille de sprite à partir de l'image, il n'est pas nécessaire de la compresser à moins de gagner du temps, sauf si cela permet d'économiser beaucoup d'espace. Après avoir créé une feuille-objet ou plusieurs feuilles-image à partir des images, vous pouvez simplement renommer leurs extensions. La plupart des joueurs ne prendront pas la peine de vérifier et pourquoi ne pas laisser cette option aux artistes qui voudront peut-être modifier votre jeu à l'avenir? De cette façon, ils peuvent aussi créer une feuille de sprite, renommer son extension et commencer à rouler.

Avec les fichiers texte, je vous suggère humblement de convertir ces données en forme binaire. Je suis sûr que vous trouverez un moyen simple de le faire. Par exemple, si vous utilisez uniquement AZ, az et le 0-9, vous pouvez utiliser 6 bits pour représenter chaque caractère, ce qui protégera quelque peu votre contenu protégé par le droit d'auteur. empêchera également les autres utilisateurs d’éditer des cartes. Vous pouvez toujours ajouter un convertisseur de carte si vous le souhaitez. Zipper est tout à fait raisonnable pour le texte cependant.

Wolfwawn
la source
La conversion en binaire est un bon conseil, mais pas pour la protection - il sera simplement plus facile à analyser et plus rapide à charger. Je le suggérerais comme étape de prétraitement, mais cela ira hors sujet pour la question.
Maximus Minimus
Eh bien, je suppose, s’il veut le protéger plus efficacement, il pourrait essayer de le chiffrer avec RSA ou un algorithme similaire (inutile). Je doute que quiconque utilise sans autorisation les fichiers de carte d'un jeu indépendant s'il se trouve dans un fichier binaire. Cela ne semble pas valoir la peine d'investir du temps dans la détermination de notre analyse syntaxique. Les fichiers texte sont simplement vulnérables et, comme vous l'avez suggéré, inefficaces pour stocker des données.
Wolfdawn
3
Sur les disques durs, le chargement d’un fichier zip unique est plus rapide que la plupart des petits fichiers car il existe des recherches aléatoires moins coûteuses sur le disque physique. Un fichier binaire pour un petit jeu peut être mappé dans la mémoire et fonctionner "par magie", presque aucune analyse n'est requise.
Liosan
@Liosan Vous avez peut-être mal interprété ce que je voulais dire ou je ne vous ai pas bien compris. J'ai dit que le binaire était préférable pour stocker des données et qu'il était peu probable que les autres concepteurs de jeu veuillent apprendre à analyser votre code binaire, à moins que ce ne soit documenté et encouragé pour le modding. fins. Par conséquent, il offre une protection rudimentaire sur les fichiers texte.
Wolfdawn
2

Il ne s'agit pas uniquement du nombre de ressources ou de l'espace disque.
Avec beaucoup de fichiers de texture différents, comme vous utilisez SFML, qui rend avec OpenGL, chaque fois que vous allez restituer une texture, OpenGL doit lier la texture suivante à la carte vidéo (vérifiez glBindTexture ()), et une tâche très coûteuse.
Dans cet esprit, vous pouvez comprendre pourquoi les jeux mettent généralement plusieurs images-objets dans la même texture, appelées feuilles-feuilles, en fonction de vos menus / niveaux / cartes du jeu.
Le résultat est un gain de performances énorme, car vous restituez beaucoup d'images-objets avec le même appel à la texture de liaison.

Edmo Freitas
la source
Après avoir reçu plusieurs références à la création d'une feuille de sprite, j'ai envisagé un refactoring afin de réduire le nombre d'images. Merci
Bugster
2

Personnellement, je me dirigerais vers le chemin du fichier binaire personnalisé pour cela. C’est quelque chose que je fais moi-même tout le temps maintenant, ce n’est pas aussi difficile que cela puisse paraître, et cela procure également un niveau d’obscurcissement pour vos fichiers de ressources de jeu. J'ai écrit un petit article d'introduction sur Gamedev à ce sujet il n'y a pas si longtemps, si cela vous intéresse:

http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-gour-games-data/

Les feuilles de Sprite sont un sujet totalement différent, mais elles sont la norme pour la plupart des jeux :)

Si Robertson
la source
1

Une autre méthode que vous pouvez utiliser:

La version gratuite de XnView fournit une fonctionnalité appelée " Strip of Images" (MAJ + A), qui vous permet de créer sprite-collections.

Cela minimise l’accès aux fichiers et est particulièrement important pour les applications / jeux Web HTTP-roundtrips.

L'accès à des images individuelles est ensuite accordé via des cartes de coordonnées (par exemple, définitions css).

Lorenz Lo Sauer
la source
0

Vous devez d’abord écrire votre propre image / son / etc. des routines de chargement utilisant une API personnalisée pour accéder aux données archivées. Un autre inconvénient est que vous devez d'abord créer votre propre utilitaire d'archivage pour créer les archives. TAR / GZ risque de ne pas être une très bonne idée, car vous ne pouvez pas extraire des fichiers spécifiques car vous en avez besoin. C'est la raison pour laquelle de nombreux jeux utilisent les archives ZIP, ce qui vous permet d'extraire des fichiers individuels à votre guise (un bon exemple est Quake 3, dont les fichiers PK3 ne sont rien d'autre que des fichiers ZIP avec une extension différente). http://zpp-library.sourceforge.net/


la source