2012-01-13 78 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