gpt4 book ai didi

ios - Cocos2d。为什么异步加载纹理会保留它?

转载 作者:行者123 更新时间:2023-11-29 13:00:03 25 4
gpt4 key购买 nike

我发现了一件奇怪的事情 - 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 对应用程序进行了概要分析,它显示了相同的结果。

最佳答案

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

至于实际问题:

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

关于ios - Cocos2d。为什么异步加载纹理会保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com