Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL在iOS和Android上的差异_Android_Ios_Opengl Es - Fatal编程技术网

OpenGL在iOS和Android上的差异

OpenGL在iOS和Android上的差异,android,ios,opengl-es,Android,Ios,Opengl Es,我有一个OpenGL ES应用程序,可以在iOS和Android上运行。大部分代码是很久以前由另一个人编写的,现在我必须维护它。OpenGL的使用似乎相当简单(游戏是2D的,只以简单的方式使用纹理精灵)。但我看到了iOS和Android在图形代码实现方面的两个主要区别: 1) iOS代码包含以下代码: glGenFramebuffersOES(1, &m_defaultFramebuffer); glGenRenderbuffersOES(1, &m_colorR

我有一个OpenGL ES应用程序,可以在iOS和Android上运行。大部分代码是很久以前由另一个人编写的,现在我必须维护它。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
),EGL将使用
eglTerminate
关闭。当应用程序从睡眠状态返回时,EGL被重新初始化,纹理被重新创建

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

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

这两个平台上的一切都很好,但我想全面了解正在发生的事情。有人能给我解释一下这两种差异背后的原因吗 这只是API中的一个区别。在iOS上,您可以创建自己的帧缓冲区,以便在应用程序启动时渲染。在Android上,帧缓冲区是在GLSurfaceView中自动创建的,因此应用程序不需要创建自己的帧缓冲区

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

这两套代码都使用ES 1.0吗?是的,正如我所看到的:#如果定义了PLATF#IOS#包含#如果定义了PLATF#ANDROID#包含#如果这是一个很好的答案(还有一个问题)对于那些试图在IOS和Android之间移植OpenGL应用程序的人来说。