2010-05-03 15 views
8

La interfaz GLSurfaceView.Renderer del Android SDK me da una interfaz GL como parámetro que tiene el tipo GL10. Esta interfaz es implementada por alguna clase privada interna jni wrapper. Pero también está la clase GLES10, donde todos los métodos GL están disponibles como métodos estáticos. ¿Hay alguna diferencia importante entre ellos? Entonces, ¿qué sucede si ignoro el parámetro gl de onDrawFrame y en su lugar uso los métodos estáticos de GLES10 en todas partes?Diferencia entre GL10 y GLES10 en Android

Aquí hay un ejemplo. En vez de hacer esto:

void onDrawFrame(GL10 gl) 
{ 
    drawSomething(gl); 
} 

void drawSomething(GL10 gl) 
{ 
    gl.glLoadIdentity(); 
    ... 
} 

que podía hacer esto:

void onDrawFrame(GL10 gl) 
{ 
    drawSomething(); 
} 

void drawSomething() 
{ 
    GLES10.glLoadIdentity(); 
    ... 
} 

La ventaja es que no tengo que pasar el contexto GL a todos los llamados métodos. Pero incluso funciona (Y funciona, lo probé). Me pregunto si hay desventajas y razones para NO hacerlo así.

Respuesta

6

He estado hurgando en el código fuente tratando de responder a esa pregunta. Por lo que puedo decir, ambas formas de invocar la implementación de OpenGL van a la misma llamada de función nativa. Sin embargo, tengo entendido que el acceso del lado de Java es más rápido a través de métodos estáticos en lugar de a través del envío de métodos virtuales (consulte http://developer.android.com/guide/practices/design/performance.html#prefer_static).

La compensación es que sacrifica una cierta cantidad de comprobación de tipos al acceder a llamadas que solo están disponibles en versiones posteriores de OpenGL. Cuando accede a la llamada a través del objeto, primero debe realizar un lanzamiento, y ese lanzamiento fallará si la versión de GL que está utilizando no es compatible con la interfaz. Al acceder a la llamada a través del método estático, creo que lo que sucederá es que se establecerá el estado de error de OpenGL, que puede ser más difícil de detectar a menos que haya configurado el modo de depuración en GLSurfaceView.

Por ahora estoy accediendo a todo a través de los métodos estáticos, y dejaré el modo de depuración en GLSurfaceView hasta que el código sea estable, en cuyo punto lo apagaré.

  • Kris
Cuestiones relacionadas