【问题标题】:Cocos2d. Why loading texture asynchronously retains it?Cocos2d。为什么异步加载纹理会保留它?
【发布时间】:2013-11-15 17:13:00
【问题描述】:

我发现了一件奇怪的事情——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 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: 方法添加纹理,它会按照我的预期被删除。那么如何解决呢?如何从内存中卸载它?

如果您认为内存检查功能可以提供虚假数据,那么我想说我已经使用 Instruments 对应用程序进行了分析,它显示了相同的结果。

【问题讨论】:

  • 您是对底层内容感兴趣还是只想释放内存?所以第二个 - 你是否尝试为 CCTextureCache 调用 + (void) purgeSharedTextureCache?
  • @СергейМалетин 让它成为一个答案,所以我可以接受它,因为它确实有效!你是我的救命恩人!谢谢!如果你能解释一下底层的东西,那就太好了
  • 你如何检查内存使用情况?
  • @СергейМалетин 你能解释一下底层的东西吗?以便我们有更好的想法,谢谢。
  • @GuyKogus 我的问题中有一个函数。仔细看看

标签: ios objective-c memory cocos2d-iphone cctexturecache


【解决方案1】:

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

至于实际问题:

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

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2012-07-07
    • 2022-01-25
    • 2017-06-25
    • 2013-10-12
    • 2021-10-08
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多