当我的应用程序在带有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的子类。
有没有人对这个问题有所了解?任何线索都会很有帮助。
答案 0 :(得分:2)
我想最后我找到了原因。
我的应用程序打开了很多文件,因此限制IO处理,比如大约1024,已经用尽了。另一方面,Adreno驱动程序在交换缓冲区时需要更多的IO句柄,然后导致应用程序冻结。
此问题已在文件关闭后手动调用System.gc()
解决。
更新
我通过openFd
向SoundPool.load
传递了一个FileDescriptor。但是,SoundPool.unload
不会释放它使用的FD。我必须自己持有对FD的引用并在SoundPool.onLoadComplete