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

时间:2015-04-18 09:47:41

标签: android opengl-es android-ndk

当我的应用程序在带有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的子类。

有没有人对这个问题有所了解?任何线索都会很有帮助。

1 个答案:

答案 0 :(得分:2)

我想最后我找到了原因。

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

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

更新

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

时将其关闭