这是我在游戏中遇到的一种新问题。我可以说我已经实现了游戏的所有代码。但我面临着问题。实际上发生的事情是,当我玩的时间超过 5-6次时,游戏会变慢,这意味着我们可以感觉到它的进展缓慢。但它的FPS是60,但FPS的波动发生在60到30之间。
在我的游戏中,我实施了 ARC 。我也可以看到每次场景中存在的对象数量相同。
我还使用乐器来检查游戏中的内存泄漏,但游戏中有无内存泄漏。我无法显示代码,因为它是保密的。
但我无法解决这个问题。我想知道这背后的原因是什么,我该如何解决这个问题。
任何形式的帮助都会有所帮助
答案 0 :(得分:3)
虽然我没有使用Apple玩具来执行此操作,但每次运行我的应用程序时都会执行类似快照的分析:我的每个类都内置了这样做的工具,以便我能够确切地确定在程序执行期间的任何时刻当前分配(未解除分配)的实例数。当我在项目中添加一个项目时,每个班级的工作量(比如大约1分钟)就可以了,但在项目的整个生命周期中都可以节省生命。
在评论中回到上面的问题,我不知道你的500K。现在唯一可以解决这个问题的人就是你。如果你的游戏有一个逻辑点(比如一个游戏主菜单),你可以在退出应用程序之前回来(我的意思是硬杀),在那个地方,我会在菜单绘制之后开始这样做:
// below code with cocos2d 2.x
NSLog(@"*** before purge ***");
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
[CCAnimationCache purgeSharedAnimationCache];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
[[CCDirector sharedDirector] purgeCachedData];
[self scheduleOnce:@selector(dumpTextures) delay:0.5f];
// let the run loop cycle a bit
// to give a chance for auto-release objects to be
// disposed from the pool ...
-(void) dumpTextures {
NSLog(@"*** after purge ***");
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
}
并检查结果。寻找cocos2d仍然为你保留的任何纹理......到目前为止最可能的记忆力。我不认为5-50倍500K会在一个高达140Mb的游戏中产生很大的差异。
答案 1 :(得分:2)
泄漏内存和放弃内存之间存在差异。 ARC有助于泄漏,但它仍然允许您在不再需要时保留对对象的强引用。一个例子是保留周期。
您可以执行称为“快照分析”的技术。使用乐器时,它会显示游戏结束后不再需要的内存。
这里有一个关于快照的教程。 http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode