丢失opengl上下文后处理内存警告的最佳过程



我一直在追踪游戏中的一个bug,我想我终于找到问题了。

我有一个内存管理例程,它在内存警告时被调用,它基本上检查加载和不需要的内容,并释放它。我的大部分内存都用于opengl的纹理,这样除了纹理之外,我只需要转储几个对象,即使在内存有限的3G上也能保持系统的正常运行。

现在我的问题,在少数情况下,我失去了openGL上下文,当播放一个电影与MPMoviePlayerController,例如,或调用GC系统视图时。

几次GC或MPMovie的加载将与我的内存管理例程被调用相一致,这就是我认为正在崩溃的游戏,因为我没有opengl上下文,我得到:

malloc: *** error for object 0x471c9080: pointer being freed was not allocated

当尝试glDeleteTextures.

现在我正在改变我的代码,所以我不试图在无效的上下文中删除纹理(仍然检查如何做到这一点),但我仍然留下了当我在opengl上下文停电期间得到内存警告时该怎么办的问题。

我只看到一个选项

  1. 在调用一些会让我失去上下文的东西之前,尝试释放内存

我不是特别喜欢这个选项,因为它会在一些操作上造成延迟。

    有更好的方法吗?
  1. 我对问题的分析是否正确?(当我使用MPlayer和GC时,我真的失去了opengl上下文)
  2. 还有其他方法释放纹理吗?

Thx

好吧,听起来你至少可以采取一些基本的预防措施:

  1. 你应该保持你的EAGLContext的参考。这将允许你使你的上下文在任何必要的时候操作(删除)它的纹理。(你不应该调用glDeleteTextures在一些随机的时间,如果你不确定你的上下文是当前的。)
  2. 您可以检查您的上下文是否当前使用:if (myContext == [EAGLContext currentContext])...。当此值不为真时,您可以选择不执行内存刷新,或者根据其状态采取其他操作。

最新更新