【问题标题】:Best procedure for dealing with memory warnings after losing opengl context丢失opengl上下文后处理内存警告的最佳程序
【发布时间】:2023-03-14 17:20:01
【问题描述】:

我一直在寻找我的游戏中的一个错误,我想我终于找到了问题。

我有一个内存管理例程,它在内存警告时被调用,它基本上检查加载和不需要的内容,然后释放它。 我的大部分内存都用在了 opengl 的纹理中,因此除了纹理之外,即使在内存有限的 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. 还有其他释放纹理的方法吗?

谢谢

【问题讨论】:

    标签: iphone memory-management opengl-es ios4


    【解决方案1】:

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

    1. 您应该保留对您的EAGLContext 的引用。这将允许您使您的上下文处于当前状态,以便在任何必要的时候对其纹理进行操作(删除)。 (如果您不确定您的上下文是最新的,则不应在某个随机时间调用 glDeleteTextures。)
    2. 您可以检查您的上下文是否是最新的:if (myContext == [EAGLContext currentContext])...。当这不正确时,您可以选择不执行内存刷新,或者根据其状态采取其他操作。

    【讨论】:

    • 我确实引用了我的 EAGLContext,当播放 MPPlayer 电影时将其设置为当前停止电影并使其消失。我没有想到当前的上下文比较,但它当然有效,谢谢。仍然需要找到一种方法来删除那些纹理......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2017-12-16
    • 2012-03-04
    • 2012-06-12
    • 2010-09-24
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多