gpt4 book ai didi

android - 防止 EGLContext 在进入后台时被销毁

转载 作者:行者123 更新时间:2023-11-29 00:12:43 25 4
gpt4 key购买 nike

我的 Android (OpenGL ES 2.0) 游戏需要在用户最小化时暂停,而不破坏屏幕上已经绘制的内容。最初它使用 NativeActivity 和纯 C++,但看起来那里是不可能的。我已经重写了它,它现在是 Java 生成自定义 GLSurfaceView 和游戏逻辑+渲染是在 C++ 中。我在创建表面时添加了 setPreserveEGLContextOnPause(true)

所以用户点击Home键后的缺​​陷是:

  1. onPause 通过 JNI 发送 nativeOnPause 到 C++ 代码
  2. C++ 代码设置暂停变量以防止更新和渲染

这工作正常。回到应用程序后:

  1. onResume 调用 nativeOnResume
  2. nativeOnResume 调用 EGL 方法来获取当前上下文、显示和表面并将其传递给游戏管理器。
  3. 现在已激活更新和渲染
  4. 我们收到的EGL_BAD_SURFACE 消息很少,最终在 eglMakeCurrent 上崩溃了

问题是:我们是否应该以任何方式使用当前上下文重新创建 EGLSurface 和 EGLDisplay,或者获取当前表面和显示是否正常?

我还注意到,当我们回到应用程序时,调用了 onResume,但未调用 onSurfaceChangedonSurfaceCreated

关于如何在 >4.0 设备上解决该问题有什么建议吗?

最佳答案

如果您想控制 EGL 上下文生命周期,请不要使用 GLSurfaceView。

GLSurfaceView 类为您处理 EGL 上下文,并且非常积极地丢弃它。 setPreserveEGLContextOnPause() 调用可能不会执行您想要的操作。如果您切换到 SurfaceView,您将可以完全控制 EGL 上下文的生命周期,但这是一把双刃剑,因为您现在需要完全管理 EGL 上下文。

您可以在 Grafika 中找到将 GLES 与 SurfaceView 结合使用的各种示例. “hardware scaler exerciser” Activity 是一个合理的例子。

该 Activity 还演示了一种 Activity 生命周期管理方法。关于 Activity 和 SurfaceView 之间关系的讨论,包括为什么您不总是看到 surfaceChanged()surfaceCreated(),可以在 in an appendix 中找到。到图形架构文档。

综上所述,在您的应用处于非 Activity 状态时保留 EGL 上下文和所有相关资源是一种不好的做法。当用户暂停您的应用时,应释放这些资源,以便其他应用可以使用该设备的全部功能。

关于android - 防止 EGLContext 在进入后台时被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29049404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com