2012-01-13 79 views
0

我已经完成了我的游戏,并试图修复一些内存问题。检查cocos2d的节点树

我的游戏有36级水平,我注意到,当我在一个iPod运行,经过20-25的水平我的应用程序崩溃。我开始获取内存警告,并且在场景之间转换时它总是崩溃。

我已经使用仪器来修复每个内存泄漏,但这仍然在发生。 我的猜测是,椰子仍然持有对旧对象的引用。

我想找到一种方法,通过看我的比赛的某些点科科斯节点层次结构,以确保一切正常。

任何想法如何做到这一点?

+0

是否打印出足够的节点来“浏览”它们? – 2012-01-13 14:02:15

回答

1

我落得这样做:

我增加了一些逻辑在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

这将是一个更好的视觉工具,但这对我很有用。

+0

一个简单的方法是添加断点或日志语句添加到场景的dealloc方法中,如果在更改场景后没有触发它,则知道存在内存泄漏(这可能不会在Instruments中注册)。 – LearnCocos2D 2012-01-14 15:14:42

0

您无法迁移到具有ARC的SDK 5.0的任何原因。

+0

我的分配/释放是好的,我没有看到任何仪器泄漏。 – Macarse 2012-01-13 13:02:02

+1

@Aman Xcode的每一次更新对我来说都是一个地狱。接近发布一些产品将是不更新的绝佳理由。从这个角度来看,没有理由相信ARC是非常热门的。 – YvesLeBorg 2012-01-13 14:04:09

1

我已经修改CCTextureCache登录其纹理保留和其他人被释放,在我的游戏,我在那里强行“removedUnusedTextures”关键步骤,尤其是在场景转换。无论您看到什么,都应该提示您的应用在哪里寻找。另外,我倾向于用一个独特的标签标记所有内容,并且记住每个课程中向CCNode添加内容的标签。在洗(清理),我破坏了标签阵列,并强制删除它们。

+0

我已经检查过了。我的纹理很好:( – Macarse 2012-01-13 14:27:08

+0

嗯......好的,你有T恤,好吧,也面临类似的问题,我已经得到了JetBrain的AppCode,它捕获了我的代码中的很多隐藏问题,通过分析和仪器祝您好运与您的产品AppCode不是Xcode的一个替代品,但该项目的编码,调试阶段一个伟大的工具 – YvesLeBorg 2012-01-13 14:32:30

+0

@YvesLesBorg:。。谢谢,我会检查出 – Macarse 2012-01-13 14:47:05