3

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

当按下 Back 或游戏失去焦点时,我们希望将这些纹理保存到 ram,因此如果用户随后返回游戏,我们可以在onSurfaceCreated. 我们已经从“磁盘”重新加载所有静态纹理。

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

据说我不能拖延onStop再获得一个“渲染”。还有其他想法吗?

4

2 回答 2

2

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

如果您想保存这些纹理,请不要等待onStop()被调用。生成它们的内容后,只需保存它们。

于 2014-03-05T10:56:34.643 回答
0

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

于 2016-08-12T17:43:36.003 回答