Question

Résumé:

  

Puis-je programmer un "épais"   client " jeu en C sans réinventer   roues , ou devrais-je simplement mordre la   bullet et utiliser une bibliothèque ou SDK?   Je suis un programmeur C modéré et je ne suis pas   peur de travailler avec des pointeurs, des données   structures, emplacements de mémoire, etc. si   cela me donnera le contrôle dont j'ai besoin   faire un excellent " client lourd " Jeu.   Cependant, je pense à éviter   langues de haut niveau & amp; cadres pour   par souci de pouvoir et de contrôle, pas   facilité d'utilisation.

Je suis intéressé par bricoler avec un jeu de combat / plateforme 2D en tant que projet parallèle. Je suis principalement un programmeur côté serveur Linux avec une expérience de Python, Ruby et PHP. Je sais qu'il existe d'excellents cadres dans certaines de ces langues, tels que PyGame . Je suis également conscient du succès rencontré par certaines personnes comme Air et .NET ... mais je suis inquiet:

  • Performances : les langages de script sont notoirement lents. Si je crée un jeu en temps réel, je veux qu'il soit le plus vif possible.
  • Principaux fichiers binaires : l'utilisation de frameworks tels que .NET ou de langages de script tels que Ruby permet souvent d'obtenir de grands CLR ou des bibliothèques dont vous n'auriez autrement pas besoin. Le jeu que je veux créer sera petit et simple. Je ne veux pas que son CLR soit plus gros que le jeu lui-même!
  • Contenu supplémentaire : Honnêtement, je n'aime pas l'idée d'hériter du bagage d'une bibliothèque de gros gibiers si je peux mieux comprendre mon propre code.

Je pose cette question parce que je sais que je suis très susceptible au syndrome Not Invented Here. Je veux toujours le programmer moi-même et je suis sûr que cela fait perdre beaucoup de temps. Cependant, cela me convient très souvent - par exemple, au lieu d’utiliser Rails (un très gros site Web cadre de projet avec une boîte à outils ORM et une interface graphique cuites), j’ai utilisé un ensemble d’outils Ruby plus petits, tels que rack et suite qui s’harmonise parfaitement.

Alors, je me tourne vers vous, experts SO. Suis-je naïf? Voici comment je le vois:

  • Utiliser C
    • Inconvénients
      • Me fera probablement détester la programmation
      • Risque élevé de réinventer les roues
      • Le risque que cela prenne si longtemps que je perde de l'intérêt
    • Avantages
      • Essayé & amp; vrai - la plupart des jeux A-list se font en C (est-ce toujours le cas aujourd'hui?)
      • Niveau élevé de contrôle de la gestion de la mémoire, de la vitesse, de la gestion des actifs, etc., que je me fais confiance d'apprendre à gérer
      • Pas de cruft
  • Utiliser un framework ou un SDK
    • Inconvénients
      • Risque de produit livrable surdimensionné
      • Dépend des auteurs de la bibliothèque d'origine pour toutes les facettes du développement de jeux. Que se passe-t-il s'il n'y a pas de fonctionnalité que je souhaite? Je vais devoir le programmer moi-même, ce qui n'est pas mauvais, mais déjoue partiellement le but d'utiliser un cadre de haut niveau en premier lieu
      • Risque élevé de problèmes de performances
    • Avantages
      • BEAUCOUP de temps de développement plus rapide
      • Pourrait être plus facile à gérer
      • Pas de perte de temps à réinventer les paradigmes communs

Que puis-je ajouter à cette liste? Est-ce un pur appel du jugement, ou quelqu'un peut-il sceller l'accord pour moi? Suggestions de livres bienvenues.

Était-ce utile?

La solution

Ma pensée actuelle est la suivante:

  • Si vous souhaitez apprendre à programmer, commencez à créer le moteur de jeu à partir des éléments de base (même en implémentant des structures de données de base - listes, cartes, etc.). J'ai déjà fait cela une fois, et bien que ce fût une expérience d'apprentissage, j'ai fait beaucoup d'erreurs et je ne le ferais pas une seconde fois. Cependant, pour apprendre à programmer, à créer quelque chose de sympa et à obtenir des résultats, je l’évaluerais beaucoup.

  • Si vous voulez créer un jeu approprié, utilisez les bibliothèques de votre choix et concevez vous-même toute l'infrastructure du jeu. C’est ce que je suis en train de faire, et j’utilise toutes les choses intéressantes comme STL, ATL / WTL, Boost, SQLite, DirectX, etc. le code et le design.

  • Si vous voulez juste créer un jeu avec des artistes et d'autres personnes collaborant pour créer un produit fini, utilisez l'un des moteurs existants (OGRE, Irrlicht, Nebula, Torque, etc.) et ajoutez simplement votre logique de jeu. et de l'art.

Une dernière sagesse que j’ai apprise est qu’il ne faut pas s’inquiéter du syndrome Not Invented Here. Comme je me suis rendu compte que d'autres bibliothèques (telles que STL, Boost, DirectX, etc.) ont un ordre de grandeur (ou trois) plus de temps de développement, beaucoup plus que je ne pourrais en dépenser pour cette partie. du jeu / moteur. Par conséquent, la seule raison de mettre en œuvre ces éléments vous-même est si vous souhaitez en apprendre davantage à leur sujet.

Autres conseils

Je crois que vous travaillez sous un sophisme.

Il existe plusieurs cadres spécifiques à la programmation de jeux, écrits par des personnes très expérimentées dans la complexité de la conception de jeux, presque certainement davantage que vous.

En d'autres termes, vous avez un "risque élevé de problèmes de performances". si vous n'utilisez pas de framework.

Je vous recommande d'essayer pyglet .

  • Il a de bonnes performances car il utilise opengl
  • C'est une bibliothèque compacte tout-en-un
  • Il n'a pas de dépendances en plus de python

Faites des tests pour voir si vous pouvez le faire assez vite pour vous. Seulement si vous vous prouvez qu'il ne s'agit pas d'un niveau inférieur. Bien que je sois assez confiant que python + pyglet puisse le gérer ... au pire, vous devrez écrire quelques extensions C.

Aujourd'hui, je pense que vous êtes à un point où vous pouvez ignorer le problème de performances en toute sécurité, à moins que vous n'essayiez spécifiquement de faire quelque chose qui repousse les limites. Par exemple, si votre jeu n’est pas plus compliqué que Quake II, choisissez des outils et des bibliothèques qui vous permettent de tirer le meilleur parti de votre temps .

Pourquoi ai-je choisi Quake II? Parce qu’elle exécute une version compilée pour .NET , elle fonctionne avec un moteur de rendu logiciel à plus de taux de trame acceptable sur une machine en cours. (Si vous le souhaitez, comparez MAME, qui émule plusieurs processeurs et matériels graphiques à des débits acceptables)

Vous devez vous demander si vous êtes dans cette situation pour construire un moteur ou pour construire un jeu. Si votre but est de créer un jeu, vous devriez certainement regarder un moteur de jeu établi. Pour le développement de jeux en 2D, consultez Constructeur de jeux de couple . C'est un moteur / SDK de jeu 2D très puissant qui vous mettra en production dès le premier jour. Ils contiennent de nombreux outils qui l'intègrent, des packs de contenu, et vous obtenez le code source complet si vous souhaitez apporter des modifications et / ou apprendre comment ça marche. Il est également compatible Mac OSX et possède des versions Linux dans la communauté.

Si vous cherchez quelque chose du côté de la console, ils en ont aussi.

Je suis surpris que personne n'ait mentionné XNA . C’est un framework construit autour de DirectX pour gérer la programmation DirectX tout en supprimant les détails superficiels et la verbosité de la programmation DirectX de niveau inférieur.

Sur le plan des performances, pour la plupart des tâches de jeu 2D et 3D, en particulier la construction d’un jeu de combat, cette plate-forme fonctionne très bien. Ce n'est pas aussi rapide que si vous exécutiez de la programmation DirectX sans système d'exploitation, mais cela vous rapproche beaucoup et dans un environnement géré, rien de moins.

Un autre avantage intéressant de XNA est que la plupart du code peut être exécuté sur une Xbox 360 et peut même être débogué via une connexion réseau si le jeu s’exécute sur la Xbox. Les jeux XNA peuvent désormais être approuvés par l'équipe Xbox Live pour la distribution et la vente sur Xbox Live Arcade. Donc, si vous envisagez de mener le projet dans un état commercial, vous disposez peut-être de moyens de distribution à votre disposition.

Comme pour tous les outils de développement MS, la documentation et l’assistance technique sont de premier ordre. Il existe une vaste communauté de développeurs avec de nombreux tutoriels, projets existants, etc.

.

Voulez-vous pouvoir jouer à votre jeu sur une console? Voulez-vous le faire comme une expérience d'apprentissage? Voulez-vous que le produit final soit multi-plateforme? Quelles bibliothèques avez-vous consultées jusqu'à présent?

Pour un jeu en 2D, je ne pense pas que les performances seront un problème, je vous recommande d’utiliser quelque chose qui vous permettra d’obtenir des résultats à l’écran dans les meilleurs délais. Si vous avez beaucoup d’expérience dans Python, pyGame est un bon choix.

Si vous envisagez de jouer à des jeux 3D à l'avenir, je vous conseillerais de jeter un coup d'œil à Ogre ( http: // www.ogre3d.org ). C'est un moteur graphique 3D multi-plateformes qui extrait les API graphiques. Cependant, pour un projet en 2D, il est probablement excessif.

Le langage d'implémentation le plus courant pour les jeux A-list est aujourd'hui le C ++, et de nombreux jeux intègrent un langage de script (tel que Python ou Lua) pour le script d'événements de jeu.

Les outils que vous utiliseriez pour écrire un jeu ont beaucoup à voir avec vos raisons pour l'écrire et avec vos exigences. Ce n'est pas différent de tout autre projet de programmation, vraiment. S'il s'agit d'un projet parallèle et que vous le faites vous-même, vous seul pourrez alors évaluer le temps que vous aurez à consacrer à cette tâche et définir vos exigences en matière de performances.

De manière générale, les ordinateurs modernes sont assez rapides pour exécuter des plateformes 2D écrites dans des langages de script. L'utilisation d'un langage de script vous permettra de créer des prototypes plus rapidement et vous aurez plus de temps pour peaufiner le gameplay. Encore une fois, ce n’est pas différent de tout autre projet.

Si vous utilisez C ++, et que vos raisons ne doivent pas être plus élaborées que "parce que je le veux", Je suggérerais que vous examiniez SDL pour la prise en charge du rendu et de l'audio. Cela facilitera un peu les choses.

Si vous voulez apprendre les technologies sous-jacentes (DirectX, ou si vous voulez écrire des blitters optimisés pour une raison perverse), utilisez bien sûr le C ++.

Cela dit, je vous mets en garde contre une optimisation prématurée. Pour un jeu en 2D, il vaudra probablement mieux commencer par Python et PyGame. Je serais surpris que ces outils se révèlent inadéquats sur les PC modernes.

En ce qui concerne ce que les gens ont dit à propos de C / C ++ / Python, je suis un développeur de jeux et mon entreprise encourage C. Le b ++ n'est pas b / c C ++ est mauvais, mais parce que C ++ mal écrit est un poison pour le développement de jeux en raison de sa difficulté lire / déboguer par rapport à C. (C ++ donne des avantages s’il est utilisé correctement, mais laissez un jeune homme faire des erreurs avec cela et votre temps est compté est énorme)

En ce qui concerne la question réelle: Si votre objectif est simplement de faire fonctionner quelque chose, utilisez une bibliothèque.

Sinon, codez-le vous-même pour une raison très importante: Pratiquez
Pratique de la manipulation de structures de données. Il y aura des moments où vous aurez besoin de gérer vos propres données. Pratiquez le débogage du code de l'utilitaire.

Souvent, les bibliothèques font exactement ce que vous voulez et sont géniales, mais parfois, VOTRE votre cas d'utilisation spécifique est très mal géré par la bibliothèque et vous gagnerez de gros avantages en écrivant vous-même. C'est surtout sur les consoles comparées aux PC

(edit :) En ce qui concerne le script et la récupération de place: cela vous va vous tuer sur une console. Dans un jeu récent, je devais réécrire les principales parties de la récupération de place sur Unreal uniquement pour répondre à nos besoins. la partie éditeur . Il fallait en faire encore plus dans le jeu réel (pas seulement par moi) (pour être juste, même si nous poussions au-delà des spécifications initiales d'Unreal)

Les scripts sont souvent bons, mais ce n'est pas un "je gagne". bouton. En général, les gains disparaissent si vous repoussez les limites de votre plate-forme. J'utiliserais "le pourcentage de CPU des plateformes que je devais épargner" comme fonction d'évaluation pour décider de la pertinence du script

Une considération en faveur de C / C ++ / obj-C est que vous pouvez mélanger et faire correspondre différentes bibliothèques pour différents domaines de préoccupation. En d'autres termes, vous n'êtes pas coincé avec l'implémentation d'une fonctionnalité dans un framework.

J'utilise cette approche dans mes jeux ; Utilisation de chipmunk pour la physique 2D, de Lua en tant que langage de script intégré et d'une implémentation openGL ES de Apple. J'écris la colle pour lier tous ces éléments dans un langage C. Le produit final étant la possibilité de définir des objets de jeu, d’en créer des instances et de gérer des événements lorsqu’ils interagissent les uns avec les autres dans des fonctions C exposées à Lua. Cette approche est utilisée dans de nombreux jeux de haute performance avec beaucoup de succès.

Si vous ne connaissez pas encore le C ++, je vous recommanderais sans hésiter d'utiliser un langage de script. Construire un jeu de bout en bout demande beaucoup de motivation et se forcer à apprendre une nouvelle langue en même temps est un bon moyen de faire avancer les choses assez lentement pour que vous perdiez tout intérêt (bien que ce soit un bon moyen d'apprendre une nouvelle langue). langue ...).

La plupart des langages de script seront de toute façon compilés en code octet. Par conséquent, leur plus gros succès en termes de performances sera la récupération de place. Je ne suis pas assez expérimenté pour donner une description précise de la taille de la collecte des déchets, mais je serais enclin à penser que cela ne devrait pas être trop grave dans un petit jeu.

De même, si vous utilisez une bibliothèque de langage de script existante pour créer votre jeu, la plupart des zones critiques en termes de performances (telles que les graphiques) peuvent quand même être écrites en C ++ (éventuellement par les bibliothèques de jeux). De toute façon, 80% de la CPU pourrait en fait être dépensé en code C ++, malgré le fait que la majeure partie de votre projet est écrite en Python.

Je dirais, demandez-vous ce que vous voulez de plus: écrire un jeu de bout en bout et en apprendre davantage sur le développement de jeux, ou apprendre un nouveau langage (C ++). Si vous voulez écrire un jeu, faites-le dans un langage de script. Si vous souhaitez apprendre un nouveau langage, faites-le en C ++.

Oui, à moins que vous souhaitiez seulement connaître tous les détails des éléments d’un jeu, vous souhaitiez absolument utiliser un moteur de jeu et vous concentrer sur la construction de votre logique de jeu plutôt que sur les détails graphiques, audio, etc. gestion des ressources, etc.

Personnellement, je voudrais recommander Torque Game Builder (alias Torque 2D) de GarageGames . Mais vous pouvez probablement trouver des moteurs de jeu gratuits adaptés à vos besoins.

Je suis presque sûr que la plupart des jeux modernes se font en C ++, pas en C. (Toutes les sociétés de jeux vidéo que j'ai interviewées ont posé des questions sur C ++.)

Pourquoi ne pas utiliser C ++ et les bibliothèques existantes pour la physique + les collisions, le son, le moteur graphique, etc. Vous écrivez toujours le jeu, mais le contenu banal est pris en charge.

Il y a beaucoup de solutions différentes à la question de l'abstraction et chacune traite cette question de différentes manières.

Mon projet actuel utilise C #, DirectX 9, HLSL et SlimDX. Chacun de ceux-ci offre un niveau d'abstraction soigneusement calibré. HLSL me permet de lire le code de shader que j'écris et SlimDX / C # me permet d’ignorer les pointeurs, les dépendances circulaires et la gestion du code non managé.

Cela dit, aucune de ces technologies n’a d’incidence sur la facilité de développement de mon intelligence artificielle, de mon éclairage ou de ma physique! Je dois encore décomposer mes manuels scolaires d'une manière que je ne voudrais pas avec un cadre de plus haut niveau.

Même en utilisant un framework tel que XNA, si la plupart des concepts de développement de jeux vidéo vous sont étrangers, il vous reste encore beaucoup à apprendre et à apprendre. XNA vous permettra d'éviter parfaitement le verrouillage de la nacelle, mais malheur à ceux qui ne comprennent pas les concepts de base de l'ombrage. D'autre part, quelque chose comme DarkBASIC ne résoudra pas votre problème de blocage de cardan, mais l'ombrage est principalement géré pour vous.

C’est un champ suffisamment grand pour que votre premier moteur ne soit jamais celui que vous utilisez réellement. Si vous écrivez vous-même, vous ne l'écrivez pas assez bien. Si vous utilisez des bibliothèques tierces, il y a certainement des aspects qui vous gêneront et que vous voudrez remplacer.

En tant qu’idée, il pourrait être intéressant de prendre différentes bibliothèques / frameworks (faites de XNA l’un de vos objectifs, même si vous décidez de ne pas l’utiliser, c’est un excellent point de repère) et essayez de construire différents prototypes. Peut-être un paysage (avec un plan d'eau) ou une démonstration de physique de l'espace.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top