Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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
Android 在ICS上创建EGLCreateWindowsSurface,并从2D切换到3D_Android_Android 4.0 Ice Cream Sandwich_Nativewindow_Egl - Fatal编程技术网

Android 在ICS上创建EGLCreateWindowsSurface,并从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

我正试图让一款基于NDK的游戏在安卓ICS上运行。它在蜂窝和姜饼上效果很好

游戏使用一些2D渲染,一些3D渲染,在执行的不同阶段在两者之间切换。(由于第三方代码的原因,这是不可协商的。)我们正在使用
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渲染)实际上似乎没有在任何地方记录下来!