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 au cours des 6 derniers mois, j'ai eu du mal et j'ai finalement réussi à créer ma propre application de jeu 3D pour Android. J'ai donc pensé sauter sur SO et aider les autres aux prises avec Android et openGL-ES
Cependant, la grande majorité des questions concernent l'extension GLSurfaceView
. J'ai fait toute mon application sans étendre GLSurfaceView
(et ça marche bien). Je ne vois aucune raison de m'étendre GLSurfaceView
à la majorité des questions que je rencontre.
Pire, la documentation Android implique que vous devriez le faire, mais ne donne aucune explication détaillée des raisons ou des avantages / inconvénients par rapport à ne pas étendre et tout faire en implémentant le vôtre GLSurfaceView.Renderer
comme je l'ai fait
Pourtant, le volume de questions où le problème est purement lié à l'extension GLSurfaceView
me fait me demander s'il y a vraiment une très bonne raison de le faire de cette façon par rapport à la façon dont je l'ai fait (et de suggérer dans mes réponses aux autres faire).
Alors, y a-t-il quelque chose qui me manque? Dois-je cesser de répondre aux questions entre-temps?
onResume()
Réponses:
J'ai une extension très minime pour moi
GLSurfaceView
, et la majeure partie de la sagesse appartient à mon implémentation deGLSurfaceView.Renderer
. J'ai eu les trois raisons suivantes pour utiliser un wrapper pourGLSurfaceView
:La base
GLSurfaceView
ne fournit aucun moyen de récupérer l'Renderer
instance. J'ai plusieurs surfaces et lorsque je reçois un événement d'interface utilisateur pour l'une d'entre elles, je souhaite passer la commande au rendu correspondant. Donc, je remplacesetRenderer
et conserve la référence dans ma classe étendue.GLSurfaceView.Renderer
ne reçoit pas de notifications pouronDetachedFromWindow()
ousurfaceDestroyed()
. Cela a causé des problèmes à ma mise en œuvre. Mon extension deGLSurfaceView
remplace ces méthodes et informe le mRenderer . C'est possible grâce au §1 .Certaines méthodes ne sont encapsulées que pour ajouter
try { super.
quoi; } catch() { log(
que ce soit) }
. Par exemple,queueEvent()
lancera si Renderer n'est pas défini; mais pour moi, c'est OK d'ignorer simplement ces incohérences de chronologie.la source
GLSurfaceView
plutôt queGLSurfaceView.Renderer
. Bien qu'au point 1, je garde le moteur de rendu comme variable dans mon activité. En théorie , je peux l' obtenir partout en jetant le contexte:((MyActivity)view.getContext()).getRenderer()
. Peut-être un peu plus dangereux car l'objet contextuel ne l'est pas nécessairementMyActivity
Au moins une bonne raison d'étendre GLSurfaceView est de pouvoir l'instancier directement à partir d'un fichier XML de mise en page, comme tout autre widget:
la source
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Eh bien ... GLSurfaceView est, comme je suis sûr que vous l'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'intégrer bien avec la hiérarchie de vue Android.
Vous n'avez pas fourni votre alternative, il est donc impossible de comparer, mais j'espère que vous avez généré un autre thread pour le rendu comme le fait GLSurfaceView, ou votre entrée utilisateur pourrait être en retard.
Encore une fois: GLSurfaceView fournit un nouveau thread pour le rendu, vous n'avez donc pas à vous soucier du décalage d'entrée utilisateur
la source
GLSurfaceView
fait cela (démarre un thread de rendu) même si vous ne le prolongez pas. J'utiliseGLSurfaceView
, mais je ne le prolonge pas. Je demande quels avantages y a-t-il à le prolonger et à remplacer les différentes méthodes qu'il contient plutôt que de tout avoir dansRenderer