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?

Android openGL-Dokumentation

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:

  1. Die Basis GLSurfaceView bietet keine Möglichkeit, die Renderer -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 ich setRenderer und behalte die Referenz in meiner erweiterten Klasse.

  2. GLSurfaceView.Renderer erhält keine Benachrichtigungen für onDetachedFromWindow() oder surfaceDestroyed(). Dies verursachte einige Probleme bei meiner Implementierung. Meine Erweiterung von GLSurfaceView überschreibt diese Methoden und lässt den mRenderer wissen. Dies ist möglich aufgrund von § 1 .

  3. Einige Methoden werden nur umbrochen, um try { super. was auch immer ; } catch() { log( hinzuzufügen Was auch immer ) }. Zum Beispiel wird queueEvent() 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 in GLSurfaceView.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 unbedingt MyActivity
  • 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 verwende GLSurfaceView, aber ' erweitere es nicht. Ich ' frage, welche Vorteile es hat, es zu erweitern und die verschiedenen Methoden darin zu überschreiben, anstatt nur alles in der Renderer
  • welp, ich habe es versucht 🙂 Ich könnte es später untersuchen, jetzt bin ich auch interessiert!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.