【问题标题】:Release all texture memory释放所有纹理内存
【发布时间】:2012-03-26 00:45:49
【问题描述】:

我以这种方式为我的动画角色加载了巨大的纹理:

[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"MyFile.plist"];

后来,当我不再使用该角色时,我使用以下方式释放内存:

[[CCSpriteFrameCache sharedSpriteFrameCache]removeSpriteFramesFromFile:@"MyFile.plist"];

还有:

[[CCTextureCache sharedTextureCache]removeTextureForKey:@"MyFile.png"];

只是为了确定。

我这样做是因为它使用的纹理会消耗大量内存,所以我确保我处理掉它,这样我的应用就不会崩溃。 上面的代码正确吗?

无论如何,这是实际的问题:我最终再次加载我的角色,并再次处理它。最终,在一对夫妇复活并杀死后,应用程序崩溃了。日志什么也没说,所以我只能怀疑这是由于记忆造成的——这就是为什么我认为我没有正确处理纹理。

我确实需要创建和处理角色的纹理。我不能在游戏中预装它。

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    我通常使用蛮力方法如下:

        [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
        [[CCTextureCache sharedTextureCache] removeUnusedTextures];
    

    在游戏流程的特定时刻。从宏观上来说,让 coco 扫描它的数组并不太昂贵。与您的情况一样,在我当前的游戏中,我必须加载并放弃。 CCTextureCache 具有 CCLOG'ing 功能,可让您见证删除是否在您预期的时候实际发生,或者接近它(自动释放有其怪癖)。如果没有,您可能在某处保留了纹理的一些句柄、精灵、批处理节点、CCAnimation 或动作。

    【讨论】:

    • 蛮力方法不是答案,但您确实指出了一些重要的事情:保留 CCAnimation 对象的可能性。好吧,事实证明我已经分配了 NSMutableArrays 来将精灵帧添加到它们,然后创建 CCAnimations。我从来没有释放过数组,所以他们一直在堆积精灵帧内存。谢谢。
    【解决方案2】:

    您是否也尝试过purgeSharedTextureCache,如下所述:

    http://www.cocos2d-iphone.org/api-ref/0.99.0/interface_c_c_texture_cache.html#ac673f75cd5418bdcecf1fb8717a40345

    您也可以在内存警告期间释放纹理的 App Delegate 方法中看到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 2012-01-10
      • 2019-02-11
      • 1970-01-01
      • 2019-04-21
      • 2019-06-13
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多