Diese Frage ist teils technisch, teils meta, teils subjektiv und sehr spezifisch:
Ich bin ein Indie-Entwickler Ich habe an Android gearbeitet und in den letzten 6 Monaten hatte ich Probleme und es gelang mir schließlich, meine eigene 3D-Spiel-App für Android zu entwickeln. Also dachte ich, ich würde auf SO hüpfen und anderen helfen, die mit Android und openGL-ES zu kämpfen haben.
Die überwiegende Mehrheit der Fragen bezieht sich jedoch auf die Erweiterung von GLSurfaceView
. Ich habe meine gesamte App erstellt, ohne GLSurfaceView
zu erweitern (und es läuft einwandfrei). Ich kann überhaupt keinen Grund erkennen, GLSurfaceView
für zu erweitern Die meisten Fragen, auf die ich stoße.
Schlimmer noch, die Android-Dokumentation impliziert, dass Sie dies tun sollten, gibt jedoch keine detaillierte Erklärung, warum oder was die Vor- / Nachteile sind, anstatt nicht alles durch Implementierung Ihrer eigenen zu erweitern und zu tun GLSurfaceView.Renderer
wie ich
Trotzdem ist das schiere Fragenvolumen, bei dem das Problem ausschließlich mit der Erweiterung von GLSurfaceView
zu tun hat Ich frage mich, ob es tatsächlich einen wirklich guten Grund gibt, es so zu machen, wie ich es getan habe (und in meinen Antworten anderen vorschlage, es zu tun).
Gibt es also etwas? Ich vermisse? Sollte ich in der Zwischenzeit aufhören, Fragen zu beantworten?
Kommentare
- nette Frage, die ich gerne beantworten möchte.
- Ein Grund, warum GLSurfaceView erweitert werden kann, finden Sie hier: gamedev. stackexchange.com/questions/12629/… Ohne es zu merken, habe ich die in dieser Frage angesprochenen Probleme in meiner eigenen App bereits umgangen, indem ich Texturen usw.
onResume()
Antwort
Ich habe eine sehr minimale Erweiterung für mein GLSurfaceView
, und der größte Teil der Weisheit gehört zu meiner Implementierung von GLSurfaceView.Renderer
. Ich hatte die folgenden drei Gründe, einen Wrapper für GLSurfaceView
zu verwenden:
-
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 lässt den mRenderer wissen. Dies ist möglich aufgrund von § 1 . -
Einige Methoden werden nur umbrochen, um
try { super.
was auch immer; } catch() { log(
hinzuzufügen Was auch immer) }
. Zum Beispiel wirdqueueEvent()
ausgelöst, wenn der Renderer nicht festgelegt ist. Für mich ist dies jedoch in Ordnung Ignorieren Sie solche Zeitleisteninkonsistenzen einfach.
Kommentare
- I ' Wir haben auch damit begonnen, obwohl die Frage eher darauf abzielt, warum Sie die eigentliche Logik möglicherweise in eine erweiterte
GLSurfaceView
anstatt inGLSurfaceView.Renderer
einfügen . Bei Punkt 1 behalte ich den Renderer als Variable in meiner Aktivität. Theoretisch kann ich es von überall her erhalten, indem ich den Kontext umsetze:((MyActivity)view.getContext()).getRenderer()
. Vielleicht etwas gefährlicher, da das Kontextobjekt nicht unbedingtMyActivity
- sein muss. ' ist in Ordnung, wenn Sie haben ein Renderer. Aber wie ich bereits sagte, haben wir viele Rendrers, die mit verschiedenen SurfaceViews verbunden werden – ein Durcheinander!
Antwort
Mindestens ein guter Grund, GLSurfaceView zu erweitern, besteht darin, es wie jedes andere Widget direkt aus einer Layout-XML-Datei instanziieren zu können:
<RelativeLayout ... > <com.example.MyGlSurfaceView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
Kommentare
- Sie können dies trotzdem mit
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- tun. Der Unterschied besteht darin, dass in meinem Beispiel das Android-Framework alles aufbläst und einrichtet, ohne dass zusätzliche Codezeilen erforderlich sind. Ihre Methode ist mehr Code, aber flexibel, um die Implementierung zu ersetzen. Davon abgesehen scheinen beide Möglichkeiten ähnlich zu sein.
Antwort
Nun … GLSurfaceView ist so wie ich Sicher haben Sie bemerkt, nur ein Wrapper für das Gemeinwohl. Er enthält alle Funktionen, die zum Rendern mit opengl erforderlich sind, und bietet die Möglichkeit, ihn gut in die Android View-Hierarchie zu integrieren.
Sie haben ihn nicht bereitgestellt Ihre Alternative ist also nicht zu vergleichen, aber ich hoffe, Sie haben einen anderen Thread zum Rendern erstellt, wie dies bei GLSurfaceView der Fall ist, oder Ihre Benutzereingaben können verzögert sein.
Also noch einmal: GLSurfaceView bietet einen neuen Thread zum Rendern, sodass Sie sich keine Gedanken über Verzögerungen bei Benutzereingaben machen müssen
Kommentare
- Ja, aber
GLSurfaceView
macht das (startet einen Rendering-Thread), auch wenn Sie ' erweitern es nicht. Ich verwendeGLSurfaceView
, aber ' erweitere es nicht. Ich ' frage, welche Vorteile es hat, es zu erweitern und die verschiedenen Methoden darin zu überschreiben, anstatt nur alles in derRenderer
- welp, ich habe es versucht 🙂 Ich könnte es später untersuchen, jetzt bin ich auch interessiert!