我已经完成了我的游戏,并试图修复一些内存问题。检查cocos2d的节点树
我的游戏有36级水平,我注意到,当我在一个iPod运行,经过20-25的水平我的应用程序崩溃。我开始获取内存警告,并且在场景之间转换时它总是崩溃。
我已经使用仪器来修复每个内存泄漏,但这仍然在发生。 我的猜测是,椰子仍然持有对旧对象的引用。
我想找到一种方法,通过看我的比赛的某些点科科斯节点层次结构,以确保一切正常。
任何想法如何做到这一点?
我已经完成了我的游戏,并试图修复一些内存问题。检查cocos2d的节点树
我的游戏有36级水平,我注意到,当我在一个iPod运行,经过20-25的水平我的应用程序崩溃。我开始获取内存警告,并且在场景之间转换时它总是崩溃。
我已经使用仪器来修复每个内存泄漏,但这仍然在发生。 我的猜测是,椰子仍然持有对旧对象的引用。
我想找到一种方法,通过看我的比赛的某些点科科斯节点层次结构,以确保一切正常。
任何想法如何做到这一点?
我落得这样做:
我增加了一些逻辑在CCDirector
“画” 的层次结构:
-(void) printChildren:(CCNode *)node andLevel:(NSInteger)level {
NSString *tabs = @"";
for (int i=0; i <level; i++) {
tabs = [NSString stringWithFormat:@"%@ ", tabs];
}
NSLog(@"%@NODE %@. Children count: %d", tabs, node, node.children.count);
if (node.children.count == 0) {
return;
} else {
for (CCNode *child in node.children) {
[self printChildren:child andLevel:level+1];
}
}
}
-(void) nodeHierarchy
{
NSLog(@"Printing nodeHierarchy! with an stack of %d scenes", [scenesStack_ count]);
for (CCScene *scene in scenesStack_) {
NSLog(@"Scene in stack: %@", [scene class]);
[self printChildren:scene andLevel:0];
}
}
我呼吁在replaceScene
方法nodeHierarchy
。
这将是一个更好的视觉工具,但这对我很有用。
一个简单的方法是添加断点或日志语句添加到场景的dealloc方法中,如果在更改场景后没有触发它,则知道存在内存泄漏(这可能不会在Instruments中注册)。 – LearnCocos2D 2012-01-14 15:14:42
您无法迁移到具有ARC的SDK 5.0的任何原因。
我的分配/释放是好的,我没有看到任何仪器泄漏。 – Macarse 2012-01-13 13:02:02
@Aman Xcode的每一次更新对我来说都是一个地狱。接近发布一些产品将是不更新的绝佳理由。从这个角度来看,没有理由相信ARC是非常热门的。 – YvesLeBorg 2012-01-13 14:04:09
我已经修改CCTextureCache登录其纹理保留和其他人被释放,在我的游戏,我在那里强行“removedUnusedTextures”关键步骤,尤其是在场景转换。无论您看到什么,都应该提示您的应用在哪里寻找。另外,我倾向于用一个独特的标签标记所有内容,并且记住每个课程中向CCNode添加内容的标签。在洗(清理),我破坏了标签阵列,并强制删除它们。
我已经检查过了。我的纹理很好:( – Macarse 2012-01-13 14:27:08
嗯......好的,你有T恤,好吧,也面临类似的问题,我已经得到了JetBrain的AppCode,它捕获了我的代码中的很多隐藏问题,通过分析和仪器祝您好运与您的产品AppCode不是Xcode的一个替代品,但该项目的编码,调试阶段一个伟大的工具 – YvesLeBorg 2012-01-13 14:32:30
@YvesLesBorg:。。谢谢,我会检查出 – Macarse 2012-01-13 14:47:05
是否打印出足够的节点来“浏览”它们? – 2012-01-13 14:02:15