适用于iOS和Android的OpenGL ES差异

Nic*_*ick 5 android opengl-es ios

我有一个适用于iOS和Android的OpenGL ES应用程序.大多数代码是很久以前由另一个人编写的,现在我必须维护它.OpenGL的使用看起来相当简单(游戏是2D,只使用纹理精灵以简单的方式).但我发现iOS和Android的图形代码实现存在两个主要差异:

1)iOS代码包含以下代码:

    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);
Run Code Online (Sandbox Code Playgroud)

而Android则没有.

2)当Android应用程序进入后台时,所有OpenGL纹理都被销毁(glDeleteTextures)并且EGL被关闭eglTerminate.当应用程序从睡眠状态返回时,将重新初始化EGL并重新创建纹理.

iOS代码不做这些事情.它只是通过调用暂停渲染循环[m_displayLink setPaused:YES];

其他与OpenGL相关的代码与iOS和Android相同.

一切都适用于两个平台,但我想要充分了解正在发生的事情.任何人都可以向我解释这两种差异背后的理由吗?

Muz*_*zza 12

1)这只是API的一个区别.在iOS上,您可以创建自己的帧缓冲区以在应用程序启动时呈现.在Android上,framebuffer是在GLSurfaceView中自动创建的,因此App不需要创建自己的.

2)在iOS上,当你的应用程序进入后台时,会保留OpenGL上下文,这意味着当你将它返回到前台时,所有的纹理和缓冲区仍然存在.较旧版本的Android只有一个OpenGL上下文,因此只要你的应用程序进入后台就会销毁它(这样其他应用程序就可以使用它).Android的更高版本可以选择通过调用setPreserveEGLContextOnPause来更像iOS.但是,要实现此功能,Android版本必须为3.x或更高版本(API 11),并且设备也必须支持它.当不使用或支持它时,应用程序必须在后台和前台之间删除并重新创建它的所有OpenGL资源,这正是您的应用程序似乎正在执行的操作.