android - iOS 和 Android 的 OpenGL ES 区别

标签 android ios opengl-es

我有一个在 iOS 和 Android 上都可以运行的 OpenGL ES 应用程序。大部分代码是很久以前由另一个人编写的,现在我必须维护它。 OpenGL 的使用似乎相当简单(该游戏是 2D 的,并且仅以简单的方式使用带纹理的 Sprite )。但我看到 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);

而 Android 的则没有。

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

iOS 代码不会做这些事情。它只是通过调用 [m_displayLink setPaused:YES];

暂停渲染循环

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

一切在两个平台上都运行良好,但我想全面了解发生了什么。任何人都可以向我解释这两个差异背后的基本原理吗?

最佳答案

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

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

关于android - iOS 和 Android 的 OpenGL ES 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233307/

相关文章:

ios - OpenGL ES渲染为UIImage,图像为黑色

java - android中进度对话的时间限制

java - android: 尝试转换 fragment 时出现 ClassCastException

java - Android:创建自定义容器 View

ios - 从 GameVC 移动到另一个 View Controller

android - 在 Android 中获取 OpenGL 窗口的大小

java - 泰卢固语字体(泰卢固语连词)在 Android 2.2 中无法正常工作

ios - EXC_BAD_ACCESS 仅适用于运行 iOS 8 的 xcode 8

ios - 如何使用 FirebaseAuth 错误代码?

iOS - 如何使用 OpenGLES 创建自定义 GPUImageFilters