2014-01-20 4 views
4

iOS와 Android에서 모두 작동하는 OpenGL ES 앱이 있습니다. 대부분의 코드는 다른 사람이 몇 년 전에 작성한 것이므로 이제는 유지해야합니다. OpenGL 사용법은 매우 간단합니다 (게임은 2D이며 질감이있는 스프라이트 만 사용합니다).iOS 및 Android 용 OpenGL ES 차이점

1) 아이폰 OS 코드는 코드가 포함되어 있습니다 : :하지만 iOS 및 Android를위한 그래픽 코드 실현의 두 가지 주요 차이점 참조

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 앱이 백그라운드로 실행되면 eglTerminate을 사용하여 모든 OpenGL 텍스처가 파괴되고 (glDeleteTextures) EGL이 종료됩니다. 앱이 수면에서 돌아 오면 EGL이 다시 초기화되고 텍스처가 다시 ​​생성됩니다.

iOS 코드는 이러한 작업을 수행하지 않습니다. [m_displayLink setPaused:YES];

다른 OpenGL 관련 코드는 iOS 및 Android에서 동일합니다.

모든 것이 두 플랫폼에서 모두 잘 작동하지만, 무슨 일이 벌어지고 있는지 완전히 알고 싶습니다. 아무도 나에게이 두 가지 차이점의 근거를 설명 할 수 있습니까?

+0

두 코드 모두 ES 1.0을 사용합니까? 내가 볼 수 – NigelK

+0

예 : 사람들을위한 # 만약 정의 PLATF_IOS 정의 PLATF_ANDROID #elif 사용법 #include 이 좋은 대답 (질문뿐만 아니라)이다 – Nick

답변

7

1) 이것은 API의 차이점입니다. iOS에서는 앱이 시작될 때 렌더링 할 자체 프레임 버퍼를 만듭니다. Android에서는 프레임 버퍼가 GLSurfaceView에서 자동으로 생성되므로 앱이 자체적으로 프레임 버퍼를 만들 필요가 없습니다.

2) iOS에서 앱이 백그라운드로 이동하면 OpenGL 컨텍스트가 유지되므로 포 그라운드로 되돌릴 때 모든 텍스처와 버퍼가 그대로 유지됩니다. 이전 버전의 Android에는 하나의 OpenGL 컨텍스트 만 있으므로 응용 프로그램이 백그라운드로 이동할 때마다 (즉, 다른 Apps에서 사용할 수 있도록) 파괴되었습니다. Android의 최신 버전에는 setPreserveEGLContextOnPause를 호출하여 iOS와 유사한 동작을 수행하는 옵션이 있습니다. 그러나 이것이 작동하려면 Android 버전이 3.x 이상 (API 11)이어야하며 장치가이를 지원해야합니다. 사용되지 않거나 지원되지 않는 경우 앱은 백그라운드와 포 그라운드 사이를 이동할 때 OpenGL 리소스를 모두 삭제하고 다시 만들어야합니다. 이는 앱이 수행하는 것으로 보입니다.

+0

#endif 다음 사용법 #include 누가 IOS와 안드로이드 사이에서 OpenGL 애플 리케이션을 이식하려 하는가. – zolio