STL pour les jeux, oui ou non? [fermé]


144

Chaque langage de programmation a sa bibliothèque standard de conteneurs, algorithmes et autres éléments utiles. Avec des langages tels que C #, Java et Python, il est pratiquement inconcevable d’utiliser ce langage sans sa bibliothèque standard.

Pourtant, dans de nombreux jeux C ++ sur lesquels j'ai travaillé, nous n’utilisions pas du tout la STL, n’en utilisions qu'une infime fraction, ou utilisions notre propre implémentation. Il est difficile de dire si c'était une décision judicieuse pour nos jeux, ou une décision prise simplement par ignorance du STL.

Alors ... est-ce que la STL convient ou pas?



1
Eh oui, c'est celui que je voulais dire par "utilisé notre propre implémentation". :)
magnifique

3
Si vous avez la possibilité de localiser et d’acheter des gemmes de la meilleure programmation de jeux, faites-le. Il existe un article intitulé "Utilisation de la STL dans la programmation de jeux" de James Boer, ArenaNet, dans lequel il décrit parfaitement l'utilisation de la STL.
Chiguire

En fait, utiliser Java sans sa bibliothèque standard est assez concevable, cela s'appelle J2ME: p
Bart van Heukelom

1
Bonne question!
Alan

Réponses:


191

À l'époque où je travaillais dans le développement de jeux professionnels, STL était trop immature et gonflé. Mais c'était il y a plus de 10 ans.

Maintenant, je travaille dans la simulation militaire, qui a des exigences de performances encore plus strictes (comme le framerate ne peut jamais descendre en dessous de certains FPS). Dans la simulation militaire, STL est utilisé partout.

Certaines personnes qui vous disent de ne pas utiliser STL utilisent l'argument selon lequel ce n'est pas toujours la solution parfaite ni même la meilleure solution au problème. Mais ce n'est pas une réponse à la question. La question devrait être la suivante: y a-t-il quelque chose qui cloche fondamentalement avec l’utilisation de STL dans les jeux? Je dirais que non, STL est la plupart du temps une meilleure implémentation que ce qu'un utilisateur propose lui-même.

Assurez-vous simplement de savoir comment utiliser la STL et utilisez-la dans votre jeu. Lisez quelques livres et examinez le code de mise en œuvre dans le STL que vous utilisez.


49
C'est un conseil plutôt solide. Le mème "STL is slow" ne l’est plus depuis au moins cinq ans et probablement plus longtemps. Cela va continuer à vivre, un peu comme le "Java est lent" et le ".NET est lent" un non-sens, jusqu'à ce qu'il soit évident pour tout le monde que ce n'est plus le cas. La STL vous aide à écrire de meilleurs programmes; J'irais même jusqu'à dire que le fait de ne pas l'utiliser, dans la plupart des cas (mis à part ces 0,1% quelque part), est irresponsable. (Les affirmations selon lesquelles cela ne correspond pas à un domaine de problème donné sont souvent davantage une mise en accusation de la façon dont le problème a été traité, et non du STL lui-même. Corrigez votre code, mes amis.)
Ed Ropple

5
@ Ed Ropple: Je pense que le problème n'est pas que STL ne correspond pas à un problème donné, mais bien qu'il règle trop de problèmes, ce qui rend le code trop complexe. Il est effrayant de voir comment les gens surutilisent STL et je pense que c’est l’une des raisons pour lesquelles tant de gens (y compris moi-même) s’abstiennent de l’utiliser du tout. Comme un exemple que j'ai vu il n'y a pas si longtemps, où la question était de savoir comment obtenir les plus grands nombres sur 3, une des réponses consistait à les pousser dans un std :: vector puis à std: le trier. C'est forcer une solution inutile à un problème très simple.
Simon

22
@ Simon: sauf votre respect, le dernier exemple est un signe d'extrême dénuement et n'a rien à voir avec STL ... cette personne ferait la même chose dans n'importe quelle autre langue avec des listes pouvant être triées. C'est sa pensée qui est cassée.
ggambett

@EdRopple essaie d'implémenter un analyseur STL pour les fichiers image PPM (moins de 100 lignes de code au total si l'on ne cible que P6 ou P3). La moitié du code résultant sert uniquement à sauter des lignes de commentaires, car STL ne fournit pas quelque chose commeif(stream.nextCharacter() == '#') stream.skipLine();
GameDeveloper

@DarioOO Je ne connais pas ce format de fichier, mais c'est à quoi servent les adaptateurs de flux et les filtres. J'avais écrit ce commentaire il y a cinq ans, bien sûr (et il revient parfois!), Mais aujourd'hui, j'écris sur tout ce qui n'est pas super, super perf-critique dans un style fonctionnel, basé sur la transformation, et des problèmes comme celui décrivons tomber du problème. Le nombre de lignes (et l’OMI ne devrait pas vous intéresser) ne m’intéresse pas vraiment, mais l’importance de la mise en œuvre, de la clarté, des performances, puis de la longueur du code, par exemple.
Ed Ropple

63

Je dirais que, de mémoire, il est préférable d’utiliser la STL à moins que vous ne sachiez exactement pourquoi vous ne voulez pas l’utiliser.

Voici la chose à propos de la STL: elle est développée par des personnes plus intelligentes que vous. Ce n'est pas destiné à être offensant ou quoi que ce soit, c'est simplement que le STL est développé par des personnes dont le travail est réellement de construire le STL. Elle sera à peu près aussi rapide que la plate-forme le permettra et sera généralement beaucoup plus robuste qu'une solution maison (et cela devrait être aussi une préoccupation sinon plus que de se soucier de la vitesse brute - parce que votre jeu a besoin robustesse un peu plus que vous avez besoin de vitesse, le dernier est sans signification sans l'ancien.

Les plaintes selon lesquelles le TSL impose une "vision étroite du monde" me paraissent un peu ridicules. Ce sont des conteneurs. Ils ont un ensemble d'opérations limité car les conteneurs ont des ensembles d'opérations limités. Que faites-vous qui ne concorde pas avec cela?


4
Je ne pense pas que quiconque devrait avoir à justifier pourquoi il ne devrait pas utiliser STL. Aussi, n'acceptez pas l'argument "utilisez-le parce qu'il est plus intelligent que vous". STL a été conçu autour d' une vue spécifique d'un domaine de problème, non seulement des conteneurs -à- dire des algorithmes, allocataires, itérateurs, traits , etc. C'est assez juste , mais ce n'est pas la seule façon de regarder ce domaine problème
Zebrabox

2
Donc, vous préférez du code fait maison que du code généralement robuste et éprouvé? Le domaine du problème n’est pas si différent d’un projet à l’autre (à part peut-être des projets intégrés - même les consoles ont des implémentations STL décentes de nos jours!). Peu importe le jeu, votre problème n’est tout simplement pas si différent, et si vous créez quelque chose que vous souhaitez envoyer, vous avez la responsabilité implicite d’écrire du code robuste. La réimplémentation de la roue va-t-elle améliorer la robustesse et la flexibilité? Je me penche vers "non". Le fait que ce ne soit pas le "seul moyen" n'implique pas que ce n'est généralement pas supérieur.
Ed Ropple

20
Je dirais que gamedev consiste à créer des jeux , mais d'accord. Si vos hypothèses sont si médiocres que l’on s’attache à ce type d’allocation de ressources, alors oui, vous devez prendre du recul et les réévaluer. Mais vous pouvez également créer des applications extrêmement rapides qui utilisent la STL - et, bien sûr, toute autre implémentation - lorsque vous savez réellement ce que vous faites . Apprenez ce que vous faites> engendre un refus du STL. Personne n'a dit que le TSL était toujours la meilleure réponse. Ce que je dis, c'est que si vous ne pouvez pas expliquer pourquoi ce n'est pas la meilleure solution , vous devriez utiliser le STL.
Ed Ropple

11
Je ne pense pas que ce soit provocateur du tout - c'est formulé de manière à le faire rester dans la mémoire de quelqu'un, mais c'est une position extrêmement conservatrice et directe. En bref: les personnes qui développent le TSL sont plus informées et mieux équipées que quelqu'un qui se voit obligé de poser cette question. Si vous devez demander à quelqu'un d'autre si le STL est approprié ou non, il vous manquera presque certainement de connaissances spécifiques à un domaine pour préparer de manière adéquate une solution personnalisée.
Ed Ropple

4
"Cela va être à peu près aussi rapide que le permet la plate-forme". Ceci est un mensonge définitif, car de nombreux éditeurs de compilateurs ne se gênent pas pour réécrire la STL afin qu’elle optimise les performances de l’architecture en question. STL n'a aucune garantie quant aux caractéristiques de performance, à l'exception du grand O. O, mais pourrait être aussi efficace ou inefficace que le fournisseur du compilateur ne le souhaite.
Kaj

35

J'ai vu très peu de raisons de ne pas utiliser la STL pour les jeux.

Pour les problèmes d'allocation de mémoire, beaucoup de gens ne le savent pas, mais vous pouvez écrire des allocateurs personnalisés pour vos classes de conteneur STL. Les affectateurs sont essentiellement des classes de stratégies que vous transmettez dans vos modèles pour déterminer comment les attributions sont effectuées. En les utilisant, vous pouvez généralement contourner les problèmes de mémoire qui posent problème sur la plate-forme de votre choix.

Bien sûr, si vous utilisez la STL et faites des choses idiotes, telles que des cartes de chaînes de caractères de grande taille, sans type de pointeur, vous avez de plus gros problèmes.


En fait, utiliser de grands types de non-pointeurs dans map est un bon exemple d'utilisation, car les cartes stdlib ont pour obligation de ne pas invalider les itérateurs, ce qui oblige l'implémentation à utiliser des pointeurs et des éléments mappés individuellement. La meilleure solution pour les jeux est d'utiliser google::sparse_mapou d'écrire ses propres.
v.oddou

pourquoi pas carte dense?
GameDeveloper

23

La LIST par défaut présente de nombreux problèmes qui rendent son utilisation difficile avec les jeux, en particulier en ce qui concerne l’alignement de la mémoire.

Une variante personnalisée telle que la EA STL est spécialement conçue pour les jeux et peut vous permettre d’améliorer les performances de la mémoire et la convivialité de la console. Il est devenu open source en 2016, sous une clause BSD-3, avec un référentiel sur GitHub .


19
Les problèmes d'utilisation de la mémoire et des jeux de STL peuvent généralement être résolus avec des classes d'allocateur personnalisées. En effet, dans mon travail précédent, notre classe de vecteurs "personnalisée" n’était qu’un mince emballage autour de std::vectorcelui qui remplaçait l’allocateur par défaut.
Blair Holloway

1
@Blair Holloway: "Les allocateurs personnalisés sont basés sur des classes et non sur des instances. Ils sont nécessaires pour construire et détruire des objets, ainsi que pour les allouer. Ceci oblige à mélanger deux concepts distincts: l'allocation et la construction. les problèmes avec stl-allocators, malheureusement. " EA STL donne plusieurs autres raisons valables pour lesquelles les allocateurs STD sont mauvais. Ce n'est pas seulement "qu'ils puissent ou non être remplacés".
Simon

@Simon - Je ne dirai pas que le système d'allocateur de la STL est parfait, car il ne l'est pas. Il nous a fallu beaucoup de temps pour trouver une solution qui fonctionne. Ce que je dis, c’est que dans certains cas, il est possible d’obtenir une solution pratique et conviviale en utilisant STL et un peu de travail avec des allocateurs personnalisés.
Blair Holloway

@Simon - Pour en dire plus: même si la STL peut être encombrante, c'est un morceau de code très bien testé et exempt de bogues; si vous pouvez l'utiliser, vous gagnerez des heures de travail en déboguant une solution personnalisée. Mon travail actuel évite le STL en faveur des allocateurs fabriqués à la maison et j'ai dû passer du temps à déboguer et à refactoriser une partie de ce code, car il n'a pas le même niveau de maturité que le STL.
Blair Holloway

1
@Simon: Je suis un peu en retard à la fête ici, mais je suis curieux de savoir si vous voudriez donner un exemple spécifique de ce que vous entendez par là. Quel est le bon exemple de la résolution d’un problème spécifique d’une manière que le TSL est trop générale pour le résoudre efficacement?
Braffle

21

Voici ce que Mike Acton (directeur des moteurs chez Insomniac Games de Spyro the Dragon, de Ratchet & Clank et de la renommée de Resistance) avait à dire à ce sujet lorsqu'il a été interrogé ici . Notez qu'il a été interrogé sur STL et Boost en général en ce qui concerne l'utilisation dans le développement de jeux.

STL / Boost, appartient-il à gamedev? Si seulement des parties, lesquelles?

Vous parlez de deux choses différentes ici, non? STL et Boost, séparément. Mais en réalité, ma réponse est la même: il n’ya rien de mal à l’un ou l’autre, mais je décourage leur utilisation. L' utilisation de l' une encourage les gens à adapter une solution à un problème plutôt que de trouver une solution à un problème. La solution doit toujours être adaptée aux données disponibles, aux contraintes matérielles, etc. STL et Boost ont une vision extrêmement étroite du "monde" et leur utilisation appropriée est limitée. Vraiment, je les décourage, car ils guident tout de suite les programmeurs dans la mauvaise direction. Je dis souvent que si vous sentez que vous en avez besoin, vous ne comprenez probablement pas vraiment le problème que vous rencontrez.

J'ai également remarqué que la plupart des développeurs de jeux professionnels se tournent davantage vers le C que vers le C ++.


18
Je suis en désaccord sur les efforts plus tournés vers C. La grande majorité des développeurs de jeux ainsi que des rédacteurs de SDK utilisent le C ++. En fait, le dernier grand utilisateur C était id et même Carmack est passé au C ++ maintenant ...
Goz

82
Le commentaire de M. Acton semble incomplet. De manière générale, le TSL convient parfaitement à ces problèmes. Si vous essayez de faire quelque chose de telle sorte que l'approche STL semble "fausse", c'est probablement une très bonne idée de réévaluer votre approche et de voir si vous le faites réellement de manière intelligente. D'après mon expérience, le plus souvent, vous ne l'êtes probablement pas. (Il est beaucoup plus intelligent, OMI, de résoudre un problème en le comprenant bien dans le contexte de vos outils plutôt que de le jeter juste pour le refaire à nouveau.)
Ed Ropple

50
Mon expérience avec STL a été presque opposée. C'est efficace et rapide. Si vous ressentez le besoin de lancer votre propre bibliothèque de modèles ou votre propre bibliothèque de conteneurs, c'est très bien. Mais ne prétendez pas que le TSL (ou le boost, d'ailleurs) est mauvais. J'ai beaucoup utilisé STL sur des jeux commerciaux pour iPhone, Nintendo DS, Wii, PC, Mac et Xbox. Chaque fois que j'ai été obligé d'utiliser la "meilleure" bibliothèque de quelqu'un d'autre, je l'ai trouvée manquante et défectueuse.
Braffle

5
Cela fonctionne aussi bien sur la DS que sur toute autre plate-forme sur laquelle je l’ai utilisée. J'ai utilisé STL dans le code de l'interface utilisateur et du code AI. Le jeu était ds.ign.com/articles/832/832147p1.html . Je travaillais dans un petit studio qui faisait partie d'Amaze, qui faisait partie de la Fondation 9.
BRaffle

7
Mike est tout au sujet des données. L'examen des données suggère la meilleure méthode pour transformer les données. Appliquez-le à grande échelle et vous avez la programmation. Dans ce contexte, ses critiques ont beaucoup de sens. STL (et les modèles de conception) suggèrent que plutôt que d'examiner les données pour trouver une solution, nous examinons les solutions proposées dans notre boîte à outils pour en trouver une qui fonctionne avec les données. Je ne veux pas parler au nom de Mike, mais je crois qu'il suggérerait que cette approche du problème est arriérée et peut potentiellement conduire à des solutions inefficaces ou gonflées.
Dan Olson

19

Si vous vous retrouvez en train de réécrire quelque chose qui existe déjà dans la STL, arrêtez pour une raison quelconque . Utilisez le STL.

La STL a été optimisée au fil des années d'analyse et de temps, et il y a fort à parier que vous n'écrirez probablement pas quelque chose qui soit plus efficace. Cela ne veut pas dire que vous devriez utiliser STL là où une solution plus simple peut être possible (par exemple, utilisez un tableau lorsque vous avez un nombre connu de choses, pas une liste stl :: list), mais si vous écrivez votre propre implémentation d'une carte ( la structure de données de base, pas une carte du monde du jeu), vous le faites mal.


7
map <> n’est presque jamais ce que vous voulez utiliser pour une mémoire ou un processeur efficace dans le contexte d’un jeu. hash_map <> est presque toujours un meilleur choix, bien que les performances de hash_map diffèrent considérablement d'un fournisseur à l'autre. Si vous créez un jeu destiné à la console ou à un jeu en réseau évolutif, STL peut être trop lent ou trop lourd pour vos besoins.
Ben Zeigler

3
Unordered_map <> est maintenant largement disponible et impose des exigences de performance extrêmement strictes dans le brouillon actuel TR1. (Au point de spécification excessive, je pense - cela interdit même le hachage à l'air libre, et bien que cela soit généralement plus lent, je ne pense pas que cela devrait être totalement interdit par la norme.)

5
La STL propose des algorithmes ainsi que des conteneurs. Il n'y a jamais de raison de ne pas utiliser la version stl d'un algorithme. Par exemple, std::sortutilise généralement un introsort dessous, suffisamment rapide et complexe pour ne pas vouloir le faire soi-même.
deft_code

la vérité est unordered_mapsoit de C ++ 11, soit que les boosters sont trop lents, vous voulez une carte de hachage d'adresse ouverte, telle que google :: sparse_map ou la vôtre.
v.oddou

16

Est-ce que STL convient aux jeux? Absolument. Les jeux sont des logiciels complexes, la STL fournit des fonctionnalités qui aident à gérer la complexité, donc c'est bien.

Est-ce un bon choix pour votre plate-forme? Pas nécessairement. Si vous écrivez pour une console, vous devez faire très attention à l'utilisation de la mémoire et du cache. La STL ne rend pas cela très facile.

Je pense que trop souvent, nous confondons les "jeux" avec les "jeux haute performance en temps réel fonctionnant sur du matériel embarqué ou sur mesure", mais il est important de faire la distinction. Si vous écrivez un jeu Windows qui n'essaie pas de fonctionner en plein écran à une cadence constante de 60 images par seconde, il n'y a aucune raison d'éviter les outils fournis par la bibliothèque standard.


10

Je sais que la soirée a pris beaucoup de retard, mais le temps change et les réponses restent. C ++ 11 a des changements radicaux, dont beaucoup sont destinés à améliorer les performances de C ++ et de la bibliothèque standard. Il semble que ceux qui n'utilisent ni le STL ni le Boost, ont tendance à ne pas suivre les nouvelles normes non plus, laissant les solutions filées à la maison sans améliorations importantes, bien sûr, ce n'est pas toujours le cas.

J'ai utilisé STL sur tous les projets du milieu des années 90 à aujourd'hui, à l'exception d'un court laps de temps chez EA. Je pense que le parti anti-STL avait des raisons peu rationnelles de ne pas l'utiliser. Ceux-ci sont en grande partie partis. Les allocateurs personnalisés sont une solution, l’utilisation de la réserve en est une autre, et ne pas passer les choses par valeur en est une troisième, mais elles sont assez simples et tout programmeur devrait les connaître. Plus important encore est l'utilisation d'algorithmes. Les rédacteurs du compilateur savent exactement ce que fait un for_each () et peuvent optimiser le code. Cela ne peut pas se produire avec une boucle roulée à la maison. for_each () sur un objet const est encore mieux. Microsoft optimise for_each de nombreuses manières, y compris la sérialisation. Ils ont également la bibliothèque AMP qui a parallel_for_each (). Si vous en avez l'occasion, parlez-en aux ingénieurs du compilateur. Les compilateurs de la console vont optimiser ce qui est utilisé, alors C'est un problème de poule et d'oeuf. Microsoft utilise beaucoup de C ++ 11 et la prochaine XBox ne sera pas différente. Je n'ai aucune idée de la PS4, nous n'en avons pas encore.

Les allocateurs personnalisés sont un moyen de traiter le problème de mémoire, mais une autre option (souvent négligée) consiste à utiliser les classes new et delete. Des augmentations de performances énormes peuvent être obtenues de cette façon.

La notion que Boost et STL ont une vision étroite de la résolution de problèmes est de la pure folie. Je suis stupéfait de voir combien de choses dans le TSL et dans Boost peuvent être personnalisées à l'aide de traits et de règles. Recherchez un exemple de comparaison de chaîne indépendante de la casse.

En ce qui concerne les temps de liaison longs et le gonflement du code, le nouveau modèle extern devrait vous aider. En général, les longs temps de compilation sont dus à un couplage excessif et à une mauvaise utilisation de pch.

La raison la plus convaincante d’utiliser STL au-dessus de l’animal domestique est que des millions de personnes peuvent vous aider à utiliser le STL. Comme toujours, n'optimisez pas prématurément et testez, testez, testez.


idées intéressantes; qu'entendez-vous par " utiliser la classe nouvelle et supprimer "? Vous voulez dire, accélérer un processus en utilisant des objets déjà sur le tas?
johnbakers

9

C'est un sujet brûlant dans le développement de jeux. Personnellement, je ne le recommande pas, sauf peut-être pour EASTL, comme mentionné ci-dessus. J'ai deux problèmes principaux avec STL (techniquement, "La bibliothèque standard C ++", car STL n'est plus son nom) dans les jeux. 1) L’allocation dynamique de mémoire gaspille souvent beaucoup de temps d’exécution dans les jeux lorsque STL est utilisé. 2) L’utilisation de STL encourage une approche de l’architecture de jeu basée sur un ensemble de structures, alors qu’une approche basée sur une structure de tableaux est beaucoup plus conviviale pour le cache.


Comme indiqué précédemment, vous pouvez fournir des allocateurs personnalisés aux classes de conteneur. Ceux-ci peuvent utiliser des listes indépendantes si vous le souhaitez (tableaux préalloués). Le tableau de structures vs la structure de tableaux dépend beaucoup de ce que vous essayez de faire - il n’existe pas de règle absolue en ce qui concerne celle qui est meilleure.
Skizz

J'apprécie votre remarque selon laquelle il est important de bien comprendre le problème que vous résolvez. Mais avec tout mon respect, je pense toujours que je ne suis pas d'accord avec votre conclusion. Chaque problème a des modèles d'utilisation qui ne peuvent pas être exprimés aux allocateurs STL personnalisés, mais peuvent être facilement exploités dans un conteneur personnalisé, tel qu'un allocateur à bloc fixe implémenté avec un tableau à plat. Et appliquer une transformation fixe sur un tableau de types homogènes se traduira très probablement par une cohérence de mémoire cache bien meilleure que par une itération sur un vecteur de types polymorphes et par l’appel de méthodes virtuelles.
Terrance Cohen

5

Ça dépend. Quelle est la taille du projet, sur quelle (s) plate-forme (s) et quel est le calendrier?

Si vous travaillez sur un projet de grande envergure, sur des plates-formes aux ressources limitées, avec un échéancier et un budget importants, épargnez-vous beaucoup de problèmes en évitant l'inévitable enfer qui consiste à rechercher dans un demi-million de codes de lignes jonché de STL, ne peut pas conserver un framerate supérieur à 30, consomme suffisamment de RAM pour stocker plusieurs ressources et prend 2 heures pour le créer.

Dans d’autres situations, STL et même Boost peuvent être très utiles lorsqu’ils sont appliqués correctement. J'ai travaillé sur des titres qui utilisaient une sélection de STL / Boost et constituaient un rêve absolu pour le codage: moins de bugs / fuites et une maintenance facile du code signifient plus de temps pour coder de nouvelles fonctionnalités! Pour les projets de loisir en particulier, c'est une victoire énorme pour le service de la motivation.

Savoir quand échanger la performance pour plus de commodité!


1
"Savoir quand échanger la performance pour plus de commodité". Oui. Cette phrase à elle seule est une aussi bonne réponse que n'importe laquelle. Déterminez ce que vous devez réaliser avec votre jeu, consultez des pairs et décidez si STL vous aidera ou non à y parvenir. Je dirais que si vous ne souhaitez pas placer la barre plus haut pour les graphismes et les performances de la prochaine génération avec votre jeu, STL vous aidera probablement.
gkimsey

4

IMHO Je dirais que c'est un bon choix, car STL fonctionne déjà bien et est optimisé pour les tâches pour lesquelles il est conçu. De plus, vous travaillez sur un jeu, alors utilisez les outils à votre disposition qui vous simplifient la vie et réduisent le risque de code pour les bugs.

Pourquoi se donner la peine de réinventer la roue alors que vous pouvez travailler sur quelque chose comme l'IA du jeu, l'expérience utilisateur, ou mieux encore; tester et déboguer?


2
En pratique, vers la fin d'un projet, la performance tend à être un problème critique. Si vous utilisez STL, vous avez très peu de possibilités d'optimisation car cela prend vos applications spécifiques et les résout de manière générale. La résolution de cas spécifiques de manière spécifique (et sans allocation de mémoire dynamique) est presque toujours plus performante.
Terrance Cohen

2
Mais si vous ne voulez pas d'allocation de mémoire dynamique, vous ne devriez pas utiliser la STL. C'est en quelque sorte le point. Votre propre code ne va pas être meilleur, et pourrait certainement être bien pire. La décision de conception d'abuser du STL est le problème ici, pas le STL, ses capacités ou ses caractéristiques de performance. Vous vous attaquez à la mauvaise partie du problème.
Ed Ropple

4

STL convient parfaitement aux jeux, à condition de bien le comprendre. Notre moteur en fait un usage intensif et cela n'a jamais été un problème. Je n'ai aucune expérience du développement sur console, ce qui est peut-être une histoire totalement différente, mais il est bien pris en charge sur toutes les plates-formes PC (Windows / Mac / Linux).

La chose la plus importante est de comprendre quelles sont les forces et les faiblesses de chaque type de conteneur et de choisir le conteneur approprié pour le travail que vous effectuez.


4

Mon ancien employeur a abandonné l'utilisation d'un ensemble robuste de classes de conteneurs personnalisés au profit de STL. Les temps de construction ont augmenté et la facilité de débogage a été réduite de manière significative. Si nous étions partis de zéro, STL (peut-être mieux utilisé) aurait probablement eu un sens, mais il ne m'a jamais été clair que nous aurions gagné quoi que ce soit en passant à STL qui justifierait de jeter du code fonctionnel, rapide et débogable.

Pour mes projets personnels, si STL convient ou pas dépend du projet. Si j'essaie de faire un travail optimisé basé sur les données, l'optimisation de la mémoire et du cache de Mike Acton, je penserai au moins à la création de mes propres structures de données personnalisées. Si je prototype des algorithmes ou un gameplay et que je ne me soucie pas des performances, de l'évolutivité, de la plate-forme cible, etc., je récupère automatiquement STL.


4

Mes 2 cents sur ce point est que la STL fonctionne très bien. J'ai développé un moteur de jeu en 3D (pas de qualité AAA, mais assez avancé - types d'entités scriptés, rendu différé, physique Bullet intégrée) pour PC et je n'ai pas encore vu les conteneurs devenir le principal goulot d'étranglement. Une utilisation incorrecte des API 3D et de mauvais algorithmes ont été les meilleures cibles (déterminées par le profilage!) Chaque fois que j'y suis allé et que j'essayais d'obtenir un peu plus de performances.


3

J'ai construit des jeux en utilisant STL et je l'aime bien, et il semble bien performer.


3

Bonne question! Une question plus spécifique est de savoir quelles sont les exigences communes d’un jeu qui ne peuvent pas être satisfaites avec STL et Boost.

D'après mon expérience, les limites de mémoire limitées du matériel de la console font de tout type de conteneur de taille dynamique une idée fausse, quel que soit le niveau de sophistication de votre allocateur personnalisé. Les conteneurs qui n'ont pas de limite volontaire encouragent les programmeurs à écrire du code qui ne limite pas les limites de leurs ensembles de données. En fonction d'innombrables variables difficiles à suivre, vous pouvez dépasser vos limites de mémoire. J'ai l'impression que c'est l'une des principales causes d'instabilité dans les jeux modernes.

De plus, une utilisation excessive de modèles peut entraîner des temps de compilation très longs dans une base de code volumineuse et gonfler la taille de votre exécutable de sorte qu'il ne rentre plus dans le cache d'un noyau auxiliaire sur un ps3, par exemple.

Cependant, pour le développement uniquement sur PC, je pense que STL et Boost sont très bons. Bien que les solutions générales ne soient pas toujours idéales, elles sont souvent suffisantes. Votre première solution à un problème n’est presque jamais idéale et vous améliorez ou remplacez les insuffisances jusqu’à ce qu’il soit suffisamment bon.


2

La STL convient parfaitement à votre jeu si la STL convient parfaitement à votre jeu.

Comme pour tous les choix technologiques faits au cours du développement, vous devez peser le pour et le contre. Est-ce que rouler dans ma propre bibliothèque me donnera une utilisation de la mémoire, des performances et une productivité plus bénéfiques que d'utiliser simplement le STL? Peut-être; Cependant, il est tout aussi facile de créer une vectorimplémentation utilisant plus de mémoire, plus lente et nécessitant une maintenance importante pour rester fonctionnelle par rapport à ce qui existe déjà.

Les gens ne devraient pas éviter d'utiliser la STL dans leurs jeux, car d'autres personnes évitent d'utiliser la STL dans des jeux; ils devraient éviter de l'utiliser s'ils ont pesé toutes leurs options et s'ils sont sincèrement convaincus qu'une autre mise en œuvre améliorera la qualité de leur produit.


2
Je suis tout à fait d'accord avec la dernière partie de votre commentaire, mais j'irais même plus loin: si vous pouvez démontrer de manière concluante pourquoi le TSL n'est pas une bonne option, n'utilisez pas le TSL. Sinon, fais. Le culte de la cargaison (de "oh, les développeurs de jeux utilisent le C ++!" À "oh, les développeurs de jeux n'utilisent pas la STL!") Est malsain. Votre deuxième paragraphe me poserait toutefois un problème: il est plutôt improbable que des personnes qui soient encore assez naïves pour penser que réimplémenter le STL soit une bonne idée en construiront un meilleur vectorque les gens du STL. Au moment où vous pouvez le faire, vous ne pensez plus que vous devez le faire! :-)
Ed Ropple

2

Comme pour la plupart des questions, la réponse n’est jamais "oui ou non", en noir ou en blanc. STL est un bon choix pour certains problèmes, son utilisation pour ces problèmes devrait bien se passer. C'est une erreur de supposer que c'est inutile, mais c'est aussi une erreur de supposer qu'il convient de l'utiliser dans toutes les situations.

L'allocation de mémoire est le principal problème à surveiller lors de l'utilisation de STL dans le développement de jeux. Les allocateurs par défaut de STL ne semblent pas bien s'intégrer aux stratégies d'allocation préférées pour le développement de jeux. Bien sûr, des allocateurs personnalisés peuvent être utilisés, mais cela rend l'idée moins attrayante si vous envisagez d'ajouter ou non STL à une base de code non-STL.

Ajoutez à cela que si votre base de code est non-STL, il est possible que personne ne soit assez familier avec les concepts de STL ou de modèles pour implémenter correctement les allocateurs personnalisés.


2

Je pense que cette discussion peut se résumer comme suit:

code médiocrement écrit spécifique à l'application <code d'usage général bien écrit <code spécifique à l'application bien écrit

Quiconque dont la solution locale tomberait dans la catégorie 3 connaît sûrement la réponse à la question initiale pour son problème particulier. Le TSL entre dans la catégorie 2. Donc, pour quelqu'un qui a besoin de poser la question «Devrais- je utiliser le TSL», la réponse est probablement oui.


2

STL convient parfaitement à un PC, car son système de mémoire virtuelle évolué rend la nécessité d’une allocation de mémoire prudente un peu moins cruciale (même s’il faut tout de même être très prudent). Sur une console, avec des ressources de mémoire virtuelle limitées ou inexistantes et des coûts de mémoire cache exorbitants, il est probablement préférable de ne pas écrire de structures de données personnalisées dotées de modèles d’allocation de mémoire prévisibles et / ou limités. (Et vous ne vous tromperez certainement pas en faisant la même chose sur un projet de jeu sur PC.)


1

Je pense que cette question est vraiment une grande question non posée - devrais-je utiliser X dans mon Y ? Et la seule façon de vraiment y répondre est de l'essayer soi-même. Pour chaque personne trouvée qui dit que X fonctionne très bien, vous trouverez quelqu'un qui dit que c'est horrible. Et tous deux ont raison - pour leur projet.

L'avantage des logiciels, contrairement à la plupart des autres disciplines, est que vous pouvez toujours changer les choses plus tard si vous trouvez que cela ne fonctionne pas comme vous le souhaitez. Vous découvrez plus tard que STL ne travaille pas pour vous dans ce projet? Arrache-le, mets quelque chose d'autre à sa place. Vous n'aimez pas la façon dont vous avez divisé les tâches entre vos objets? Refactor. Vous n'aimez pas que vous avez utilisé des objets? Remplacez-les par des méthodes droites en C. Vous n'aimez pas tout ce qui est stocké dans des structures et des méthodes pour les manipuler? Remplacez-les par des objets C ++.


1
Bien que vous ayez raison, la refactorisation peut être très pénalisante. prendre une décision éclairée au lieu d’arbitraire vous permettra de gagner du temps à long terme.
Alan

1

Je dis non à la STL. Ma raison est assez simple:

  1. Vous n'avez pas besoin de la STL pour écrire des jeux. Pas même les grands.
  2. STL augmente considérablement votre temps de compilation.
  3. Un temps de compilation important réduit le nombre d'itérations sur votre développement.

Je considère que le nombre d'itérations est de la plus haute importance. Je me tiens donc à l'écart du STL et de toute autre technique de développement qui ralentit les itérations (comme l'architecture pour le plaisir ou les langages de script qui doivent être compilés).

Des itérations coûteuses conduisent à d'énormes équipes de développement composées de personnes qui essaient de faire avancer les choses avec très peu de choses en réalité. Je l'ai vu et entendu, et l'un des coupables semble être la compilation des bibliothèques de modèles.


1
Je suis d'accord sur les temps de compilation. Tout temps de compilation important double la quantité de travail perdue; Par exemple, si la compilation dure 5 minutes, vous passerez 10 minutes à prendre un café à chaque fois. ;)
Ipsquiggle le

Bien que je vois les deux côtés de cet argument, je dois dire que je suis entièrement d'accord avec votre argument, Richard. +1
Ingénieur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.