-1

这是我在游戏中面临的一种新型问题。我可以说我已经实现了 Game 的所有代码。但我面临着它的问题。实际上,当我玩它超过5-6 次然后游戏变慢时会发生什么,这意味着我们可以感觉到它的速度很慢。但它的 FPS 是 60,但 FPS 的波动发生在 60 到 30 之间。

在我的游戏中,我实现了ARC。我还可以看到场景中存在的每次对象数量都是相同的

我还使用仪器检查游戏中的内存泄漏,但游戏中没有内存泄漏。我无法显示代码,因为它是机密的。

但我无法解决这个问题。我想知道这背后的原因是什么,我该如何解决这个问题。

任何形式的帮助都会有所帮助

4

2 回答 2

3

虽然我不使用 Apple 玩具来执行此操作,但我每次运行我的应用程序时都会执行类似 heapshot 的分析:执行此操作的工具内置于我的每个类中,使我能够准确确定在程序执行期间的任何时候当前分配(未释放)的实例。当我将一个课程添加到一个项目中时,每节课需要做一些工作(比如大约 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-6 倍 500K 不会对峰值在 140Mb 左右的游戏产生太大影响。

于 2013-07-16T21:56:33.577 回答
2

泄漏内存和放弃内存是有区别的。ARC 有助于解决泄漏问题,但它仍然允许您在不再需要对象时保留对对象的强引用。这方面的一个例子是保留周期。

您可以执行一种称为 Heapshot Analysis 的技术。使用工具,它会向您显示在游戏结束后不再需要保留的内存。

这里有一个关于 Heapshot 的教程。http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

于 2013-07-15T21:02:22.313 回答