2013-11-15 6 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 Мб (на 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:, он будет удален, как я ожидаю. Итак, как это работает? Как выгрузить его из памяти?

Если вы считаете, что функция проверки памяти может выдавать ложные данные, я хочу сказать, что я профилировал приложение с помощью инструментов, и он показал тот же результат.

+0

Вы заинтересованы в базовом материале или хотите просто освободить память? так что второй - пытаетесь ли вы вызвать + (void) purgeSharedTextureCache \t для CCTextureCache? –

+0

@ СергейМалетин сделайте это ответом, чтобы я мог принять его, потому что он сработал !!! ты моя заставка! благодаря! если вы объясните базовый материал, который будет просто отличным –

+0

Как вы проверяете использование памяти? –

ответ

1

Предпочитают измерять использование памяти с помощью инструментов.

Что касается фактического выпуска:

  • любого спрайта или спрайта кадра будет также сохранить текстуру
  • это может занять некоторое время, прежде чем память освобождается, то есть, когда autoreleasepool продувается, что означает измерение использования памяти непосредственно после очистки дает вам неправильное впечатление (отсюда и использование инструментов)
Смежные вопросы