Cette question est en partie technique, en partie méta, en partie subjective et très spécifique:
Je suis un développeur de jeux indépendants travaillant sur Android, et pendant les 6 derniers mois, jai eu du mal et jai finalement réussi à créer ma propre application de jeu 3D pour Android. Jai donc pensé « sauter sur SO et aider dautres personnes aux prises avec Android et openGL-ES
Cependant, la grande majorité des questions concernent lextension de GLSurfaceView
. Jai créé toute mon application sans étendre GLSurfaceView
(et cela fonctionne correctement). Je ne vois aucune raison détendre GLSurfaceView
pour la majorité des questions que je rencontre.
Pire encore, la documentation Android implique que vous devriez le faire, mais ne donne aucune explication détaillée sur pourquoi ou quels sont les avantages / inconvénients par rapport à ne pas étendre et à tout faire en implémentant votre propre GLSurfaceView.Renderer
comme je lai fait
Pourtant, le grand nombre de questions où le problème est purement lié à lextension de GLSurfaceView
me fait me demander sil y a vraiment une bonne raison de le faire de cette façon par rapport à la façon dont je le fais (et suggérant dans mes réponses aux autres de faire).
Alors, y a-t-il quelque chose Je suis absent? Dois-je arrêter de répondre aux questions entre-temps?
Commentaires
Réponse
Jai une extension très minimale pour mon GLSurfaceView
, et la plus grande partie de la sagesse appartient à mon implémentation de GLSurfaceView.Renderer
. Jai eu les trois raisons suivantes dutiliser un wrapper pour GLSurfaceView
:
-
La base
GLSurfaceView
ne fournit aucun moyen de récupérer linstanceRenderer
. Jai plusieurs surfaces et lorsque je reçois un événement dinterface utilisateur pour lune dentre elles, je souhaite transmettre la commande au moteur de rendu correspondant. Donc, je remplacesetRenderer
et je garde la référence dans ma classe étendue. -
GLSurfaceView.Renderer
ne reçoit pas de notifications pouronDetachedFromWindow()
ousurfaceDestroyed()
. Cela a causé quelques problèmes à mon implémentation. Mon extension deGLSurfaceView
remplace ces méthodes et informe le mRenderer . Cest possible à cause de § 1 . -
Certaines méthodes ne sont encapsulées que pour ajouter
try { super.
peu importe; } catch() { log(
peu importe) }
. Par exemple,queueEvent()
lancera si Renderer nest pas défini; mais pour moi, cest OK pour ignorez simplement ces incohérences dans la chronologie.
Commentaires
- I ' Jai commencé à faire cela aussi, bien que la question vise davantage à savoir pourquoi vous pourriez placer la logique réelle dans un
GLSurfaceView
étendu plutôt queGLSurfaceView.Renderer
. Bien que sur le point 1, je garde le moteur de rendu comme variable dans mon activité. En théorie, je peux lobtenir de nimporte où en transposant le contexte:((MyActivity)view.getContext()).getRenderer()
. Peut-être un peu plus dangereux car l’objet de contexte n’est pas forcémentMyActivity
- Cela ' est parfait si vous avez un moteur de rendu. Mais comme je lai déjà dit, nous avons de nombreux rendus, et ils sont connectés à différents SurfaceViews – un gâchis!
Réponse
Au moins une bonne raison détendre GLSurfaceView est de pouvoir linstancier directement à partir dun fichier xml de mise en page, comme nimporte quel autre widget:
<RelativeLayout ... > <com.example.MyGlSurfaceView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
Commentaires
- Vous pouvez le faire de toute façon en utilisant
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Bon point. La différence est que dans mon exemple, le framework Android gonfle et configure tout sans avoir besoin de lignes de code supplémentaires. Votre méthode est plus de code, mais flexible pour remplacer limplémentation. À part cela, les deux manières semblent similaires.
Réponse
Eh bien … GLSurfaceView est, comme je suis Bien sûr, vous avez remarqué, juste un wrapper pour le bien commun. Il encapsule toutes les fonctionnalités dont on aurait besoin pour rendre avec opengl, ayant la possibilité de l incorporer joliment avec la hiérarchie Android View.
Vous navez pas fourni votre alternative, il est donc impossible de comparer, mais jespère que vous avez engendré un autre thread pour le rendu comme le fait GLSurfaceView, ou votre entrée utilisateur pourrait être retardée.
Encore une fois: GLSurfaceView fournit un nouveau thread pour le rendu, vous navez donc pas à vous soucier du décalage dentrée utilisateur
Commentaires
- Oui, mais
GLSurfaceView
fait cela (démarre un thread de rendu) même si vous ne létendez pas '. JutiliseGLSurfaceView
, mais je ne ' que létendre. Je ' m demande quels sont les avantages de l’étendre et de remplacer les différentes méthodes qui y figurent plutôt que de tout avoir dans leRenderer
- welp, jai essayé 🙂 Je vais peut-être y réfléchir plus tard, maintenant ça mintéresse aussi!
onResume()