Développement multiplateforme C ++ / OpenGL ES (iOS / Android) [fermé]

10

J'ai déjà une expérience raisonnable avec C ++ et OpenGL, et j'ai récemment décidé d'essayer le développement de jeux mobiles. Après avoir réussi à créer une simple application Android OpenGL ES utilisant Java, j'ai recherché des moyens de cibler à la fois Android et iOS avec le moins de code de réécriture possible. J'ai essayé d'utiliser les outils de développement d'applications multiplateformes fiers de Visual Studio 2015, mais je les ai trouvés trop nouveaux et donc extrêmement sous-documentés. Je pouvais construire les projets de modèles que le programme m'a donnés, mais je ne pouvais pas comprendre comment, compte tenu de ces modèles, je pouvais ajouter des actifs dans le jeu ou gérer la saisie sur écran tactile.

J'ai une envie malheureusement spécifique, trop spécifique à retrouver avec Google. Je veux créer un jeu OpenGL ES en utilisant C ++, avec des wrappers spécifiques à une plate-forme mince pour Android et iOS. Les gens m'ont posé des questions similaires (mais pas exactement les mêmes), et plus d'une personne qui a répondu a déclaré que ce que je veux faire est non seulement possible, mais relativement facile, car je n'ai pas à me soucier de l'interface utilisateur.

J'ai essayé ce tutoriel , mais il a presque trois ans et est donc probablement conçu pour une technologie plus ancienne, et en conséquence j'ai rencontré divers bugs non comptabilisés. En ce moment, cependant, ce tutoriel est la chose la plus proche de ce que je veux que j'ai trouvée. Tout le reste est uniquement Android ou recommande que je paie des centaines de dollars par an pour utiliser le SDK Marmalade. Parfois, j'ai envie d'écrire simplement le code deux fois, une fois en Java et une fois en Objective-C, mais je suis toujours motivé par la connaissance que cette solution est possible, mais pour une raison quelconque, n'est couverte nulle part dans les détails modernes.

Pour résumer, je veux créer un jeu OpenGL ES pour iOS et Android, avec une seule base de code C ++ enveloppée dans de petites quantités de code spécifique à la plate-forme. Cependant, malgré le fait que plusieurs personnes aient recommandé cette approche, personne ne peut me dire comment le faire. Quelqu'un peut-il me dire si c'est réellement possible et si oui, que puis-je faire ou où aller pour apprendre comment?

Craig Horwood
la source
essayez cocos2d-x , ou unité3d
Ali1S232
1
Unity3d est loin de ce que l'OP demande car vous n'avez pas accès à la source. J'ai utilisé cocos2d-x et les problèmes de compilation sont toujours là dans une certaine mesure. L'influence d'Objective-C se fait également sentir, certains peuvent aimer ça, mais pour moi, c'est un arrêt. C'est une solution open source, cependant, cela vaut peut-être la peine d'enquêter sur les PO.
Matthew Sanders

Réponses:

6

Vous pouvez trouver ma réponse à une question similaire ici pour être utile.

Vous pouvez également trouver utile de consulter le code source d'autres solutions. Le moteur Godot par exemple est un moteur de jeu open source multiplateforme, vous n'avez donc jamais besoin de payer quoi que ce soit.

Comme je le mentionne dans mon autre réponse, vous n'avez pas besoin (et ne pouvez probablement pas) compter sur un IDE pour faire le travail pour vous. CMake , Scons et de nombreux autres outils de construction peuvent vous aider avec le processus de compilation / construction croisée sur les plates-formes et les IDE.

Godot Engine , par exemple, utilise Scons et le projet LLVM (alias le framework de compilateur utilisé par le compilateur C / C ++ / Objective-C) utilise CMake .

Une approche populaire pour les jeux consiste à construire un moteur en C / C ++ et, comme vous le mentionnez, à abstraction des spécificités de la plateforme. En ce qui concerne iOS et Android, c'est la logique de gestion du cycle de vie qui s'interface avec le système d'exploitation. Si vous vouliez aller plus loin et utiliser Emscripten pour compiler également vers asm.js et réaliser une vitesse presque native dans le navigateur, vous faites quelque chose de similaire en supprimant la boucle principale derrière ce qui équivaut à des appels requestAnimationFrame .

Emscripten recommande l'utilisation de SDL pour faciliter le processus de portage car il peut aider à gérer l'abstraction des spécificités de la plate-forme, mais rien ne vous empêche de le faire vous-même (à part des charges de recherche, de débogage, etc.).

Si vous êtes vraiment, vraiment fou, vous pouvez faire ce que je fais et écrire votre propre langage en utilisant la puissance de LLVM pour compiler en C ABI natif ou même JIT sur les plates-formes prises en charge.

Le fait est que oui, c'est effectivement possible, mais certaines routes sont plus compliquées / prennent plus de temps que d'autres.

Remarque: Vous devrez probablement utiliser Mac OSX via un Mac, une VM ou un Hackintosh avec XCode pour compiler sur iOS. C'est l'une des nombreuses raisons pour lesquelles je trouve qu'un Macbook Pro est un excellent candidat pour un système de développement.

Remarque 2: Il convient de mentionner que de nombreux moteurs multiplateformes utilisent aujourd'hui des langages de script pour une logique spécifique au jeu. Unity ne vous permet même pas d'approcher leur code source par exemple (bien que vous puissiez écrire des plugins natifs). Cela peut aider à accélérer les cycles de développement et à maintenir le portage au minimum car les langages de script sont assez indépendants de la plate-forme (en particulier les langages interprétés fonctionnant dans une machine virtuelle). Le but de mon langage est de permettre à la fois JIT (principalement pour gagner du temps de développement) et la compilation statique.

Remarque 3: si vous ne l'avez pas déjà découvert. Si vous n'utilisez pas SDL ou une autre solution qui résume les spécificités de la plate-forme, vous devrez utiliser les fonctionnalités d'interface C / C ++ spécifiques à chaque plate-forme. Avec iOS, c'est assez simple dans XCode car le compilateur (clang comme mentionné ci-dessus) prend déjà en charge C / C ++. Avec Android, vous devez utiliser lesappels NDK et marshall entre Java et C / C ++.

Matthew Sanders
la source
1
J'ai regardé le code source du moteur Godot. Cela semble un peu excessif; Je préfère créer le mien sans les fonctionnalités dont je n'ai pas besoin. Je ne sais pas trop comment faire cela, cependant. Je n'ai pas encore réussi à exécuter de code C ++ sur Android.
Craig Horwood
hehe ... ya NDK n'est pas un pique-nique. Honnêtement, je trouve que Google a besoin d'aide dans la catégorie de convivialité pour les développeurs. L'utilisation de SDL est-elle interdite pour vous? J'ai beaucoup plus d'informations avec lesquelles je peux mettre à jour la réponse si nécessaire.
Matthew Sanders
SDL n'est pas interdit, mais je préfère ne pas y aller. Encore une fois, il y a toujours ce petit bout de savoir qu'il aurait pu être fait sans cadre.
Craig Horwood
Je suis constamment mordu par ce bug, donc je sais ce que vous ressentez. J'ai utilisé le NDK dans le passé et je ne pense pas que la configuration et la compilation aient beaucoup changé. J'espère que le débogage s'est amélioré, car vous avez dû utiliser GDB directement par le passé via un terminal et l'IDE n'avait aucun support pour cela, mais il semble qu'ils aient commencé à ajouter le support NDK au studio Android . Avez-vous essayé l' exemple hellojni ?
Matthew Sanders
NDK est l'une des choses les plus dégoûtantes qui existent, vous pourriez trouver bgfx utile comme référence github.com/bkaradzic/bgfx , il n'est pas aussi fin que vous le souhaitez, mais il a plusieurs
backends de