Diferencia de OpenGL ES para iOS y Android

Tengo una aplicación OpenGL ES que funciona tanto en iOS como en Android. La mayor parte del código fue escrito hace siglos por otra persona y ahora tengo que mantenerlo. El uso de OpenGL parece bastante simple (el juego es 2D y usa sólo sprites texturados de una manera simple). Pero veo dos grandes diferencias en la realización de código de gráficos para iOS y Android:

1) El código iOS contiene este código:

glGenFramebuffersOES(1, &m_defaultFramebuffer); glGenRenderbuffersOES(1, &m_colorRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_defaultFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); 

Y uno de Android no.

2) Cuando la aplicación de Android pasa al fondo, todas las texturas de OpenGL se destruyen ( glDeleteTextures ) y EGL se apaga usando eglTerminate . Cuando la aplicación vuelve de dormir, EGL se reinicializa y las texturas se vuelven a crear.

El código de iOS no hace estas cosas. Simplemente hace una pausa en el bucle de rendering llamando a [m_displayLink setPaused:YES];

Otro código relacionado con OpenGL es el mismo para iOS y Android.

Todo funciona bien en ambas plataformas, pero quiero tener una comprensión completa de lo que está pasando. ¿Puede alguien explicarme una razón detrás de estas dos diferencias?

1) Esto es sólo una diferencia en las API. En iOS, creas tu propio framebuffer para renderizar cuando empiece la aplicación. En Android, el framebuffer se crea automáticamente en GLSurfaceView, por lo que la aplicación no necesita crear su propia.

2) En iOS, cuando su aplicación va al fondo, el contexto de OpenGL se conserva, lo que significa que todas sus texturas y búferes todavía están allí cuando lo devuelve al primer plano. Las versiones más antiguas de Android tenían sólo un contexto OpenGL único, por lo que se destruyó cada vez que su aplicación pasaba al fondo (para que otras aplicaciones pudieran utilizarla). Las versiones posteriores de Android tienen la opción de comportarse más como iOS llamando a setPreserveEGLContextOnPause. Sin embargo, para que esto funcione, la versión de Android tiene que ser 3.x o superior (API 11) y el dispositivo debe admitirlo también. Cuando no se utiliza o es compatible, la aplicación debe eliminar y volver a crear todos los recursos de OpenGL cuando se va entre fondo y primer plano, que es lo que su aplicación parece estar haciendo.

  • Android 2.2 Webview hace que OpenGL ES API no tenga ningún contexto actual (registrado una vez por hilo)
  • Muestra una fuente de video de gstreamer en Google Cartón SurfaceTexture
  • Android: aplica efectos de OpenGL a la cámara
  • Android: cómo averiguar la relación de aspecto exacta de píxeles de los dispositivos mediante programación?
  • ¿Cómo se muestra fps con opengl es (android)
  • Android, texto / fuente se procesa como cuadrados
  • Android Opengl 2.0 Alpha Mezcla tema - texturas medio transparentes
  • Android: LibGDX 2D consumo de memoria del juego
  • AndroidGameView + GC_MINOR
  • NVidia PerfHUD ES Tegra en Google Nexus 7
  • Obtención de la memoria intermedia OpenGL-ES Stencil Working
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.