Я обнаружил странную вещь - объект 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 Мб (на IPad). Давайте нажмем первую кнопку:
[[CCTextureCache sharedTextureCache] addImageAsync:@"mytexture.png" withBlock:^(CCTexture2D *text){
NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]);
}];
сейчас память составляет около 24 мб. ОК. давайте нажмем второй:
[[CCTextureCache sharedTextureCache] removeTextureForKey:@"mytexture.png"];
NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]);
и память все еще 24 мб !!! Зачем??? Единственным объектом, который ссылался на текстуру, был кеш, но он удалил ее. Почему это все еще в памяти? Какие ссылки на него? Если я добавлю текстуру с помощью метода addImage:
, он будет удален, как я ожидаю. Итак, как это работает? Как выгрузить его из памяти?
Если вы считаете, что функция проверки памяти может выдавать ложные данные, я хочу сказать, что я профилировал приложение с помощью инструментов, и он показал тот же результат.
Вы заинтересованы в базовом материале или хотите просто освободить память? так что второй - пытаетесь ли вы вызвать + (void) purgeSharedTextureCache \t для CCTextureCache? –
@ СергейМалетин сделайте это ответом, чтобы я мог принять его, потому что он сработал !!! ты моя заставка! благодаря! если вы объясните базовый материал, который будет просто отличным –
Как вы проверяете использование памяти? –