【问题标题】:Crash with SurfaceView in Android NDK when pausing/resuming app fast快速暂停/恢复应用程序时,Android NDK 中的 SurfaceView 崩溃
【发布时间】:2015-06-12 04:49:38
【问题描述】:

当我非常快地暂停/取消暂停我的应用程序时,我会遇到以下问题:

E/BufferQueueProducer(  177): [SurfaceView] connect(P): already connected (cur=1 req=1)
E/libEGL  (25863): eglCreateWindowSurface: native_window_api_connect (win=0xb4984508) failed (0xffffffea) (already connected to another API?)
E/libEGL  (25863): eglCreateWindowSurface:416 error 3003 (EGL_BAD_ALLOC)

我很确定我正在正确地停止/启动我的渲染线程,而且这个问题真的只发生在我非常快地暂停/恢复应用程序时(比如当你混合打开应用程序按钮时)。

任何想法可能是 eglCreateWindowSurface 在这里返回 EGL_NO_SURFACE 的原因吗?我的猜测是它与仍然连接到 SurfaceView 的东西有关。

【问题讨论】:

  • 您包含的文本显示了崩溃的原因,但没有显示崩溃的位置。你也可以包括例外吗?可能相关:source.android.com/devices/graphics/architecture.html#activity
  • 它在 eglCreateWindowSurface 方法中崩溃,该方法返回 EGL_NO_SURFACE
  • 是否有带有堆栈跟踪的本机故障转储?当应用程序处于错误状态时,EGL 和 BufferQueue 代码不应使应用程序崩溃。
  • 好吧,也许 crash 是我的问题中的错误措辞:问题是 egl 表面没有创建,这随后导致我的应用程序崩溃(这是预期的)。

标签: android opengl-es android-ndk surfaceview


【解决方案1】:

听起来您正在尝试为已有的 Surface 创建 EGLSurface。如果速度是一个问题,通常是因为 Surface 回调处理的滞后——SurfaceView Surface 部分由窗口管理器处理,这需要进程间通信。

也许您的本机代码仍然有旧 SurfaceHolder 的句柄,如果您移动得更慢,该句柄会被即将到来的surfaceCreated() 取代?如果不确切知道您的代码做了什么,就很难说。解决这类问题的一种方法是在所有有趣的状态变化点添加日志记录,并比较“慢速”暂停/恢复和“快速”暂停/恢复的日志。

仔细管理 SurfaceView 状态应该可以避免这些情况。 This appendix 对图形架构文档讨论了 Activity 和 SurfaceView 生命周期之间的区别,以及构建应用程序以避免问题的两种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多