Pourquoi les développeurs de jeux C ++ n'utilisent-ils pas la bibliothèque boost? [fermé]

81

Donc, si vous passez du temps à regarder / répondre aux questions sur Stack Overflow sous la balise C ++, vous remarquerez rapidement que presque tout le monde utilise la bibliothèque boost ; certains diront même que si vous ne l'utilisez pas, vous n'écrivez pas du "vrai" C ++ (je ne suis pas d'accord, mais ce n'est pas le propos).

Mais il y a ensuite l'industrie du jeu, qui est bien connue pour utiliser C ++ et non pour utiliser boost. Je ne peux pas m'empêcher de me demander pourquoi. Je ne me soucie pas d’utiliser boost parce que j’écris (à présent) comme un passe-temps, et une partie de ce passe-temps consiste à mettre en oeuvre ce dont j'ai besoin quand je le peux et à utiliser des bibliothèques standard lorsque je ne le peux pas. Mais c'est juste moi.

Pourquoi les développeurs de jeux, en général, n'utilisent-ils pas la bibliothèque boost? Est-ce une question de performance ou de mémoire? Style? Autre chose?

J'étais sur le point de poser cette question lors d'un débordement de pile, mais je me suis dit que la question était mieux posée ici.

MODIFIER :

Je me rends compte que je ne peux pas parler pour tous les programmeurs de jeux et que je n'ai pas vu tous les projets de jeux, je ne peux donc pas dire que les développeurs de jeux n'utilisent jamais boost; c'est simplement mon expérience.

Permettez-moi de modifier ma question pour demander également, si vous utilisez boost, pourquoi avez-vous choisi de l'utiliser?

James
la source
2
Serait-il juste de dire que «Boost» est une collection de bibliothèques beaucoup trop vaste pour faire de «use boost» ou de «ne pas utiliser de boost» un choix juste? Même Google se limite à un petit sous-ensemble de "boost" dans leurs standards, je crois.
Dan Olson
Les binaires du jeu sont déjà assez volumineux.
Légion
3
@Tetrad STL n’est pas un boost, et STL est très utilisé dans gamedev.
rootlocus
7
Je ne vois vraiment pas où la question est "non constructive", il faudrait expliquer.
v.oddou

Réponses:

42

Certains développeurs en ont, d'autres non (dans les jeux et ailleurs). Cela dépend des besoins / exigences de ces développeurs et de la technologie existante à exploiter.

Bibliothèque standard de C ++ est souvent donné le même traitement, et les gens se demandent souvent la même chose que vous vous interrogez sur ce , aussi. La plupart des raisons sont similaires, par exemple:

  • Un développeur peut déjà disposer d'une bibliothèque de fonctionnalités interne fournissant les mêmes services que la bibliothèque standard ou Boost. De telles bibliothèques internes ont souvent été écrites il y a longtemps, lorsque le support d'implémentation de la bibliothèque standard était faible et que Boost était pratiquement inexistant, il a donc fallu les écrire plus ou moins . Dans ce scénario, il n’est généralement pas utile de s’éloigner de la fonctionnalité interne: c’est un effort de transfert important qui déstabiliserait beaucoup de code et ne procurerait pratiquement aucun avantage.

  • Un développeur peut travailler sur des plates-formes où la prise en charge par le compilateur des techniques C ++ avancées exploitées par Boost n'est pas bien prise en charge, de sorte que le code Boost ne compile pas du tout ou fonctionne assez mal. Ceci s'applique également à la bibliothèque standard, bien que beaucoup moins de nos jours.

  • Boost et la bibliothèque standard du langage ont une utilité générale, et même si cela convient à la plupart des applications, un développeur a parfois des besoins spécifiques qui peuvent être mieux pris en charge par des conteneurs plus spécialisés.

Je pense que ce qui précède sont deux raisons raisonnables, bien qu’il y en ait certainement d’autres. Vous devez cependant faire attention, car de nombreuses raisons pour éviter Boost, les bibliothèques standard, ou tout ce qui en découle, se résument à un syndrome "pas inventé ici", ce qui peut indiquer que la raison n'est pas très bien fondée sur les réalités pratiques.

Rappelez-vous également que les besoins d'un studio de grande taille sont généralement très différents de ceux d'un développeur individuel. Par exemple, un développeur individuel a probablement moins de code hérité à gérer et donc le transfert depuis une version locale de la fonctionnalité Boost ou de la bibliothèque standard ne sera pas aussi long et vous éviterez que ce développeur ait à maintenir ce code aussi largement dans le futur - invalidant ainsi mon premier point.

En fin de compte, il s’agit d’évaluer vos besoins et votre temps de travail par rapport à votre objectif souhaité et de déterminer quelle option répond le mieux à vos besoins. Les développeurs qui n'utilisent ni Boost ni la bibliothèque standard l'ont généralement fait et sont parvenus à cette conclusion - vous le ferez peut-être aussi, et peut-être pas.

Josh
la source
2
Autre point - certaines entreprises n'utilisent pas Boost en raison de son impact négatif sur la vitesse de compilation dans un environnement de développement très interactif.
Steven
27

Modifier Revenant à cette question après quelques années
Ayant continué à utiliser de plus en plus de bibliothèques boost, j'ai pensé mettre à jour cette question afin de vous expliquer pourquoi vous devriez utiliser boost lorsque la description du produit correspond à la fonctionnalité souhaitée. Cela convaincra même les non-sayeurs. Téléchargez openSSL et essayez de créer une application cliente et serveur. Maintenant, essayez de faire en sorte que cela fonctionne sur toutes les plateformes. Ensuite, téléchargez et utilisez boost :: asio :: ssl pour créer la même application. Si vous n'êtes pas convaincu que boost constitue le bon endroit pour rechercher du code multiplateforme propre, bien optimisé, examiné par les pairs, cet exercice simple vous convertira.

Tl; dr version:

À mon avis, vous ne voyez pas une tonne d'entreprises de développement indépendantes ou de petite à moyenne taille utiliser boost, car c'est une bête sauvage massive et puissante qui n'est pas facile à apprivoiser et vous êtes fondamentalement autonome lorsque vous essayez d'apprendre comment pour l'utiliser. La documentation manque de plusieurs manières (voir version longue) et "la communauté" autour du projet semble manquer, être dispersée ou être inactive (par rapport à d'autres projets).

Version très longue:

je me rends compte qu'il existe déjà une réponse acceptée, mais en tant que personne qui utilise réellement boost dans presque tous les projets que je fais, je pensais poster une réponse.

Je me souviens de la première fois où je me suis mis à bricoler et honnêtement, je ne savais absolument pas ce qui se passait. Boost n'est pas très bien documenté du tout. Les gens pourraient être en désaccord avec moi sur ce point, j'en suis sûr, car il y a des tonnes d'extraits de code d'exemple et de commentaires, etc., mais c'est très froid et vague, de même qu'il est difficile de s'y retrouver.

En outre, il semble difficile de trouver un endroit où vous sentez que vous avez trouvé "la communauté" autour du projet. En fait, la communauté semble inexistante ou nomade. Malheureusement, même leur liste de diffusion a été suivie par tellement de sites de sangsues que vous pouvez vous rendre dans ce terrier de lapin toujours en boucle.

Ces deux facteurs rendent l’apprentissage de l’utilisation des librairies boost plus difficile. Même si les aspects techniques de l'utilisation de boost ne sont pas excessivement complexes, il s'agit d'un ensemble considérable de bibliothèques que vous ne pouvez armer que lorsque vous ne possédez que quelques fragments de code et des éléments éparpillés de la liste de diffusion des coins les plus sombres d'Internet. ... bien vous avez l'idée.

J'ai commencé à bricoler avec boost autour de la version 1.45 et ce n'est que maintenant dans la version 1.52 / 1.53 que je me sens assez à l'aise pour l'utiliser en production. Il y a tellement de choses auxquelles il faut s'habituer et dont on se souvient, même des choses simples comme la configuration et l'optimisation de la configuration, car la manière dont les bibliothèques sont construites et leur fonctionnement peut varier énormément en fonction de vos préférences au moment de la compilation, en raison de la personnalisation des éléments. sont.

Cependant , ne vous y méprenez pas , une fois que vous pouvez utiliser le boost, vous avez acquis une arme puissante pour créer rapidement des programmes multi-plateformes solides. Il suffit de prendre boost::asiopar exemple. Vous pouvez écrire un serveur Web asynchrone multi-plates-formes immensément puissant, évolutif et solide en quelques centaines de lignes. Au fil des ans, j'ai écrit plusieurs clients, serveurs, serveurs mandataires, etc., avec seulement quelques centaines de lignes de code qui ne m'ont pas encore échoué, et je peux les porter d'une plateforme à l'autre en quelques minutes.

Comme d'autres l'ont fait remarquer, les grandes entreprises sont généralement confrontées à des problèmes hérités ou aiment se lancer, ce que je comprends parfaitement. Il y a aussi cette chose vraiment stupide dont j'ai entendu parler et que j'ai rencontrée là où le développeur mène et / ou les chefs de projet interdisent d'utiliser boost parce que c'est "trop ​​grand". J'imagine qu'ils croient qu'il s'agit d'une seule bibliothèque ou qu'ils n'ont jamais entendu parler du PCA .

Quant à POURQUOI je choisis d’utiliser boost

Je dirais que je l'utilise parce que, comme vous l'indiquez dans votre question, c'est "la" bibliothèque C ++. Dans le monde C ++, Boost est considéré comme le couteau suisse que vous devrez utiliser par la suite. L'idée est donc que s'il y avait un besoin, il devrait y avoir une version très performante et portable dans boost. Les grandes entreprises contribuent à stimuler , les personnes très instruites avec des CV impressionnants le maintiennent et, quand une nouvelle norme C ++ est en cours de développement, les gens cherchent généralement à savoir quelles parties de celle-ci devraient devenir C ++ normalisé ISO.

Donc, si j’ai besoin d’ajouter des fonctionnalités pour lesquelles il existe probablement une bibliothèque, le premier endroit que je regarderai, c’est boost, car je suis assez sûr de parier que c’est plutôt bien optimisé, portable, elle sera supportée et maintenue pendant très longtemps et les bugs seront trouvés et traités. Dans le monde open source, ces qualités peuvent être très difficiles à trouver.


la source
Très correct quant à la documentation. Par exemple, la documentation de Boost.asio expliquera comment écrire un serveur http en étonnamment peu de lignes, ce qui est bien si votre jeu utilise http (ou tout autre protocole TCP vanille), mais cela devient beaucoup plus difficile si vous souhaitez utiliser un protocole personnalisé ou une bibliothèque réseau propriétaire. Il m'a fallu 20 minutes pour comprendre comment créer un serveur Websocket avec boost.asio, mais des semaines pour comprendre comment utiliser ENet ( enet.bespin.org ) via un serveur personnalisé boost.asio io_service.
ClosetGeek
21

Nous avons utilisé un peu de Boost sur notre ancien lieu de travail. Les principales raisons pour l’éviter et limiter son utilisation étaient les suivantes:

  • Compilez les temps - certains sont très lents à compiler, et vous finissez par être réticents à avoir # boost inclus dans vos en-têtes
  • complexité - la plupart des développeurs de jeux ne le savent pas très bien, ce qui crée un code illisible
  • performance - certains concepts fonctionnent lentement par défaut, par exemple. shared_ptr
Kylotan
la source
1
boost :: shared_ptr? comment?
Tili
6
Si je me souviens bien, il attribue le compte de références sur le tas quelque part. Ceci est très mauvais pour la cohérence du cache lors de l'utilisation et signifie également le double du temps d'allocation et de désallocation au début et à la fin.
Kylotan
10
(Cela vaut la peine d'ajouter que l'utilisation de make_shared peut atténuer le problème.)
Kylotan
Je pense que cette réponse est assez claire: il y a plus de raisons pour que les gens l'évitent que d'esquiver une ou deux mauvaises classes.
Kylotan
16

La même chose est (était?) Être dit pour le "plus standard" STL. Cet article parle d'EASTL, une réécriture interne de (parties de) STL par Electronic Arts pour répondre aux besoins du développement de jeux assez différents de ceux du développement d'applications "plus génériques".

Alors, peut-être que quelqu'un quelque part est en train de réécrire (des parties de) boost pour répondre à leurs besoins en développement de jeux!

M. Shunz
la source
+1 pour l'article. Je pense que cela répond à la question magnifiquement.
egarcia
9
Mon expérience est que plus votre base de code devient portable, plus vous finissez par réécrire des composants "standard", tels que STL.
Jari Komppa
6

Qui a dit qu'ils n'utilisaient pas de boost? J'ai connu un ou deux moteurs C ++ utilisant boost. Je n'ai jamais travaillé directement avec eux. mais c'est surtout parce que mon expérience réside dans Unreal.

En ce qui concerne les raisons que j'ai rencontrées pour ne pas utiliser boost, et celles-ci sont subjectives:

  • Nous aimons utiliser nos propres structures de données spécifiques aux plates-formes que nous déployons.
  • Nous aimons limiter la quantité de code non développé en interne que nous devons utiliser dans nos projets, en particulier lorsque ce code externe repose sur d'autres bibliothèques développées en externe.

En gros, il s’agit: une solution générale n’est pas toujours la solution idéale.

Je suis sûr que quelqu'un qui a réellement travaillé avec la bibliothèque pourrait mieux commenter.

AA Grapsas
la source
Certes, j'ai modifié ma question pour en tenir compte.
James
5

Je traîne à StackOverflow et n'utilise pas de boost. J'ajouterai ma raison, car c'est une raison qui n'a pas encore été mentionnée.

Boost a beaucoup de bonnes idées, vraiment. J'aime regarder ce qu'ils ont fait et essayer de nouvelles choses et idées. C’est formidable, car c’est un terrain fertile pour de nombreuses améliorations de C ++.

Mais le coup de pouce est une bête très difficile à manier pour de nombreuses raisons. Une des raisons est qu’ils ont besoin (veulent) d’être compatibles avec pratiquement tous les compilateurs, avec toutes les bizarreries. En conséquence, ils doivent employer de nombreuses astuces, telles que MPL pour réussir. Par exemple (il y a longtemps), je voulais utiliser leur shared_ptr. Pour l'exécuter, il me fallait les sources et les bibliothèques de ce qui semblait être 90% de boost. J'ai fini par écrire le mien; 50 lignes de code lisibles. (Mes exigences étaient plus strictes, pas de sécurité faible ni de thread.)

Souvent, vous avez besoin d'un très petit sous-ensemble de boost, mais intégrer l'intégralité du boost ne vaut tout simplement pas la peine.

Modifier :

Juste pour préciser est clair, car il semble ne pas être venu clairement (c-à-d. Vote négatif). J'utilise n'utiliser les bibliothèques de tiers. Mais dans la plupart des cas, toutes choses étant égales par ailleurs, en intégrant une bibliothèque tierce ou un boost, l’autre bibliothèque tierce est plus rapide et plus propre. Le reste est fait en "2h". Je jette un regard très dur dans la question de la construction ou de l’achat.

rioki
la source
1
Il y a des outils comme BCP, tu sais.
Bartek Banachewicz
2
Voulez-vous dire que vous n'avez pas à gérer votre propre code? J'aurais aussi aimé pouvoir écrire tous les éléments de boost que j'utilise en 2 heures (ce qui implique également de les tester sur toutes les cibles de construction que je vais utiliser et d'écrire des tests). Vous devez être un codeur très rapide. Oh, et aussi "la plupart des bits utiles" équivaut à "je ne peux pas C ++" ici, car la norme manque encore beaucoup .
Bartek Banachewicz
2
Pour commencer quelques fonctionnalités fournies par boost, j’ai trouvé ailleurs dans de petits paquets bien définis, par exemple sigc ++. Dans de nombreux cas, plus élégant et / ou plus efficace. Ce que j’ai appris à améliorer pour la plupart des endroits où des fonctionnalités, telles que les threads, les pointeurs intelligents et les expressions régulières, sont des éléments qui en ont fait le standard. Au fil des années, j'ai acquis une collection de bibliothèques tierces et un code personnel. "Je peux C ++" depuis plus de 15 ans maintenant, merci beaucoup.
rioki
3
@SeanFarrell, vous ne devriez pas être condescendant. Vous dites que vous utilisez le C ++ depuis 15 ans, puis, dans un commentaire sarcastique à Bartek, il semble que vous ne compreniez pas ce que Bartek veut dire quand il dit "maintenir" en conjonction avec "paquets". Maintenir ne signifie pas les réparer. Cela signifie généralement simplement mettre à jour vers une nouvelle version ou stocker des versions pour plusieurs cibles. Juste FYI.
3
Sigh Boost fonctionne également hors de la boîte, mais vous avez toujours mentionné le maintenir. Je ne vois pas votre logique ici.
Bartek Banachewicz
4

Dans notre cas (pas les jeux), nous avons une bonne raison de ne pas utiliser boost (ni std): Nous avons beaucoup de code qui remonte à une décennie. Selon les seniors, std et boost étaient soit incomplets, pleins de bugs, soit tout simplement trop lents pour les performances exigeantes. Certaines classes de base ont donc été implémentées, en utilisant les mêmes concepts (tels que les itérateurs) et souvent optimisées pour nos algorithmes. De nos jours, les trois bibliothèques (la nôtre, std et boost) sont très similaires.

Mais voulons-nous porter sur tout notre code? Pas vraiment. Je suppose que beaucoup d'autres entreprises font face au même dilemme. Soit réécrire beaucoup de code testé et fonctionnel ou ne pas utiliser std / boost.

Kdansky
la source
5
C'est vrai et c'est quelque chose auquel je n'avais pas pensé, mais j'ai remarqué que beaucoup de personnes qui débutent dans le développement de jeux en C ++ ne s'intéressent pas à l'utilisation de boost / std. Parfois, j’ai le sentiment que c’est parce que stimuler l’apprentissage, c’est comme apprendre une toute nouvelle langue.
James
1
@ James Ceci est à peu près l'une des principales raisons. J'ai posté une réponse même si vous en aviez déjà accepté une juste pour donner mon point de vue en tant que personne qui persévérait en apprenant à me stimuler, mais pas après avoir été tentée de la fuir également.
1

Personnellement, je n'utilise ni boost ni aucun autre code à usage général lors de la création de jeux, car les jeux ne sont généralement pas à usage général. Le type de code dont vous pourriez avoir besoin pour implémenter un jeu est généralement spécifique au développement de jeux, pas toujours, mais comme 98% (valeur aléatoire) du temps. Vous pouvez vous en tenir aux derniers morceaux de code provenant de boost ou d’une autre bibliothèque, mais c’est probablement mieux de simplement écrire le petit morceau dont vous avez besoin ici et là.

Sur une note de côté, je pense que c'est plutôt amusant d'écrire votre propre code en c ++, c'est pourquoi je n'ai jamais utilisé boost ou quoi que ce soit du genre.

Haywire Spark
la source
3
C'est amusant, mais le boost est destiné à ceux qui veulent faire mieux que de réinventer la roue.
Bartek Banachewicz
3
C'est mon opinion, mais c'est une erreur de dire que "les jeux sont spéciaux". Oui, l'automatisation de l'industrie en temps réel est également spéciale. Je fais les deux et je peux attester que les bits où le boost serait appliqué sont très clairement similaires. Dire qu'ils sont différents, c'est de l'ignorance, car ils sont très différents les uns des autres, mais le langage utilisé est le même. Une fonction de tri est fondamentalement la même, peu importe ce que vous triez. (Ensuite, juste que vous pouvez, ne signifie pas que vous voudriez, voir ma réponse.)
rioki
2
Vous pouvez ajouter la couche réseau / multijoueur complète à votre jeu en utilisant boost :: asio et inventez votre propre protocole de communication. C’est une raison parfaitement valable d’utiliser boost dans tous les jeux que vous écrivez qui nécessitent tout type de fonction réseau. "Rouler soi-même" peut être formidable lorsque vous êtes nouveau et que vous devez apprendre. Aucun problème avec ça. Mais au bout du compte, je ne vais pas perdre de temps à essayer d’écrire ma propre couche de communication asynchrone sur plusieurs plates-formes, alors que c’est déjà fait et que c’est bien.
2
@ HaywireSpark Il n'est pas nécessaire d'insulter les gens. J'ai lu votre message et je ne suis toujours pas d'accord avec vous. Même si vous choisissez «généralement spécifique», cela n’a aucune pertinence. Presque tout dans boost est conçu pour être aussi portable et modifiable que possible. boost :: asio est une implémentation très générique et n’est orienté vers aucun moyen spécifique de communication réseau. Je ne peux imaginer un scénario dans lequel je devrais dire: "Gee, Boost :: Asio ne correspond tout simplement pas à mon modèle de couche réseau, je ferais mieux de réinventer la roue". Je dis juste.
2
@ HaywireSpark soupir. Bonne journée mon pote. Vous devriez essayer d'être plus ouvert à la critique. Être capable d'accepter les critiques fait partie de l'apprentissage, et si vous ne l'êtes pas, vous n'apprendrez jamais rien. Je ne vais pas vous prendre. Chaque personne qui a posté sur votre commentaire a été en désaccord avec vous. C'est généralement une bonne indication que vous avez dit quelque chose de désagréable.
0

l'héritage des bibliothèques maison n'est pas un facteur ... la principale raison pour laquelle personne ne devrait utiliser boost u autre bibliothèque à usage général est parce qu'elles ne sont pas optimisées en termes de vitesse et de mémoire, même si je dois mentionner que Cryengine utilise la STL mais qu'elles compilent il s'agit d'une version open source appelée STLPort, alors n'ayez pas peur d'utiliser la STL, implémentez simplement vos allocateurs personnalisés et tout ira bien. n'utilisez pas de boost tho.

Piporron
la source
5
-1: Pour votre conviction que "Boost" n'est "pas une vitesse et une mémoire optimisées", alors qu'il existe littéralement des dizaines de bibliothèques Boost, toutes avec des degrés de rapidité et d'efficacité de la mémoire variables.
Nicol Bolas
2
... C’est en fait la raison pour laquelle un certain nombre de développeurs de jeux ont évité d’être boostés et ont même lancé leur propre STL, ainsi que le fait que l’utilisation intensive de gabarits entraîne la compilation des temps. Gardez surtout à l'esprit les versions de débogage sur MSVC, où vous avez besoin du minimum absolu d'abstractions, de wrappers et de génériques que vous pouvez vous en tirer, tous antithétiques à Boost. Le problème n’est pas algorithmique, mais simplement que Boost n’a jamais été conçu pour une vitesse de base. Hormis les développeurs de jeux, personne ne voudrait les compromis que cela suppose.
Sean Middleditch
2
@seanmiddleditch: Mon point est qu'il y a beaucoup de bibliothèques dans Boost. Certains d'entre eux sont plus rapides et utilisent plus efficacement la mémoire que tout ce que vous pourriez coder pour faire le même travail, d'autres non. Dénigrer l'ensemble des bibliothèques pour cela est simplement ignorant.
Nicol Bolas
2
Il n’ya pas beaucoup de développeurs de jeux capables d’écrire un analyseur plus rapide que Boost.Spirit. Bien qu'il existe de nombreuses options meilleures (plus faciles à utiliser) pour l'analyse de langages complets, Spirit est très rapide pour analyser des chaînes bien structurées, même pour les convertir simplement en types de données. La bibliothèque Boost.Xpressive est également très rapide pour regex. N'oubliez pas que de nombreux utilisateurs de Boost travaillent également pour le comité de standard C ++ et savent comment tirer le meilleur parti des performances de C ++ sur toutes les plateformes.
Gérald
5
Ils utilisent souvent la métaprogrammation des modèles de manière à permettre la réalisation d'une grande partie du travail au moment de la compilation, au lieu de l'exécution, ce qui vaincra toutes les optimisations d'exécution de bas niveau dont les développeurs de jeux sont si fiers. . J'ai constaté une augmentation de plus de 50 fois des performances lors de la conversion de certaines tâches à partir de bibliothèques C hautes performances communes pour utiliser les équivalents Boost.
Gérald