运行 SDL2 (ndk) Android 方向锁定为横向的应用程序时出现 libEGL 错误

libEGL error when running SDL2 (ndk) Android app with orientation locked to landscape

我在 Android 上玩 SDL2,但在将方向设置为横向时遇到问题。

我的 AndroidManifest.xml 中有以下几行:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation"

没有orientation|screenSize和横向线,一切都很好。添加这些行并点击后退按钮(以关闭该应用程序)时,我一遍又一遍地打印以下日志行:

E libEGL  : eglSwapBuffersWithDamageKHR:1089 error 300d (EGL_BAD_SURFACE)

我只使用 SDL 函数进行渲染,没有 OpenGL 代码。

知道为什么在清单中设置方向会导致这种情况吗?这不是锁定方向的正确方法吗?

更新:

在 onCreate 方法中设置方向是一个很好的解决方法,似乎可以完成这项工作。这是这行代码:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

最好知道为什么在清单中设置方向会破坏一切。设置为纵向没问题,只是设置为横向会出现问题。

更新 2:

在 onCreate 方法中设置方向基本没问题。关闭应用程序不会造成问题,切换到主屏幕没问题,切换到另一个应用程序也一样。我发现该应用程序可以毫无问题地再次打开。我确实发现当屏幕关闭时应用程序会崩溃。同样,只有当应用程序锁定在横向模式时才会出现此问题,在纵向模式下它可以正常工作。在日志记录中,我注意到在横向模式下按下电源按钮时会调用 onDestroy 方法,但不会在纵向模式下调用它。再次点亮恢复时,甚至没有调用 onCreate 方法。它只是停止。

我最终可能会将屏幕锁定为纵向,然后将所有内容渲染为横向。

我找到了答案。

我在关闭应用程序时遇到的错误不再出现在 SDL2 的最新开发版本中(正如 Treble 在 SDL 论坛上所建议的那样)。那可以找到here

从屏幕关闭恢复时应用程序崩溃的问题是由于调用了 onDestroy 方法。熄屏时,Android调用activity的onDestroy方法,设置方向为纵向,activity重新初始化,然后熄屏。

我的应用程序崩溃的事实可能意味着我没有正确销毁所有内容(我会调查)。

我发现 this post 详细说明了解决此问题的好方法。您需要做的就是确保清单中包含以下行:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation|screenSize"

... activity 中的这个:

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
}

这意味着配置更改(如方向)不会通过销毁和重新创建来处理 activity。

添加这个以及更新到最新的 SDL2 开发版本似乎解决了我的问题。