Android 在ICS上创建EGLCreateWindowsSurface,并从2D切换到3D
我正试图让一款基于NDK的游戏在安卓ICS上运行。它在蜂窝和姜饼上效果很好 游戏使用一些2D渲染,一些3D渲染,在执行的不同阶段在两者之间切换。(由于第三方代码的原因,这是不可协商的。)我们正在使用Android 在ICS上创建EGLCreateWindowsSurface,并从2D切换到3D,android,android-4.0-ice-cream-sandwich,nativewindow,egl,Android,Android 4.0 Ice Cream Sandwich,Nativewindow,Egl,我正试图让一款基于NDK的游戏在安卓ICS上运行。它在蜂窝和姜饼上效果很好 游戏使用一些2D渲染,一些3D渲染,在执行的不同阶段在两者之间切换。(由于第三方代码的原因,这是不可协商的。)我们正在使用ANativeWindow_lock()/ANativeWindow_unlock and post()进行2D渲染,使用eglCreateWindowSurface()//eglSwapBuffers()进行3D渲染 在蜂巢和姜饼上,这一切都很好。在ICS上,EGLCreateWindowsSurf
ANativeWindow_lock()
/ANativeWindow_unlock and post()
进行2D渲染,使用eglCreateWindowSurface()
//eglSwapBuffers()
进行3D渲染
在蜂巢和姜饼上,这一切都很好。在ICS上,EGLCreateWindowsSurface()
失败,日志中显示以下消息:
E/SurfaceTexture( 1765): [com.fnord/com.fnord.MyActivity] connect: already connected (cur=2, req=1)
E/libEGL ( 5466): EGLNativeWindowType 0x29e9b8 already connected to another API
E/libEGL ( 5466): eglCreateWindowSurface:374 error 300b (EGL_BAD_NATIVE_WINDOW)
E/libEGL ( 5466): call to OpenGL ES API with no current context (logged once per thread)
查看源代码,很明显,eglCreateWindowSurface()
失败了,因为有些东西打开了本机窗口进行二维渲染,如果不先释放曲面,它将不允许我将其更改为三维。然而,AnativeWindowAPI似乎没有任何明显的方法来实现这一点
还有其他人遇到过这个问题吗?解决办法是什么
更新
因此,我重写了2D渲染代码,改用OpenGL原语(将backbuffer上载到纹理,通过一对三角形渲染纹理,swapbuffers)。这在一定程度上起作用。现在发生的是2D渲染工作正常;然后我销毁曲面,创建一个新曲面以准备3D渲染,第二次调用eglCreateWindowSurface()
失败。这一次,与:
E/SurfaceTexture( 1869): [com.fnord/com.fnord.MyActivity] connect: already connected (cur=1, req=1)
…并抛出一个EGL错误AEGL\u BAD\u NATIVE\u WINDOW
请注意,创建新曲面时使用与旧曲面完全相同的属性。我甚至尝试确保在对eglCreateWindowSurface()
的两次调用之间调用eglTerminate()
/eglInitialize()
是不是每个ANativeWindow都可以使用一次?如果是这样的话,这难道不能通过Khronos的EGL一致性测试吗?那么,有没有办法让NativeActivity重新创建窗口呢
更新
最后一个问题是由于我在销毁上下文和曲面之前未能调用eglMakeCurrent(display,EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT)
。这会导致销毁延迟,直到线程解除上下文和表面的绑定(当然不是这样),因此导致对eglCreateWindowSurface()
的调用合法地失败(不能在同一个本机窗口上有两个窗口表面)
这有点违反直觉,因为有人会假设调用eglTerminate()
会破坏所有EGL资源,但这是规范允许的。请注意 这不是一个受支持的用例。事实上,它以前能工作只是你的运气,它可能会在某些设备上失败。您可以通过在不同的窗口中渲染2D或3D内容,或在位图中渲染2D内容,然后将其用作GL纹理等来解决此问题。您可以从OpenGL切换到CPU渲染(ANativeWindow\u lock
),反之亦然,但需要使用Surface.release()释放使用的曲面
并从您的SurfaceTexture
为另一个API创建一个新的API
您是否有此参考的链接?i、 例如,什么样的功能可以保证得到支持?我重写了我的代码,通过OpenGL进行2D渲染——但它仍然不起作用。细节在正文中。非常感谢您的建议…请出示您的代码好吗?销毁/重新创建窗口曲面正是硬件渲染器经常做的事情。顺便说一句,你们为什么要破坏你们的表面?问题解决了——身体的更多细节。非常感谢。然而。。。我将指出,原始问题的原因(不支持在同一个NativeWindow中切换2D和3D渲染)实际上似乎没有在任何地方记录下来!