【问题标题】:COCOS2d - Reusing Sprite & Replacing sceneCOCOS2d - 重用 Sprite 和替换场景
【发布时间】:2012-09-14 17:08:00
【问题描述】:

我有 2 个场景,两个场景共享相同的背景图像,所以我在两个场景的 init 方法中都有以下代码并添加。一切正常。我的问题是,既然同一个图像文件被读取了两次,分配了内存并解除了分配,那么为什么我们不能使用单例模式将它存储在一个公共位置(spriteManager)并重用该实例?如果我这样做,当场景一被场景二替换时,内存将被释放。

我想到的一个是保留,但不确定如何以及在何处处理此保留。如果我的处理通用可重用精灵的方法是错误的,那么请建议我正确的方法来做同样的事情。我是这个 cocos2d 的新手,所以我还没有阅读 sprite sheet 的概念,现在我想保持一切简单。

CCSprite *bg = [CCSprite spriteWithFile:@"bg.png"];

第二个问题,我在替换两个重场景时阅读,由于释放第一个场景内存和分配下一个场景内存的重叠,会有一些内存泄漏的机会。因此,为了避免这种情况,我读到我们必须暂停几秒钟来加载轻量级场景(加载场景)。这是一个好的解决方案还是替换场景本身不会产生任何问题。

如果有一篇关于这篇文章标题的好文章(重用 Sprite 和替换场景),那就太好了。 .

【问题讨论】:

    标签: iphone objective-c ios data-structures cocos2d-iphone


    【解决方案1】:

    回答你的第一个问题,你不需要 spriteManager,因为 cocos2D 已经有一个默认的纹理缓存机制(参考 ccTextureCache 类),当你下次调用 spriteWithFile 时,它​​只会从纹理缓存中加载纹理。注意:ccTextureCache 通常会在出现内存警告时清除其纹理。

    其次,如果您已正确释放对象,则在替换场景时不应该有任何内存泄漏。你能提供一个链接到你在哪里读到这个吗?

    【讨论】:

    • 我认为海报指的是这个stackoverflow.com/questions/8989189/…。这不是关于泄漏,而只是关于在过渡期间同时加载两个场景的要求。
    • 我也这么认为。如果您知道同时将两个场景放在内存中可能会消耗太多内存,那么加载场景是一种很好的做法。它还允许您手动清除缓存,特别是指定您知道会消耗大量内存但不再使用(或直到返回)的第一个场景的资源。如果将两个场景一起排序,则不能这样做,因为当第二个场景开始初始化第一个场景时,第一个场景仍在内存中,并保存对其所有缓存资源的引用(因此在这种情况下清除缓存不起作用) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多