如何在Android上丢失上下文时保存OpenGL纹理

时间:2014-03-05 08:29:43

标签: android opengl-es messages egl openglcontext

我们的游戏要求从小图像动态构建几个大纹理,并且我们不保留纹理的数据副本,我们只使用带有glTexSubImage2d的OpenGL来更新实际纹理。

当按下Back,或游戏失去焦点时,我们希望将这些纹理保存到ram,因此如果用户返回游戏,我们可以在onSurfaceCreated中重新创建/重新加载它们。我们已经从'disk'重新加载所有静态纹理。

然而,它证明很难找到我们可以在哪里得到消息,知道我们即将失去EGL上下文。如果我们在主活动的onBackPressed中设置一个标志然后在主渲染循环中检查该标志,我们可以在那里保存纹理,但我们无法从主活动中访问纹理,因此将调用放入主要活动的onStop回调为时已晚。没有后续的渲染循环来保存纹理,因为它已经停止了。我们需要这样做,因为除了按“返回”按钮之外,还有其他方式可以调用onStop

据说我不能推迟onStop再获得一次“渲染”。还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

由于您已经在应用程序的冷启动期间动态生成了此纹理,因此将这些纹理dirty分开并重新生成它们可能是一个好点,就像应用程序开始冷却一样。

如果要保存这些纹理,请不要等待onStop()被调用。只需在生成内容后保存即可。

答案 1 :(得分:0)

这听起来是同步线程的问题。按下按钮事件或onPause事件(如果另一个应用程序转到前面)在主(UI)线程上运行,而opengl呈现具有自己的线程。当触发UI线程上的事件时,您设置一个标志并等待condition_variable。渲染线程始终检查标志,并在设置时保存纹理,更改condition_variable的条件并通知UI线程。