使用 Adreno GPU 在 Android 上随机冻结 OpenGL

Random OpenGL freeze on Android with Adreno GPU

当我的应用程序在具有 Adreno GPU 的 Android 设备上运行时,我遇到了一个奇怪的随机 OpenGL 错误。这个问题可以在 Android 4.X 和 5.X 上重现,它只发生在 Adreno GPU 上。

E/Surface (14388): dequeueBuffer: IGraphicBufferProducer::requestBuffer    failed: -2147483646
W/Adreno-EGLSUB(14388): <DequeueBuffer:720>: dequeue native buffer fail: Unknown error 2147483646, buffer=0x0, handle=0x0
W/Adreno-EGL(14388): <qeglDrvAPI_eglSwapBuffers:3702>: EGL_BAD_SURFACE
W/GLThread(14388): eglSwapBuffers failed: EGL_BAD_SURFACE
W/OpenGLRenderer(14388): swapBuffers encountered EGL_BAD_SURFACE on 0xaf43d340, halting rendering...

我的应用程序在发生错误时冻结。它是用 C/C++ 编写的纯本机应用程序。我的应用程序中唯一的视图是 GLSurfaceView 的子类。

有人知道这个问题吗?任何线索都会很有帮助。

我想我终于找到原因了。

我的应用程序打开了很多文件,因此限制 IO 句柄,比如大约 1024,已经用完了。另一方面,似乎 Adreno 驱动程序在交换缓冲区时需要更多的 IO 句柄,然后导致应用程序冻结。

此问题已通过在文件关闭后手动调用 System.gc() 解决。

更新

我通过 openFdSoundPool.load 传递了一个 FileDescriptor。但是,SoundPool.unload 不会释放它使用的那个 FD。我必须自己持有对 FD 的引用并在 SoundPool.onLoadComplete

时关闭它