【问题标题】:OpenGL ES difference for iOS and AndroidiOS 和 Android 的 OpenGL ES 区别
【发布时间】:2014-01-21 14:16:34
【问题描述】:

我有一个适用于 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);

而安卓的则不然。

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

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

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

在两个平台上一切正常,但我想全面了解正在发生的事情。谁能解释一下这两个差异背后的原因?

【问题讨论】:

  • 这两套代码都使用ES 1.0吗?
  • 是的,我可以看到:#if defined PLATF_IOS #include #elif defined PLATF_ANDROID #include #endif

标签: android ios opengl-es


【解决方案1】:

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

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

【讨论】:

  • 对于那些试图在 IOS 和 Android 之间移植 OpenGL 应用程序的人来说,这是一个很好的答案(也是一个问题)。
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多