Cocos2d. Почему загрузка текстуры асинхронно сохраняет ее?

Я обнаружил странную вещь - CCTexture2D объект сохраняется, когда он загружается асинхронно либо с использованием addImageAsync:(NSString*)path withBlock:(void(^)(CCTexture2D *tex))block или же -(void) addImageAsync: (NSString*)path target:(id)target selector:(SEL)selector,

Чтобы убедиться в этом, я создал очень простой проект. На самом деле это 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: метод это удаляется, как я ожидаю. Так как это решить? Как выгрузить его из памяти?

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

1 ответ

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

Что касается актуальной проблемы:

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