【问题标题】:Random OpenGL freeze on Android with Adreno GPU使用 Adreno GPU 在 Android 上随机冻结 OpenGL
【发布时间】:2015-04-18 09:47:40
【问题描述】:

当我的应用在配备 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 的子类。

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

【问题讨论】:

    标签: android opengl-es android-ndk


    【解决方案1】:

    我想我终于找到了原因。

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

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

    更新

    我通过 openFd 将 FileDescriptor 传递给 SoundPool.load。但是,SoundPool.unload 不会释放它使用的 FD。我必须自己持有对FD的引用并在SoundPool.onLoadComplete时关闭它

    【讨论】:

    • 最好在不再需要文件时显式关闭它们,而不是等待 Java 语言的析构函数来关闭它们。 Android 系统代码使用“关闭守卫”,当带有文件描述符的对象在文件仍处于打开状态时被 GCed 时会发出抱怨。
    • 我的意思是我已经关闭了文件但我仍然需要调用 System.gc() 才能生效。
    • System.gc() 清理托管堆上的 Java 语言对象。它对文件或网络连接等非内存资源一无所知。关闭文件的唯一方法是,如果具有文件描述符的对象具有执行实际关闭的终结器。
    • 感谢您的提示。最后我发现泄漏是由 SoundPool 引起的。我通过“openFd”将 FileDescriptor 传递给“SoundPool.load”。但是,“SoundPool.unload”不会释放它使用的 FD。我必须自己持有对 FD 的引用并在“SoundPool.onLoadComplete”时关闭它
    • 感谢硬件或驱动程序可能有问题的信息。我在应该是新的平板电脑上收到相同的消息。负载(在主线程上)是我的应用程序的错,但据我所知,它只是完全合法的 CPU,
    猜你喜欢
    • 2017-05-18
    • 2020-03-26
    • 2011-03-08
    • 1970-01-01
    • 2012-03-15
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多