【发布时间】: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