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:
- Pasar variables entre el renderizador y otra clase con queueEvent ()
- Recibe la entrada completa de unicode android en C / C ++
- Cómo configurar la previsualización de la cámara como fondo a la vista de superficie en rajawali y captura de pantalla con 3D Obj & Vista previa de la cámara
- OBJ vs 3DS - ¿Cuál es el mejor formato para Android 3D de Desarrollo
- Verificar si el punto está dentro de un cono en el espacio 3D
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?
- Función glext.h no resuelta
- EglSwapBuffers falló: EGL_BAD_ALLOC AndEngine Android
- Android OpenGL - ES Sangrado de textura
- ¿Qué tipo de efectos secundarios tiene libgdx numSamples?
- Filtro esférico en android
- GLES10.glGetIntegerv devuelve 0 sólo en Lollipop
- OpenGLES mezcla de partículas pero no de fondo
- Pasar atributos personalizados a un shader de fragmentos personalizado
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.