2013-11-15 54 views
1

我發現了一個奇怪的東西 - CCTexture2D當它通過使用addImageAsync:(NSString*)path withBlock:(void(^)(CCTexture2D *tex))block-(void) addImageAsync: (NSString*)path target:(id)target selector:(SEL)selector異步加載時,對象被保留。Cocos2d。爲什麼加載紋理異步保留它?

爲了驗證這一點,我創建了一個非常簡單的項目。其實這是cocos2d模板。我有兩個按鈕,一個PNG文件mytexture.png和打印以兆字節消耗的內存的函數。這是函數:

void report_memory(void) { 
struct task_basic_info info; 
mach_msg_type_number_t size = sizeof(info); 
kern_return_t kerr = task_info(mach_task_self(), 
           TASK_BASIC_INFO, 
           (task_info_t)&info, 
           &size); 
if(kerr == KERN_SUCCESS) { 
    NSLog(@"Memory : %f", info.resident_size/1024.0f/1024.0f); 
} else { 
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr)); 
} 
} 

當什麼也沒發生,並顯示剛剛cocos2d層的存儲大約是8 MB(在iPad上)。讓我們點擊第一個按鈕:

[[CCTextureCache sharedTextureCache] addImageAsync:@"mytexture.png" withBlock:^(CCTexture2D *text){ 

      NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]); 

     }]; 

現在的內存是24 MB左右。好。讓我們點擊第二個:

[[CCTextureCache sharedTextureCache] removeTextureForKey:@"mytexture.png"]; 
NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]); 

和內存仍然是24 MB!爲什麼???引用紋理的唯一對象是緩存,但已將其刪除。爲什麼它仍然在記憶中?什麼引用它?如果我通過使用addImage:方法添加紋理,它會被刪除,因爲我期望它。那麼如何解決它?如何從內存中卸載它?

如果您認爲內存檢查功能可以給出錯誤的數據,那麼我想說我已經用儀器對應用程序進行了剖析,並且顯示了相同的結果。

+0

你是否對底層的東西感興趣或者你只是想釋放內存?所以第二個 - 您是否嘗試爲CCTextureCache調用+(void)purgeSharedTextureCache \t? –

+0

@СергейМалетин使它成爲一個答案,所以我可以接受它導致它確實工作!你是我的救星!謝謝!如果你解釋一下那些將會很好的底層內容 –

+0

你如何檢查內存使用情況? –

回答

1

傾向於使用儀器來測量內存使用情況。

至於實際問題:

  • 任何精靈或前景幀也將保留紋理
  • 可能需要存儲器之前一些時間被釋放時,即當autoreleasepool吹掃這意味着測量存儲器使用清除後直接給你錯誤的印象(因此使用儀器)