我一直在追踪游戏中的一个bug,我想我终于找到问题了。
我有一个内存管理例程,它在内存警告时被调用,它基本上检查加载和不需要的内容,并释放它。我的大部分内存都用于opengl的纹理,这样除了纹理之外,我只需要转储几个对象,即使在内存有限的3G上也能保持系统的正常运行。
现在我的问题,在少数情况下,我失去了openGL上下文,当播放一个电影与MPMoviePlayerController,例如,或调用GC系统视图时。
几次GC或MPMovie的加载将与我的内存管理例程被调用相一致,这就是我认为正在崩溃的游戏,因为我没有opengl上下文,我得到:
malloc: *** error for object 0x471c9080: pointer being freed was not allocated
当尝试glDeleteTextures.
现在我正在改变我的代码,所以我不试图在无效的上下文中删除纹理(仍然检查如何做到这一点),但我仍然留下了当我在opengl上下文停电期间得到内存警告时该怎么办的问题。
我只看到一个选项
- 在调用一些会让我失去上下文的东西之前,尝试释放内存
我不是特别喜欢这个选项,因为它会在一些操作上造成延迟。
- 有更好的方法吗?
- 我对问题的分析是否正确?(当我使用MPlayer和GC时,我真的失去了opengl上下文)
- 还有其他方法释放纹理吗?
Thx
好吧,听起来你至少可以采取一些基本的预防措施:
- 你应该保持你的
EAGLContext
的参考。这将允许你使你的上下文在任何必要的时候操作(删除)它的纹理。(你不应该调用glDeleteTextures
在一些随机的时间,如果你不确定你的上下文是当前的。) - 您可以检查您的上下文是否当前使用:
if (myContext == [EAGLContext currentContext])...
。当此值不为真时,您可以选择不执行内存刷新,或者根据其状态采取其他操作。