Comment gérer les ressources manquantes?

13

Votre jeu s'attend à ce qu'un certain élément soit chargé, mais il n'est pas trouvé. Comment gérer la situation? Par exemple:

Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found
Mesh* car             = LoadMesh("Car.obj");      // returns NULL; 3D mesh not found

Il pourrait avoir été accidentellement supprimé par l'utilisateur, corrompu ou mal orthographié lors de son développement.

Quelques réponses potentielles:

  • Assertions (idéalement uniquement pendant le développement)
  • Quittez le jeu avec élégance
  • Lancez une exception et essayez de la gérer.

Quelle voie est la meilleure?

concept3d
la source
Une façon de le faire est de vérifier si les données du jeu sont toujours intactes. Sinon, téléchargez automatiquement les données manquantes. erreur> demander à l'utilisateur de vérifier les données> télécharger. Vous devez évidemment créer un petit outil pour cela.
Sidar
@Sidar J'aime plus ce que vous avez dit que la réponse la plus votée, vous pouvez peut-être mieux expliquer ce que vous essayez de dire
concept3d
La laideur des erreurs est que, parfois, cela brise le jeu et que les gens ne peuvent pas y jouer / le démarrer. Dans Steam par exemple, si votre jeu ne fonctionne pas correctement, vous pouvez vérifier les données du jeu. Lorsque quelque chose semble corrompu / manquant / changé, Steam téléchargera automatiquement ces fichiers. Je ne sais pas exactement comment ils le font. Mais ils le vérifient évidemment par rapport à certaines données. Peut-être des codes de hachage? Je ne sais vraiment pas. Mais vous devriez toujours avoir un actif de remplacement standard (simplement une texture qui dit "erreur" dessus ou quelque chose)
Sidar
@Sidar pourquoi ne pas le mettre en forme dans une réponse?
concept3d
Parce que je ne sais pas exactement comment cela fonctionne et je ne veux pas me tromper à ce sujet. Je ne pouvais donc pas vous répondre correctement.
Sidar

Réponses:

19

Beaucoup de jeux ont un "matériel d'erreur" générique et un "maillage d'erreur" qui est vraiment évident à voir. Associez cela à un avertissement dans les journaux, bien sûr.

Robert Fraser
la source
Entièrement d'accord avec ce post. Cependant, vous voudrez peut-être faire différentes choses dans une version / version distribuée.
Jonkel
Pour les versions, on pourrait penser à une approche pour valider les fichiers disponibles en utilisant le hachage pour télécharger les fichiers manquants ou invalides. Cependant, pendant le développement, c'est certainement la meilleure approche pour afficher une texture en damier noir et magenta pour attirer votre attention. Pour les modèles, on pourrait utiliser un énorme modèle ERREUR qui devrait être évident.
Christian Ivicevic
Cela a du sens pour les textures. pas tant pour les modèles 3D. Et si la plupart des modèles 3D manquaient? Le jeu aura l'air drôle, alors qu'il devrait être jouable en premier lieu. Que se passe-t-il si vous calculez votre base de structure de données spatiales sur les propriétés géométriques des modèles 3D ce qui devrait se produire. Je ne suis avec cela que dans des circonstances simples comme une texture manquante. Mais je pense que la vérification de l'exhaustivité des données est une meilleure approche pour les jeux commerciaux.
concept3d
1
@ concept3d - Je sais au moins que le moteur Source a un gros maillage d'erreur évident (je l'ai vu occasionnellement dans le client de test Dota 2, à l'époque où ils ajoutaient des héros). Je suis d'accord que si de grandes quantités de données de niveau manquent, il est probablement préférable de simplement faire une erreur, en particulier dans une version, mais à des fins de débogage, avoir un gros point d'interrogation danser n'est pas trop mal.
Robert Fraser
6

Si vous avez des ressources de résolution différentes de la même texture , vous pouvez essayer de récupérer la situation en utilisant une résolution différente.

Texture* grassTexture;
try {
    grassTexture = LoadTexture("Grass.png");
} catch (WhateverExcaption e) {
    grassTexture = LoadTexture("Grass_512.png");
}

Si même cela échoue, il pourrait être temps de renflouer.

daniel
la source
2
Vous pouvez ajouter une bascule à la capture, donc dans Dev, vous affichez toujours le maillage / tex manquant, mais lors de la publication, il essaiera de récupérer en premier et peut-être aura une texture manquante moins évidente.
DampeS8N