2009-10-24 3 views
9

Ich plane ein Java 3D-Spiel zu schreiben, das sowohl auf PC als auch auf Android funktioniert. Leider sieht es so aus, als gäbe es für beide Plattformen keine gemeinsame OpenGL-API.Schreiben einer portablen Java-Anwendung mit JOGL und Android OpenGL

Unterscheiden sich die APIs signifikant? Gibt es eine Möglichkeit, den gleichen 3D-Code in beiden Versionen zu verwenden? Ist es eine gute Idee?

+0

Nette Frage - Portabilität auf mobilen Plattformen ist immer noch keine Realität. – whatnick

+0

Versuchen Sie, Qt zu verwenden. Es ist plattformübergreifend und funktioniert unter Windows, Mac OS X, Linux, iOS, Android, BlackBerry, Windows RT und (bald) Windows Phone.Es bietet die minimale Anzahl von OpenGL-Funktionen, die auf allen Plattformen kompatibel sind, aber Sie können auch OpenGL-Funktionen verwenden, die für jede Plattform spezifisch sind (z. B. vollständige OpenGL-Funktionalität auf Desktops). – trusktr

Antwort

10

Android unterstützt OpenGL ES 1.0, das sich mit OpenGL 1.3 überschneidet, also sollte dies möglich sein, aber es ist nicht so einfach, die JAR-Dateien zur Laufzeit zu ersetzen.

Es ist eine gute Idee zu versuchen, so viel wie möglich Ihrer Anwendung auf beiden Plattformen zu verwenden. Wie auch immer, es ist generell eine gute Praxis, den Rest von Code von externen Abhängigkeiten wie OpenGL zu isolieren, auch wenn Sie OpenGL ES nicht unbedingt benötigen. Sie wissen nie, auf welche API/Plattform Sie Ihre Anwendung in Zukunft möglicherweise portieren möchten.

Es sind 2 Optionen verfügbar.

Die erste besteht darin, die OpenGL-Implementierung hinter einer Schnittstelle zu verbergen, die der Rest Ihrer Anwendung verwendet, und dann separate Implementierungen von Jogl und Androide bereitzustellen. Abhängig von der Plattform, auf der Sie arbeiten, können Sie dann die korrekte Implementierung zur Laufzeit mithilfe des Factory-Patterns instanziieren.

Da OpenGL ES und OpenGL sehr ähnlich sind, sollte der Aufwand nicht zu hoch sein, wenn Sie sich an die üblichen Funktionen halten.

Die andere Möglichkeit ist es, Jogl2 zu verwenden, das Profile unterstützt. Diese scheinen genau das zu bieten, was Sie brauchen, aber Jogl2 ist noch in der Betaversion.

Die untere Seite spricht ein wenig über Profile: http://kenai.com/projects/jogl/pages/FAQ

Profile erlauben Java-Anwendungen in einer Weise, die Kompatibilität zur gleichen Zeit mit mehreren OpenGL-Versionen können geschrieben werden. Da OpenGL ES (GL für eingebettete Systeme) überlappende Funktionalität mit OpenGL selbst hat, eröffnete es die Möglichkeit, sogar Profile hinzuzufügen, die Desktop- und eingebettete Implementierungen überbrücken.

Sie können diese http://michael-bien.com/mbien/entry/jogl_2_opengl_profiles_explained für weitere Informationen über Profile lesen.

+0

Sehr gut recherchierte Antwort. Es gibt eine nette OS JOGL-Anwendung namens worldwind, an der ich arbeite, und ich würde dafür bezahlen, dass sie auf Android läuft. – whatnick

1

Es gibt tatsächlich ziemlich viel Unterschied zwischen java3d und der Android OpenGL API. Zuerst ist Java3d eine Abstraktion auf höherer Ebene auf 3d. Und selbst wenn Sie etwas wie JOGL verwenden würden, würde es einige Unterschiede in den APIs geben. Ihre beste Wette wäre, die tatsächliche 3D-Zeichnung-Implementierung in der Code-Basis zu abstrahieren, können Sie den Rest der Logik teilen, aber dann plattformspezifischen Code, um die OpenGL/3D-Zeichnung zu behandeln.

4

Das Projekt ist abgeschlossen. Es stellte sich heraus, dass sich die APIs etwas unterscheiden, aber funktional gibt es einen gemeinsamen Teil. Am Ende haben wir einen einfachen Präprozessor geschrieben, der den JOGL-Code in die ES-Version konvertiert und die Konvertierung mit Eclipse automatisiert hat.

+2

würden Sie den Präprozessor teilen? – Rom1

+0

Bitte teilen Sie den Präprozessor. Ich bin mit dem gleichen Problem konfrontiert – jmishra

+2

Nicht sicher, ob es hilft, könnten Sie wahrscheinlich mit der Verwendung von GCC cpp. Wie auch immer, hier ist unser Projekt (Netacka 3D): http://students.mimuw.edu.pl/~pm262952/netacka/ Hier ist der Präprozessor (in Python): http://pastebin.com/iPjDHiTR Und ein Beispiel Quelldatei: http://pastebin.com/vwHGcyC0 – hmp

1

Da JOGL-ES vor einigen Jahren in JOGL 2.x integriert wurde, können Sie JOGL nun sowohl in Desktop- als auch in mobilen Umgebungen (Android) verwenden.