设备上的Cocos2d/Box2d应用程序中的内存警告(iPhone/iPad)

Tar*_*run 2 cocos2d-iphone

以下是Xcode 中profile-> leaks的信息,我在iPad 2上运行了大约21分钟,然后崩溃了12秒.

live Bytes ---- 5.45 MB

生活---- 13547

Transitory ---- 3845036

总字节数 - 720.31 MB

当应用程序在设备上运行时,应用程序会在控制台中崩溃打印已接收内存警告.

我不太清楚它是如何工作的.

但请告诉我,如果一个应用程序在一台设备上运行21分钟,在此运行期间总共使用大约720 MB的内存,但实时字节永远不会超过7.0 MB.

我接受应用程序开始使用3.25 MB作为实时字节,并且在此运行期间它在实时字节上达到5.45 MB并且我不确定实时字节如何继续增加.

但我的问题是:

这个应用程序是否足以在设备上运行时产生崩溃?

要么

我还面临其他一些问题吗?

Yve*_*org 5

你可能在CCTextureCache单例中留下了大量的精灵.每次创建CCSprite时,纹理都会被缓存(静默),以便下次引用它时,加载和显示将更快(更快).在模拟器中运行分配分析(参见下面的两个图片):

这是在设备上运行的

这在模拟器中运行

顶部图像来自设备上的分配分析.最大内存4.4 Mb.

底部图像是相同的应用程序,相同的游戏玩法序列,同时在模拟器中进行分析(峰值在78 Mb左右).通过在模拟器中运行,我可以在分配中看到我的精灵使用的内存.在设备中,分配工具不考虑此内存.

你正在寻找趋势和离散的大跳跃.如果你再也不回来,你可能会留下未使用过的精灵.在我的例子中,我选择在游戏执行的特定点从纹理中释放特定资源.这是appController的一个例子

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    MPLOGERROR(@"Before purge");
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

    [CCAnimationCache purgeSharedAnimationCache];
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
    [[CCDirector sharedDirector] purgeCachedData];

    MPLOGERROR(@"%After purge");
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

}  
Run Code Online (Sandbox Code Playgroud)

这是最后的沟渠,蛮力清理.但是您可以在游戏过程中删除不同点的特定纹理,而不会影响应用程序的"感知"响应性.缓存在原则上通常是合理的,但是在面对受限资源时可能变得非常棘手.了解它,进行实验,最终你会发现"保持什么/接受什么"的正确组合,以实现平滑的应用程序性能.

PS.虽然模拟器适用于某些测试,但不要将其"性能"作为基准.模拟器性能在图形方面毫无意义,它不使用计算机的GPU(这就是为什么你看到图形内存分配:)).