2011-12-30 63 views
0

我一直在追逐我的游戏中的错误,我想我终于找到了问题。丢失opengl上下文后处理内存警告的最佳步骤

我有一个内存管理例程,在内存警告中调用,它基本上检查什么是加载和不需要,并释放。 我的大部分内存都被用在op​​engl的纹理中,除了纹理之外,我只需要转储一些对象来保持系统的快乐,即使是在3G上使用它的内存有限。

现在我的问题,有几次我失去了openGL上下文,例如在用MPMoviePlayerController播放电影时,或者调用GC系统视图时。 GC或MPMovie的

几次负荷将与我的内存管理程序一致被调用,这是我觉得崩溃的比赛,因为我没有OpenGL上下文,我得到:

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

当试图glDeleteTextures。

现在我正在更改我的代码,所以我不尝试删除无效上下文中的纹理(仍然检查如何执行此操作),但是我仍然留下了当我得到内存警告在opengl上下文中断。

我看只有一个选项

  1. 调用的东西,会让我失去方面的尝试和释放内存

之前,我特别不喜欢这个选择,因为它介绍了一些操作的滞后。

  1. 有人看到更好的方法吗?
  2. 我对问题的分析正确吗? (当使用MPlayer和GC时,我真的会失去opengl上下文)
  3. 任何其他释放纹理的方法?

THX

回答

2

嗯,当然听起来像有您可以在这里至少几个基本的预防措施:

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

我确实有一个参考我的EAGLContext,设置它当前MPPlayer电影播放停止电影,并使其消失。目前的情景比较并没有发生在我身上,但它当然有用,thx。仍然需要找到一种方法来删除这些纹理... – led42 2011-12-30 16:43:07