【问题标题】:surfaceCreated called twice after onRestart/onResume在 onRestart/onResume 之后调用了两次surfaceCreated
【发布时间】:2023-03-27 03:45:01
【问题描述】:

当我的应用程序暂停然后重新启动时,我注意到我收到了两次 surfaceCreated 回调。更有趣的是,在我的代码创建新表面之前第一次调用它。这破坏了各种混乱,我想了解它为什么会发生,以及如何过滤掉那个虚假的回调而不对其做出反应,或者完全阻止它被调用。

以下是 logcat 的相关摘录:

10-20 11:35:21.834 24548 24548 D AllegroEGL: destroying egl_Surface
10-20 11:35:21.844 24548 24548 D AllegroEGL: destroying egl_Context
10-20 11:35:22.874 24548 24548 D AllegroSurface: surfaceDestroyed end
10-20 11:35:22.884 24548 24548 D AllegroActivity: onSaveInstanceState
10-20 11:35:22.884 24548 24548 D AllegroActivity: onStop.
// Here, the game is paused and restored
10-20 11:35:27.524 24548 24548 D AllegroActivity: onRestart.
10-20 11:35:27.524 24548 24548 D AllegroActivity: onStart.
10-20 11:35:27.524 24548 24548 D AllegroActivity: onResume
10-20 11:35:27.624 24548 24548 I allegro : android  D 24548:         android_system.c:303  Java_org_liballeg_android_AllegroActivity_nativeOnResume [  69.49768] resume activity
10-20 11:35:27.624 24548 24548 I allegro : android  D 24548:     android_system.c:316  Java_org_liballeg_android_AllegroActivity_nativeOnResume [  69.49773] got display: 0x5d55fd20
10-20 11:35:27.624 24548 24548 D AllegroActivity: postCreateSurface
10-20 11:35:27.624 24548 24548 D AllegroActivity: onResume end
10-20 11:35:33.964 24548 24548 I Choreographer: Skipped 388 frames!  The application may be doing too much work on its main thread.
10-20 11:35:33.984 24548 24548 D AllegroSurface: surfaceCreated
// Later:
10-20 11:35:48.934 24548 24548 D AllegroActivity: createSurface
// ... lots of action ...
10-20 11:36:02.044 24548 24548 D AllegroActivity: createSurface end

postCreateSurface 包含如下所示:

void postCreateSurface()
{
   try {
      Log.d("AllegroActivity", "postCreateSurface");

      handler.post(new Runnable() {
         public void run() {
            createSurface();
         }
      });
   } catch (Exception x) {
      Log.d("AllegroActivity", "postCreateSurface exception: " + x.getMessage());
   }
}

如你所见,它调用了“createSurface”函数,该函数应该将“createSurface”和“createSurface end”记录到logcat中。确实如此 - 但仅在“surfaceCreated”回调之后!

尝试使用第一个表面会导致 GL_INVALID_OPERATION 错误,因此这显然是一个糟糕的错误。

我不知道这里发生了什么,我该怎么办。

【问题讨论】:

  • 我不知道 Allegro 在做什么,但你可以在这里了解更多关于 SurfaceView 工作方式有点奇怪的信息:source.android.com/devices/graphics/architecture.html#activity
  • 谢谢。似乎 Allegro 正在显式创建 SurfaceHolder,即使 Surface 是为 SurfaceView 自动创建的(根据文档),这导致了这种行为。我将联系图书馆作者以确定他们这样做的原因。

标签: android surfaceview allegro


【解决方案1】:

您在 Surface View 中所做的一些更改使其再次调用surfaceCreated(),例如:“yourSurfaceView.getHolder().setFormat(PixelFormat.TRANSPARENT)”将再次调用surfaceCreated()。

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2015-03-31
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多