Esta pregunta es en parte técnica, en parte meta, en parte subjetiva y muy específica:
Soy un desarrollador de juegos independiente que trabaja en Android, y durante los últimos 6 meses he tenido problemas y finalmente he logrado crear mi propia aplicación de juegos 3D para Android. Así que pensé en subirme a SO y ayudar a otros que luchan con Android y OpenGL-ES
Sin embargo, la gran mayoría de las preguntas se relacionan con la extensión GLSurfaceView
. Hice toda mi aplicación sin extenderla GLSurfaceView
(y funciona bien). No veo ninguna razón para extender GLSurfaceView
la mayoría de las preguntas que encuentro.
Peor aún, la documentación de Android implica que deberías hacerlo, pero no da una explicación detallada de por qué o cuáles son los pros / contras frente a no extender y hacer todo a través de la implementación de la tuya GLSurfaceView.Renderer
como lo hice yo.
Aún así, el gran volumen de preguntas en las que el problema tiene que ver únicamente con la extensión GLSurfaceView
me hace preguntarme si realmente hay alguna razón realmente buena para hacerlo de esa manera frente a la forma en que lo he estado haciendo (y sugiriendo en mis respuestas a otros que hacer).
Entonces, ¿hay algo que me falta? ¿Debo dejar de responder preguntas mientras tanto?
onResume()
Respuestas:
Tengo una extensión mínima para mi
GLSurfaceView
, y la mayor parte de la sabiduría pertenece a mi implementación deGLSurfaceView.Renderer
. Tenía las siguientes tres razones para usar un contenedor paraGLSurfaceView
:La base
GLSurfaceView
no proporciona forma de recuperar laRenderer
instancia. Tengo varias superficies, y cuando recibo un evento de IU para una de ellas, quiero pasar el comando al renderizador correspondiente. Entonces, anulosetRenderer
y mantengo la referencia en mi clase extendida.GLSurfaceView.Renderer
no recibe notificaciones deonDetachedFromWindow()
osurfaceDestroyed()
. Esto causó algunos problemas a mi implementación. Mi extensión deGLSurfaceView
anula estos métodos y se lo hace saber al mRenderer . Es posible debido a §1 .Algunos métodos solo se envuelven para agregar
try { super.
lo que; } catch() { log(
sea) }
. Por ejemplo,queueEvent()
lanzará si Renderer no está configurado; pero para mí, está bien simplemente ignorar tales inconsistencias en la línea de tiempo.fuente
GLSurfaceView
lugar de hacerloGLSurfaceView.Renderer
. Aunque en el punto 1, mantengo el renderizador como una variable en mi actividad. En teoría lo puedo conseguir desde cualquier lugar colando el contexto:((MyActivity)view.getContext()).getRenderer()
. Tal vez un poco más peligroso ya que el objeto de contexto puede no ser necesariamente necesarioMyActivity
Al menos una buena razón para extender GLSurfaceView es poder instanciarlo directamente desde un archivo xml de diseño, como cualquier otro widget:
fuente
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Bueno ... GLSurfaceView es, como estoy seguro de que has notado, solo un contenedor para el bien común. Encapsula toda la funcionalidad que uno necesitaría para renderizar con opengl, teniendo la opción de incorporarlo bien con la jerarquía de Vista de Android.
No proporcionó su alternativa, por lo que es imposible comparar, pero espero que haya generado otro hilo para renderizar como lo hace GLSurfaceView, o su entrada de usuario podría retrasarse.
Así que de nuevo: GLSurfaceView proporciona un nuevo hilo para renderizar, por lo que no tiene que preocuparse por el retraso de entrada del usuario
fuente
GLSurfaceView
hace (comienza un hilo de renderizado) incluso si no lo extiende. Yo usoGLSurfaceView
, pero no lo extiendo. Estoy preguntando qué beneficios hay al extenderlo y anular los diferentes métodos allí en lugar de tener todo en elRenderer