Cocos2d.为什么异步加载纹理会保留它



我发现了一件奇怪的事情 - 当使用addImageAsync:(NSString*)path withBlock:(void(^)(CCTexture2D *tex))block-(void) addImageAsync: (NSString*)path target:(id)target selector:(SEL)selector异步加载对象时CCTexture2D对象会被保留。

为了验证这一点,我创建了一个非常简单的项目。实际上这是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:方法添加纹理,它会按照我的预期被删除。那么如何解决呢?如何从内存中卸载它?

如果您认为内存检查功能可以提供错误数据,那么我想说我已经使用仪器分析了该应用程序,并且它显示了相同的结果。

更喜欢使用仪器测量内存使用情况。

至于实际问题:

  • 任何精灵或精灵框架也将保留纹理
  • 释放内存
  • 可能需要一些时间,即当自动释放池被清除时,这意味着在清除后直接测量内存使用情况会给您留下错误的印象(因此使用仪器)

相关内容

  • 没有找到相关文章

最新更新