2012-09-14 42 views
1

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

这是我想到的一个问题,但不知道如何以及在何处处理此问题。如果我的方法在处理Common可重用精灵方面是错误的,那么请向我建议正确的方法。我对这个cocos2d很陌生,所以我没有读过精灵表的概念,现在我想保持一切简单。

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

第二个问题,我同时更换两个沉重的一幕阅读会有到期释放的第一个场景存储和分配下一个场景记忆重叠内存泄漏的一些机会。所以为了避免这种情况,我读了我们必须暂停几秒钟才能加载一个轻量级场景(加载场景)。这是一个很好的解决方案,或者替换场景本身不会产生任何问题。

如果有关于此帖子标题的好文章(重用Sprite &替换场景)会很好。 。

回答

3

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

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

+1

我认为海报是指这个http://stackoverflow.com/questions/8989189/cocos2d-scene-memory-management。这不是关于泄漏,而只是要求在过渡期间同时加载两个场景。 – YvesLeBorg

+1

我也这么认为。如果您知道同时在内存中同时使用这两个场景可能会消耗太多内存,则加载场景是一种很好的做法。它还允许您手动清除缓存,具体指定第一个场景的资源,您知道这些场景消耗大量内存但不会再使用(或直到返回)。如果将两个场景排列在一起,则不能这样做,因为到第二个场景开始初始化时,第一个场景仍在内存中,并保存对其所有缓存资源的引用(因此,在这种情况下清除缓存将不起作用) 。 – LearnCocos2D