Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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
使用Adreno GPU在Android上随机冻结OpenGL_Android_Opengl Es_Android Ndk - Fatal编程技术网

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

使用Adreno GPU在Android上随机冻结OpenGL,android,opengl-es,android-ndk,Android,Opengl Es,Android Ndk,当我的应用程序运行在带有Adreno GPU的Android设备上时,我遇到了一个奇怪的OpenGL随机错误。这个问题可以在安卓4.X和5.X上重现,而且只发生在Adreno GPU上 E/Surface (14388): dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -2147483646 W/Adreno-EGLSUB(14388): <DequeueBuffer:720>: dequeue nat

当我的应用程序运行在带有Adreno GPU的Android设备上时,我遇到了一个奇怪的OpenGL随机错误。这个问题可以在安卓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...
E/Surface(14388):出列缓冲区:IGraphicBufferProducer::requestBuffer失败:-2147483646
W/Adreno EGLSUB(14388)::退出本机缓冲区失败:未知错误2147483646,缓冲区=0x0,句柄=0x0
W/Adreno EGL(14388)::EGL_坏_表面
带GLThread(14388):eglSwapBuffers失败:EGL_坏_表面
W/OpenGLRenderer(14388):swapBuffers在0xaf43d340上遇到EGL_BAD_曲面,正在停止渲染。。。
错误发生时,我的应用程序冻结。它是用C/C++编写的纯本机应用程序。我的应用程序中唯一的视图是GLSurfaceView的一个子类


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

我想我终于找到了原因

我的应用程序可以打开许多文件,因此IO处理的限制(比如说1024个)已经耗尽。另一方面,当交换缓冲区时,Adreno驱动程序似乎需要更多的IO句柄,然后导致应用程序冻结

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

更新


我通过
openFd
将文件描述符传递给
SoundPool.load
。但是,
SoundPool.unload
不会释放它使用的FD。我必须自己保存对FD的引用,并在
SoundPool.onLoadComplete

时关闭它。最好在不再需要文件时显式关闭它们,而不是等待Java语言析构函数关闭它们。Android系统代码使用了一个“近卫”,当带有文件描述符的对象在文件仍然打开时被GCD时,它会发出抱怨。我的意思是我已经关闭了文件,但我仍然需要调用system.gc()才能生效。
system.gc()
清理托管堆上的Java语言对象。它对文件或网络连接等非内存资源一无所知。它关闭文件的唯一方法是,如果具有文件描述符的对象有一个完成实际关闭的终结器。谢谢您的提示。最后我发现泄漏是由声音池引起的。我通过“openFd”向“SoundPool.load”传递了一个文件描述符。但是,“SoundPool.unload”并没有释放它使用的FD。我必须自己保存对FD的引用,并在“SoundPool.onLoadComplete”时关闭它,感谢您提供的硬件或驱动程序可能有故障的信息。我在一台本应是新的平板电脑上看到了同样的信息。加载(在主线程上)是我的应用程序的错误,但就我所见,它只是完全合法的CPU,