Plattformübergreifende C ++ / OpenGL ES-Entwicklung (iOS / Android) [geschlossen]

10

Ich habe bereits vernünftige Erfahrungen mit C ++ und OpenGL und habe mich kürzlich entschlossen, die Entwicklung mobiler Spiele auszuprobieren. Nachdem ich erfolgreich eine einfache OpenGL ES Android-App mit Java erstellt hatte, suchte ich nach Möglichkeiten, sowohl Android als auch iOS mit so wenig Umschreibcode wie möglich zu erreichen. Ich habe versucht, die stolz prahlerischen plattformübergreifenden App-Entwicklungstools von Visual Studio 2015 zu verwenden, fand sie jedoch zu neu und daher äußerst wenig dokumentiert. Ich konnte die Vorlagenprojekte erstellen, die mir das Programm gegeben hatte, aber ich konnte nicht herausfinden, wie ich angesichts dieser Vorlagen dem Spiel Assets hinzufügen oder Touchscreen-Eingaben verarbeiten konnte.

Ich habe einen leider spezifischen Wunsch, der zu spezifisch ist, um ihn bei Google zu finden. Ich möchte ein OpenGL ES-Spiel mit C ++ erstellen, mit dünnen plattformspezifischen Wrappern für Android und iOS. Die Leute haben mir ähnliche Fragen gestellt (wenn auch nicht genau die gleichen), und mehr als eine Person hat angegeben, dass das, was ich tun möchte, nicht nur möglich, sondern auch relativ einfach ist, da ich mich nicht um die Benutzeroberfläche kümmern muss.

Ich habe dieses Tutorial ausprobiert , aber es ist fast drei Jahre alt und daher wahrscheinlich für ältere Technologien konzipiert. Infolgedessen bin ich auf verschiedene nicht berücksichtigte Fehler gestoßen. Ab sofort ist dieses Tutorial jedoch das, was ich gefunden habe. Alles andere ist entweder nur für Android oder ich empfehle, Hunderte von Dollar pro Jahr für die Verwendung des Marmalade SDK zu zahlen. Manchmal möchte ich den Code nur zweimal schreiben, einmal in Java und einmal in Objective-C, aber ich bin motiviert von dem Wissen, dass diese Lösung möglich ist, aber aus irgendeinem Grund nirgendwo in modernen Details behandelt wird.

Zusammenfassend möchte ich ein OpenGL ES-Spiel für iOS und Android mit einer einzigen C ++ - Codebasis erstellen, die in kleine Mengen plattformspezifischen Codes eingeschlossen ist. Trotz der Tatsache, dass mehrere Leute diesen Ansatz empfohlen haben, kann mir niemand sagen, wie es geht. Kann mir jemand sagen, ob es tatsächlich möglich ist und wenn ja, was ich tun kann oder wohin ich gehen kann, um zu lernen, wie?

Craig Horwood
quelle
versuchen Sie cocos2d-x oder entity3d
Ali1S232
1
unit3d ist weit entfernt von den Anforderungen des OP, da Sie keinen Quellzugriff haben. Ich habe cocos2d-x verwendet und die Kompilierungsprobleme sind bis zu einem gewissen Grad immer noch vorhanden. Der Objective-C-Einfluss ist ebenfalls zu spüren, manche mögen das vielleicht, aber für mich ist das ein Ausschalten. Es handelt sich jedoch um eine Open-Source-Lösung, die es möglicherweise wert ist, von den OP untersucht zu werden.
Matthew Sanders

Antworten:

6

Meine Antwort auf eine ähnliche Frage kann hier hilfreich sein.

Es kann auch hilfreich sein, den Quellcode anderer Lösungen zu untersuchen. Die Godot Engine zum Beispiel ist eine plattformübergreifende Open Source-Spiel-Engine, sodass Sie nie etwas bezahlen müssen.

Wie ich in meiner anderen Antwort erwähne , müssen Sie sich nicht auf eine IDE verlassen (und können dies wahrscheinlich auch nicht), um die Arbeit für Sie zu erledigen. CMake , Scons und viele andere Build-Tools können beim plattformübergreifenden Kompilierungs- / Build-Prozess helfen.

Godot Engine verwendet beispielsweise Scons und das LLVM- Projekt (auch bekannt als das Compiler-Framework, das vom Clang des C / C ++ / Objective-C-Compilers verwendet wird) verwendet CMake .

Ein beliebter Ansatz für Spiele ist das Erstellen einer Engine in C / C ++ und, wie Sie bereits erwähnt haben, das Abstrahieren von Plattformspezifikationen. Wenn es um iOS und Android geht, ist dies die Lebenszyklusverwaltungslogik, die mit dem Betriebssystem verbunden ist. Wenn Sie die Extrameile gehen und Emscripten verwenden möchten, um auch zu asm.js zu kompilieren und nahezu native Geschwindigkeit im Browser zu realisieren, tun Sie etwas Ähnliches, indem Sie die Hauptschleife hinter den RequestAnimationFrame- Aufrufen abstrahieren .

Emscripten empfiehlt die Verwendung von SDL , um den Portierungsprozess zu vereinfachen, da dies dazu beitragen kann, die Plattformspezifikationen zu abstrahieren. Nichts hindert Sie jedoch daran, dies selbst zu tun (außer viel Recherche, Debugging usw.).

Wenn Sie wirklich, wirklich verrückt sind, können Sie das tun, was ich tue, und Ihre eigene Sprache schreiben, indem Sie die Leistung von LLVM nutzen , um auf unterstützten Plattformen zu nativem C ABI oder sogar JIT zu kompilieren .

Der Punkt ist, dass es zwar möglich ist, aber einige Straßen komplizierter / zeitaufwändiger sind als andere.

Hinweis: Sie müssen wahrscheinlich Mac OSX über einen Mac, eine VM oder einen Hackintosh mit XCode verwenden , um auf iOS zu kompilieren. Dies ist einer von vielen Gründen, warum ich ein Macbook Pro als einen großartigen Kandidaten für ein Entwicklungssystem empfinde.

Anmerkung 2: Es ist erwähnenswert, dass viele plattformübergreifende Engines heutzutage Skriptsprachen für die spielspezifische Logik verwenden. Unity lässt Sie beispielsweise nicht einmal in die Nähe ihres Quellcodes (obwohl Sie native Plugins schreiben können). Dies kann dazu beitragen, die Entwicklungszyklen zu beschleunigen und die Portierung auf ein Minimum zu beschränken, da die Skriptsprachen ziemlich plattformunabhängig sind (insbesondere interpretierte Sprachen, die in einer VM ausgeführt werden). Das Ziel meiner Sprache ist es, sowohl JIT (hauptsächlich zur Einsparung von Entwicklungszeit) als auch statische Kompilierung zu ermöglichen.

Hinweis 3: Wenn Sie dies noch nicht herausgefunden haben. Wenn Sie kein SDL oder eine andere Lösung verwenden, die plattformspezifische Details abstrahiert, müssen Sie die spezifischen C / C ++ - Schnittstellenfunktionen jeder Plattform verwenden. Unter iOS ist dies in XCode ziemlich einfach, da der Compiler (wie oben erwähnt klingeln) bereits C / C ++ unterstützt. Unter Android müssen Sie die NDK- und Marshall-Aufrufe zwischen Java und C / C ++ verwenden.

Matthew Sanders
quelle
1
Ich habe mir den Quellcode der Godot Engine angesehen. Es scheint ein wenig übertrieben; Ich würde lieber meine eigenen ohne die Funktionen erstellen, die ich nicht brauche. Ich bin mir allerdings nicht ganz sicher, wie ich das machen soll. Ich konnte noch keinen C ++ - Code unter Android erfolgreich ausführen.
Craig Horwood
hehe ... ya NDK ist kein Picknick. Ehrlich gesagt finde ich alles, was Google braucht, um Hilfe in der Kategorie Entwicklerfreundlichkeit zu benötigen. Ist die Verwendung der SDL für Sie verboten? Ich habe viel mehr Informationen, mit denen ich die Antwort bei Bedarf aktualisieren kann.
Matthew Sanders
SDL ist nicht verboten, aber ich würde es vorziehen, nicht dorthin zu gehen. Wieder einmal gibt es immer das knifflige Wissen, das es ohne einen Rahmen hätte geben können.
Craig Horwood
Ich bin ständig von diesem Käfer gebissen, also weiß ich, wie du dich fühlst. Ich habe das NDK in der Vergangenheit verwendet und glaube nicht, dass sich an der Einrichtung und Kompilierung viel geändert hat. Ich hoffe, dass sich das Debuggen verbessert hat, da Sie GDB in der Vergangenheit direkt über das Terminal verwenden mussten und die IDE keine Unterstützung dafür hatte, aber es scheint, als hätten sie begonnen , Android Studio NDK-Unterstützung hinzuzufügen . Haben Sie das Hallojni-Beispiel ausprobiert ?
Matthew Sanders
NDK ist eine der abscheulichsten Dinge in Existenz, Sie bgfx nützlich als Referenz finden könnte github.com/bkaradzic/bgfx , es ist nicht so dünn wie Sie zwar vielleicht gefallen, es mehrere Rendering - Backends hat
JBeurer