我發現了一個奇怪的東西 - 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:
方法添加紋理,它會被刪除,因爲我期望它。那麼如何解決它?如何從內存中卸載它?
如果您認爲內存檢查功能可以給出錯誤的數據,那麼我想說我已經用儀器對應用程序進行了剖析,並且顯示了相同的結果。
你是否對底層的東西感興趣或者你只是想釋放內存?所以第二個 - 您是否嘗試爲CCTextureCache調用+(void)purgeSharedTextureCache \t? –
@СергейМалетин使它成爲一個答案,所以我可以接受它導致它確實工作!你是我的救星!謝謝!如果你解釋一下那些將會很好的底層內容 –
你如何檢查內存使用情況? –