Les outils de pipeline de contenu doivent-ils être intégrés dans le moteur?

10

À quel point un moteur de jeux doit-il être minimal? Quelle proportion du pipeline de contenu doit être intégrée dans le moteur?

Quelques cas d'utilisation où le super moteur peut être utile:

  • Lors du chargement du contenu utilisateur, l'utilisateur n'est pas obligé de regrouper ses textures, le moteur le fera au moment du chargement.

  • Un script demande une police d'une taille beaucoup plus grande que ce qui était pré-généré, le moteur pourrait analyser le fichier ttf et construire un nouvel atlas de texture.

  • Halo forge .

Bien sûr, rien de tout cela n'est gratuit. Cela nécessite que vos outils de pipeline de contenu soient écrits en C ++. Les bibliothèques de support que vous utilisez dans le pipeline doivent être compilées pour être utilisées sur le périphérique. Il nécessite que la génération de contenu ne soit pas boguée. Et cela rend généralement votre moteur plus gros et plus maniable.
Quels sont les autres avantages et inconvénients?
Les avantages l'emportent-ils sur les inconvénients?

Quelques questions spécifiques:

  • Le moteur doit-il être capable de charger différents formats d'image? Un chargeur uniquement TGA est un code assez facile à manipuler.

  • Et les formats audio? Est-il possible de ne prendre en charge que le chargement de fichiers wav? Qu'en est-il des fichiers de musique ambiante qui sont souvent énormes.

  • Le moteur doit-il être capable d'analyser TTF dynamique et de générer un atlas?

  • Emballage de texture.

deft_code
la source

Réponses:

11

Le blog Games from Within de Noel Llopis a récemment abordé ce sujet dans la publication "Remote Game Editing" . Le premier paragraphe:

Je suis depuis longtemps un fan des durées de jeu minimales. Tout ce qui peut être fait hors ligne ou dans un outil distinct doit être hors du runtime. Cela laisse l'architecture et le code du jeu très simples et simples .

(L'article est une lecture fortement recommandée, comme avec la plupart des trucs de Noel, que vous soyez d'accord à 100% ou non.)

Je crois que la clé ici est de garder la complexité en dehors du moteur. Vous pouvez toujours avoir de la flexibilité, mais c'est de la flexibilité dans le pipeline de contenu. Et vous obtenez de meilleures performances en ne passant pas de temps à convertir et à déplacer des données.

De meilleures performances peuvent se traduire par une réduction du temps d'itération, étrangement, malgré la perte de certaines des capacités d'édition dans le moteur: il est plus facile d'essayer quelque chose si vous pouvez charger le jeu en une seconde.

L'adoption de certains des principes de la « philosophie unix » vous aidera à garder votre chaîne d'outils flexible: un petit pipeline modulaire.

Ma philosophie personnelle: cuire autant de données que possible hors ligne, mais fournir un support moteur pour recevoir de nouvelles données cuites à tout moment. (Notez que ces nouvelles données n'ont pas besoin d'entrer en jeu jusqu'à un moment opportun: le bouton "rafraîchir" est enfoncé, le niveau suivant commence, vous passez à une nouvelle zone, peu importe. La clé est de trouver le point idéal qui minimise temps d'itération avec un minimum de complexité de code et d'effort de codage.)

Dans notre entreprise, la plupart de nos outils destinés aux artistes / concepteurs sont axés sur les problèmes d'interface utilisateur: facilité de manipulation des actifs uniques ou de leurs lots, etc. Parfois, ce ne sont que des outils tiers comme Photoshop ou 3DS Max. Ces outils exportent vers un format intermédiaire (souvent xml qui fait référence aux données binaires source, mais pas toujours). Le format intermédiaire est repris par un outil backend "data make", qui le transforme en quelque chose d'utile et de rapide à charger pour la plate-forme cible.

La portabilité est obtenue en ajoutant des outils de création de données backend supplémentaires ou en étendant les outils de création de données backend existants, ce qui présente l'avantage supplémentaire d'être invisible pour les créateurs de contenu.

Maintenant, avec une bonne création de données incrémentielles, vous pouvez avoir des modifications au format cuit en quelques secondes; votre moteur peut spider, ou un outil peut spider, puis ceux-ci apparaîtront dans votre système de ressources, prêts à être rechargés quand cela sera pratique.

Les outils - en particulier les données de backend font des outils - sont souvent plus bâclés et plus bogues que le code moteur. C'est OK, car ils sont plus faciles à refactoriser / réécrire, étendre et tester; vous avez des spécifications pour leur comportement et il est assez facile de les tester unitairement par rapport à un code moteur.

Mes opinions sur vos questions:

Le moteur doit-il être capable de charger différents formats d'image? Un chargeur uniquement TGA est un code assez facile à manipuler.

(À part: même si vous utilisez un décodeur TGA dans le moteur, ne le codez pas manuellement. Vous demandez juste des problèmes - il y a beaucoup de subtilités avec la plupart des formats d'image et beaucoup d'outils qui n'adhèrent pas exactement au format probablement sous-spécifié. Il vaut mieux trouver le code de bibliothèque existant et bien testé pour le traitement d'image.)

Je voudrais que l'outil convertisse ici de TGA en quel que soit votre format de texture interne, plus des métadonnées.

Et les formats audio? Est-il possible de ne prendre en charge que le chargement de fichiers wav? Qu'en est-il des fichiers de musique ambiante qui sont souvent énormes.

Nous utilisons ici trois formats: musique suivie (.xm), ADPCM (.wav) et Speex (.spx). C'est principalement parce que nous sommes sur des ordinateurs de poche, et ces formats sont très légers à décoder.

Le moteur doit-il être capable d'analyser TTF dynamique et de générer un atlas? Emballage de texture.

L'atlasing est un problème difficile: consultez les réponses à vos questions récentes . Cela vaut presque toujours la peine de le faire hors ligne.

De plus, vous pouvez transformer les métadonnées par caractère en une structure cuite au code de chargement presque nul.

En terminant, vous pouvez nettoyer et empaqueter ce pipeline avec votre jeu, pour la communauté des mods. Vous pouvez toujours ajouter plus de formats source. Et rien ne vous empêche de combler l'écart entre les outils de création de contenu et le moteur dans des cas spécifiques; nous espérons que votre code de création de données et votre code araignée / transfert pourront être refactorisés dans des bibliothèques qui pourraient éventuellement être utilisées directement par les outils de création de contenu dans certains cas. Mais je ne ferais pas de cela mon premier objectif, nécessairement ... Sachez simplement que ce sera un objectif final et laissez cela influencer un peu votre conception, et optez d'abord pour les fruits bas.


En tant que mise à jour, vous pouvez envisager d'utiliser le format de fichier KTX pour les textures. Il a l'avantage d'être principalement «lu structet utilisé» pour la plupart des cas d'utilisation de GL (et d'après vos commentaires, il semble que vous visiez GL) tout en étant flexible et bien défini.

La surcharge de l'en-tête KTX peut être un peu élevée pour les données entièrement cuites, en fonction de votre cible, et vous voudrez peut-être renoncer à la prise en charge du swap endian, en fonction de votre cas d'utilisation ... mais cela vaut certainement au moins le coup d'œil pour des considérations de conception.

maigre
la source
Grand truc merci. Je n'avais jamais envisagé de créer mon propre format d'image facile à charger. Existe-t-il une bibliothèque de chargement de texture minimale déjà construite. Là encore, il s'agit essentiellement d'un flux d'octets avec une largeur, une hauteur et un codage (par exemple GL_RGB555).
deft_code
1
Ne construisez pas tant votre propre format d'image que d'obtenir l'image dans le format exact que DirectX, GL ou tout ce que vous utilisez. =) En ce qui concerne les bibliothèques: il y en a une tonne. Pour les outils, j'ai tendance à utiliser simplement les trucs de la bibliothèque ImageMagick ( imagemagick.org/script/index.php ) ou même les programmes ... Le code ImageMagick est old-school et un peu moche, mais assez rapide, flexible et routier -testé. Je suis sûr que d'autres auront beaucoup d'autres suggestions; si vous utilisez par exemple C # pour votre chaîne d'outils, beaucoup de ces choses seront déjà intégrées dans les bibliothèques .NET ...
leander
1
"Je suis sûr que d'autres auront beaucoup d'autres suggestions" MFC! :) Ou peut-être OpenIL. Je pense que l'un des points importants sur la cuisson des actifs dans des formats spécifiques à la plate-forme est que lorsque vous ajoutez plus de formats source et plus de plates-formes, le nombre de combinaisons explosera. La conversion des ressources source dans un format intermédiaire, puis leur conversion en formats spécifiques à la plate-forme, réduira le nombre de routes de conversion. Ajoutez un autre format source, écrivez simplement un convertisseur au format intermédiaire. Ajoutez une autre plateforme, ajoutez un boulanger au format cible de cette plateforme.
Chris Howe
1
J'ajouterais que garder la complexité en dehors du moteur ne signifie pas nécessairement que la fonctionnalité n'est pas disponible pour le moteur. Il est cependant essentiel de le garder séparé afin qu'il soit facilement séparé du moteur. Je ne saurais trop insister sur l'utilité de prendre en charge le chargement à chaud des actifs, c'est-à-dire le rechargement des choses à la volée. Cela peut aussi apporter beaucoup de complexité à votre système, alors vous voudrez vous assurer qu'il est construit de telle manière que le jeu n'a pas besoin de se soucier de la provenance des actifs.
dash-tom-bang
3

Vos questions semblent très subjectives et dépendent fortement de qui est votre public cible.

Prenons votre question d'analyse de police / ttf. Si vous prévoyez d'ajouter des modders à leur propre police, vous souhaiterez probablement effectuer le processus d'importation en quelques étapes seulement. Si vous ajoutez de nombreuses polices / tailles de police au jeu en interne, vous souhaitez peut-être un outil quelque peu sophistiqué qu'un artiste puisse utiliser avec un peu de formation. Si vous allez le faire une fois en interne, le temps que vous passerez à faire un bon importateur sera probablement moins que de prendre le temps d'écrire des outils pour les cas précédents.

C'est vraiment une question d'échelle avec tout le reste. Les outils intégrés valent la peine lorsque vous faites quelque chose de nombreuses fois et que vous souhaitez réduire la complexité / les bogues qui en résultent. Chaque qualificatif supplémentaire que vous ajoutez (c'est-à-dire les textures TGA uniquement au lieu d'importer, par exemple, des PSD) entraîne plus de temps passé par l'utilisateur final.

N'oubliez pas que les outils de contenu sont généralement utilisés par les moins enclins à la technique (lire: artistes). Personnellement, j'aime vraiment la façon dont Unity fonctionne où vous pouvez simplement faire glisser un fichier source (psd, 3ds, ttf, mp3, jpg, mov, peu importe) et il le convertira automatiquement dans son format interne. Le format interne est généralement caché à l'utilisateur final. Il se reconvertira également automatiquement lorsqu'il détectera la modification du fichier source. Mais c'est beaucoup de travail.

Tetrad
la source