gpt4 book ai didi

android - ICS 上的 eglCreateWindowSurface,并从 2D 切换到 3D

转载 作者:太空宇宙 更新时间:2023-11-03 10:53:56 25 4
gpt4 key购买 nike

我正在尝试让基于 NDK 的游戏在 Android ICS 上运行。它在 Honeycomb 和 Gingerbread 上运行良好。

游戏使用一些 2D 渲染,一些 3D 渲染,在执行的不同阶段在两者之间切换。 (由于第三方代码,这是不可协商的。)我们正在使用 ANativeWindow_lock()/ANativeWindow_unlockAndPost() 进行 2D 渲染,并使用 eglCreateWindowSurface() /gl*()/eglSwapBuffers() 用于 3D 渲染。

在 Honeycomb 和 Gingerbread 上一切正常。在 ICS 上,eglCreateWindowSurface() 失败并在日志中显示以下消息:

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() 失败了,因为某些东西打开了原生窗口以进行 2D 渲染,如果不释放首先表面。但是,ANativeWindow API 似乎没有任何明显的方法来执行此操作。

有没有其他人遇到过这个问题,解决方案是什么?

已更新

所以我重写了我的 2D 渲染代码,改为使用 OpenGL 图元(将后备缓冲区上传到纹理,通过一对三角形渲染纹理,交换缓冲区)。这在一定程度上有效。 现在发生的事情是 2D 渲染工作正常;然后我破坏表面,创建一个新表面以准备 3D 渲染,第二次调用 eglCreateWindowSurface() 失败。这一次,有:

E/SurfaceTexture( 1869): [com.fnord/com.fnord.MyActivity] connect: already connected (cur=1, req=1)

...并抛出 AEGL_BAD_NATIVE_WINDOW 的 EGL 错误。

请注意,新表面创建时具有与旧表面完全相同的属性。我什至尝试确保在对 eglCreateWindowSurface() 的两次调用之间调用了 eglTerminate()/eglInitialize()

我可以精确地使用每个 ANativeWindow 一次吗?如果是这样,那不是没有通过 Khronos 的 EGL 一致性测试吗?那么有没有办法让 NativeActivity 重新创建窗口呢?

更新更新

原来最后一个问题是我在销毁上下文和表面之前没有调用eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)造成的。这导致破坏被延迟,直到线程取消绑定(bind)上下文和表面,当然它不是,因此导致对 eglCreateWindowSurface() 的调用合法地失败(你不能有两个同一 native 窗口上的窗口表面)。

有点违反直觉,因为人们会假设调用eglTerminate() 会破坏所有EGL 资源,但规范允许这样做。警告!

最佳答案

这不是受支持的用例。事实上,它之前可以正常工作,这对您来说只是运气,它可能会在某些设备上失败。您可以通过在不同窗口中渲染 2D 或 3D 内容来解决此问题,或者在位图中渲染 2D 内容,然后将其用作 GL 纹理等。

关于android - ICS 上的 eglCreateWindowSurface,并从 2D 切换到 3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com