Comment puis-je exécuter sur plusieurs plates-formes à l'aide d'un moteur personnalisé?

13

Les moteurs de jeux comme Unity et Unreal peuvent fonctionner sur plusieurs plates-formes. Je me demande comment ils font ça.

J'utilise C ++ et OpenGL depuis un certain temps, et ce que je recherche, ce sont des ressources pour intégrer quelque chose qui me permettra de fonctionner sur différentes plates-formes sans réécriture. Quelque chose comme LibGDX où vous écrivez du code à l'aide d'une API de base, puis l'API le convertit en HTML, Android, iOS, et cetera. Je suis conscient que je peux utiliser un autre moteur au lieu d'écrire le mien, mais je suis intéressé par l'expérience d'apprentissage.

DanielCollier
la source

Réponses:

26

Portez votre moteur sur chaque plateforme. Il n'y a rien de spécial là-dedans. Si vous avez du code uniquement pour Windows, alors ajoutez une logique #ifdef dans le fichier ou ajoutez un deuxième fichier (que vous auriez FooWindows.cppet FooLinux.cppou autre) qui implémente cette fonctionnalité sur les autres systèmes d'exploitation dont vous vous souciez. .

La publication en un clic de trucs qu'un moteur comme Unity a est autorisée car Unity lui-même n'est jamais modifié par l'utilisateur final. Vous n'écrivez que des scripts et des données, donc le moteur a des binaires pré-construits pour toutes les plates-formes et le bouton de publication regroupe simplement ces binaires avec les données.

D'autres moteurs s'appuient sur des systèmes de construction et des compilateurs croisés pour créer le jeu compilé en cas de besoin, tout comme vous le feriez avec n'importe quelle application multiplateforme non liée au jeu.

Pour des choses comme HTML5, il existe des outils comme emscripten qui peuvent compiler une application C ++ à exécuter en JavaScript. Vous avez simplement besoin de créer un autre port de votre moteur pour emscripten (car il ne peut utiliser aucune bibliothèque / fonctionnalité C ++ arbitraire).

Vous n'avez pas à réécrire tout votre jeu, mais vous devrez certainement faire beaucoup de travail de développement, de codage et de portage pour chaque nouvelle plate-forme que vous souhaitez prendre en charge.

Sean Middleditch
la source
14
D'après mon expérience de travail avec un logiciel multiplateforme (le plus gros projet serait HotSpot), vous voulez vraiment éviter d'avoir ifdefs jeté à travers le code. Il est certainement préférable d'avoir quelque chose comme share/os/<linux>(ou share/cpu/x86) et d'y mettre tout le code spécifique à la plate-forme, puis de faire des inclusions conditionnelles. C'est du moins ce que font gcc, HotSpot et le noyau Linux (ce n'est certainement pas une règle stricte). Oui, vous pouvez commencer avec une seule fonction qui dépend de la plate-forme et penser que c'est exagéré, mais cela ne reste jamais comme ça et cela devient rapidement un gâchis sinon.
Voo
14

Il n'y a pas de solution miracle ici. Si vous souhaitez que votre jeu s'exécute sur plusieurs plates-formes, vous devez écrire du code pour plusieurs plates-formes (ou exploiter des bibliothèques tierces qui le font déjà pour vous).

Les choses que vous demandez ne s'alignent pas: vous dites (c'est moi qui souligne)

ce que je recherche, ce sont des ressources pour intégrer quelque chose qui me permettra de fonctionner sur différentes plateformes sans réécrire

mais aussi que (accentuez le mien encore)

Je suis conscient que je peux utiliser un autre moteur au lieu d'écrire le mien, mais je suis intéressé par l'expérience d'apprentissage .

Vous allez à peu près devoir faire l'un ou l'autre: choisissez d'utiliser une bibliothèque, un moteur et / ou une chaîne d'outils tiers qui vous fournit un support multiplateforme, ou créez le vôtre en écrivant du code multiplateforme (conception de votre propre abstraction sur les plateformes dont vous disposez, et implémentation de cette abstraction pour chaque plateforme).

Les moteurs de jeux tels qu'Unreal ou Unity qui prennent en charge cela recompilent votre code par rapport à l'abstraction de plate-forme appropriée, ou vous demandent de créer une bibliothèque ou une DLL par rapport à leurs API internes, qu'ils chargent à partir d'un exécutable de pilote spécifique à la plate-forme qu'ils ont compilé pour le bon. Plate-forme.


la source
2

Contrairement aux deux autres réponses (qui sont à juste titre spécifiques au C ++), il existe un autre moyen. Quelques architectures qui me viennent à l'esprit:

  • Portez votre moteur: modifiez ou écrivez du code pour qu'il fonctionne sur plusieurs plates-formes. Ceci est traité dans les réponses ci-dessus.
  • Écrivez quelque chose au-dessus d'une bibliothèque multiplateforme: voici l'exemple de libGDX, qui s'exécute sur Java. Java s'exécute sur le bureau, Android et iOS (via RoboVM). En utilisant quelque chose comme Java, vous bénéficiez de plates-formes supplémentaires gratuites lorsque la bibliothèque / l'outil sous-jacent les prend en charge. Dans ce cas, lorsque RoboVM est sorti, libGDX (presque) "fonctionne juste" sur iOS.
  • Écrire un générateur de code: c'est l'approche de Haxe et d'autres outils. Vous avez un langage de base (par exemple Haxe / AS3) et vous écrivez des convertisseurs qui génèrent une sortie pour d'autres langues. Par exemple. Haxe se convertit en C ++ pour Desktop, Java (je pense) pour Android, etc.

Personnellement, je trouve que l'approche de libGDX est la plus simple: trouver un langage ou une plateforme qui répond à vos besoins, et écrire dessus. La génération de code et les moteurs portables sont complexes et difficiles à bien écrire.

libGDX est en fait un excellent choix, car il frappe à la fois les principaux téléphones mobiles, les ordinateurs de bureau et le Web (via les applets ou le compilateur Web de Google).

cendres999
la source
Même avec Java ou C #, vous n'obtenez pas le code multiplateforme comme par magie; vous devez toujours être conscient des bibliothèques tierces qui peuvent avoir des dépendances de plate-forme (par exemple, SlimDX ou SharpDX serait un mauvais choix pour un projet C # multiplateforme).
@JoshPetrie, vous obtenez certainement beaucoup "gratuitement" par rapport au déploiement de votre propre moteur C ++ et à son portage sur plusieurs plates-formes.
ashes999
@ ashes999 merci pour la réponse, libGDX est génial Je l'utilise mais je vais l'écrire pour qu'il fonctionne multiplateforme puis utiliser CMake, je suis plus dedans pour le défi que d'utiliser une bibliothèque ou un moteur préexistant
DanielCollier
2

Je construis actuellement un moteur de jeu multiplateforme. J'utilise SDL, qui est une excellente bibliothèque multiplateforme (et de bas niveau) pour créer des applications graphiques, pour soulager la douleur.

Au-delà de cela, cependant, il y a beaucoup de "code personnalisé" pour chaque plate-forme. Vous n'avez qu'à passer au travers. Jusqu'à présent, j'ai trouvé que c'était une très petite fraction de mon temps de développement, principalement consacrée à la recherche de documents pour des systèmes que je ne connais pas aussi bien que mon Linux natif.

Je vous découragerais d'utiliser #ifdefpartout dans votre code. Au lieu de cela, créez des abstractions autour des primitives clés (un exemple d'une telle primitive pourrait être un socket TCP).

Lorsque vous rencontrez un nouveau problème qui nécessite des solutions différentes par environnement, demandez-vous "puis-je résoudre ce problème en utilisant uniquement les primitives multiplateformes que j'ai déjà construites?" Si la réponse est oui: voila, code multiplateforme simple. Sinon, déterminez quelles primitives vous manquez et implémentez-les.

scpayson
la source
0

Si vous voulez faire cela "à partir de zéro" comme une expérience d'apprentissage, vous devrez utiliser l'API Win32 où vous pouvez trouver des informations sur l'ouverture d'une fenêtre et un contexte OpenGL sur MSDN et sur le wiki OpenGL ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Pour Linux, obtenez une copie d'occasion du manuel de programmation O'Reilly Xlib et du manuel de référence Xlib et lisez également sur GLX (extension OpenGL au système X Window). Voir aussi http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

Ensuite, il vous suffit de fournir la même API à votre application avec des fonctions qui font la même chose (par exemple ouvrir une fenêtre) mais ont des implémentations différentes pour chaque plate-forme. Vous réécrivez des parties de votre moteur pour différentes plates-formes. Ensuite, un jeu que vous écrivez en utilisant le moteur que vous n'avez qu'à écrire une fois, mais il fonctionnera sur différentes plates-formes.


la source
merci pour la réponse mais je préfère simplement utiliser SDL2 pour le fenêtrage, sa plateforme croisée et très facile à utiliser. à quel point LibGDX utilise LWJGL pour le fenêtrage
DanielCollier