Diese Frage ist teils technisch, teils meta, teils subjektiv und sehr spezifisch:
Ich bin ein Indie-Game-Entwickler, der an Android arbeitet, und in den letzten 6 Monaten habe ich gekämpft und es endlich geschafft, meine eigene 3D-Game-App für Android zu entwickeln. Also dachte ich, ich würde auf SO setzen und anderen helfen, die mit Android und OpenGL-ES zu kämpfen haben
Die allermeisten Fragen beziehen sich jedoch auf die Verlängerung GLSurfaceView
. Ich habe meine gesamte App ohne Erweiterung erstellt GLSurfaceView
(und sie läuft einwandfrei). Ich sehe überhaupt keinen Grund GLSurfaceView
, mich auf die meisten Fragen zu beschränken, auf die ich stoße.
Schlimmer noch, die Android-Dokumentation impliziert, dass Sie es sollten, gibt aber keine detaillierte Erklärung, warum oder was die Vor- / Nachteile sind und nicht alles zu erweitern und zu tun, indem Sie Ihre eigenen implementieren, GLSurfaceView.Renderer
wie ich es getan habe
Die Fülle von Fragen, bei denen das Problem ausschließlich in der Erweiterung GLSurfaceView
besteht, lässt mich jedoch fragen, ob es tatsächlich einen guten Grund gibt, dies so zu tun, als ich es bisher getan habe (und meine Antworten anderen vorzuschlagen machen).
Also, fehlt mir etwas? Sollte ich in der Zwischenzeit aufhören, Fragen zu beantworten?
onResume()
Antworten:
Ich habe eine sehr minimale Erweiterung für meine
GLSurfaceView
, und der größte Teil der Weisheit gehört zu meiner Implementierung vonGLSurfaceView.Renderer
. Ich hatte die folgenden drei Gründe, einen Wrapper zu verwendenGLSurfaceView
:Die Basis
GLSurfaceView
bietet keine Möglichkeit, dieRenderer
Instanz zurückzugewinnen. Ich habe mehrere Oberflächen, und wenn ich ein UI-Ereignis für eine davon erhalte, möchte ich den Befehl an den entsprechenden Renderer übergeben. Also überschreibe ichsetRenderer
und behalte die Referenz in meiner erweiterten Klasse.GLSurfaceView.Renderer
Erhält keine Benachrichtigungen füronDetachedFromWindow()
odersurfaceDestroyed()
. Dies verursachte einige Probleme bei meiner Implementierung. Meine Erweiterung vonGLSurfaceView
überschreibt diese Methoden und teilt dem mRenderer dies mit . Es ist wegen §1 möglich .Einige Methoden werden nur umbrochen, um
try { super.
was auch; } catch() { log(
immer hinzuzufügen) }
. Zum BeispielqueueEvent()
wird ausgelöst, wenn der Renderer nicht gesetzt ist. Für mich ist es jedoch in Ordnung, solche Inkonsistenzen auf der Zeitachse einfach zu ignorieren.quelle
GLSurfaceView
eher in eine erweiterte als in eineGLSurfaceView.Renderer
. In Punkt 1 behalte ich den Renderer als Variable in meiner Aktivität. In der Theorie kann ich es von überall erhalten , indem Sie das Kontext Gießen:((MyActivity)view.getContext()).getRenderer()
. Vielleicht ein bisschen gefährlicher, da das Kontextobjekt nicht unbedingt sein mussMyActivity
Mindestens ein guter Grund für die Erweiterung von GLSurfaceView besteht darin, dass es wie jedes andere Widget direkt aus einer Layout-XML-Datei instanziiert werden kann:
quelle
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Nun ... GLSurfaceView ist, wie Sie sicherlich bemerkt haben, nur ein Wrapper für das Gemeinwohl. Es kapselt alle Funktionen, die man zum Rendern mit opengl benötigt, und bietet die Möglichkeit, es gut in die Android View-Hierarchie zu integrieren.
Sie haben Ihre Alternative nicht angegeben, so dass ein Vergleich unmöglich ist, aber ich hoffe, Sie haben einen anderen Thread zum Rendern erzeugt, wie dies bei GLSurfaceView der Fall ist, da Ihre Benutzereingaben möglicherweise verzögert werden.
Also nochmal: GLSurfaceView stellt einen neuen Thread zum Rendern bereit, sodass Sie sich nicht um die Verzögerung von Benutzereingaben kümmern müssen
quelle
GLSurfaceView
macht das (startet einen Rendering-Thread), auch wenn Sie ihn nicht erweitern. Ich benutzeGLSurfaceView
, aber ich verlängere es nicht. Ich frage mich, welche Vorteile es hat, wenn man es erweitert und die darin enthaltenen Methoden außer Kraft setzt, anstatt einfach alles imRenderer