2014-01-20 44 views
4

我有適用於iOS和Android的OpenGL ES應用程序。大部分代碼是由另一個人在幾年前寫的,現在我必須維護它。 OpenGL的使用看起來相當簡單(遊戲是2D的,只用簡單的方式使用紋理小精靈)。但我看到的圖形代碼實現iOS和Android兩大不同點:適用於iOS和Android的OpenGL ES差異

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。當應用程序從睡眠中返回時,EGL將重新初始化並重新創建紋理。

iOS代碼不會做這些事情。它只是通過調用[m_displayLink setPaused:YES];

來暫停渲染循環其他與OpenGL相關的代碼與iOS和Android相同。

在這兩個平臺上一切正常,但我想充分理解發生了什麼。有人可以解釋我背後的這兩個差異的基本原理嗎?

+0

這兩套使用ES 1.0的代碼? – NigelK

+0

是我可以看到: 的#if定義PLATF_IOS 的#include #elif指令定義PLATF_ANDROID 的#include #ENDIF – Nick

回答

7

1) 這只是API的區別。在iOS上,您可以創建自己的幀緩衝以在App啓動時呈現。在Android上,framebuffer是在GLSurfaceView中自動創建的,所以App不需要創建它自己的。

2) 在iOS上,當您的應用程序進入背景時,OpenGL上下文被保留,這意味着您將其返回到前景時,您的所有紋理和緩衝區仍然存在。 老版本的Android只有一個OpenGL上下文,所以當你的應用程序進入後臺時它就會被銷燬(以便其他應用程序可以使用它)。 通過調用setPreserveEGLContextOnPause,更高版本的Android可以選擇更像iOS的行爲。然而,要實現這一點,Android版本必須是3.x或更高(API 11),設備也必須支持它。 當它不被使用或支持時,應用程序必須刪除並重新創建所有它的OpenGL資源時,背景和前景之間,這是你的應用程序似乎在做什麼。

+0

這是一個很大的答案(問題以及)對於那些誰試圖在iOS和Android之間移植OpenGL應用程序。 – zolio