【发布时间】:2009-10-28 12:30:07
【问题描述】:
我正在使用 cocos2d 做一个 iPhone 游戏,其中涉及大量角色动画(至少 25 个不同的动画)。我有很多 spritesheets,每个大小在 100KB 到 200KB 之间。我曾经创建AtlasSpriteManagers 用于这些按需。但是当我在设备中测试这个时,这些动画出现了很多性能问题..缺少帧..游戏挂起,而图像加载等等..
所以我决定创建一种预加载和缓存技术,在该技术中我不断向前看并创建我可能需要的可能 AtlasSpriteManagers 并将它们维护在 NSMutableDictionary 中,并在动画期间从那里获取它......并基于 usageCount变量,稍后我会将它们从字典中删除并释放内存。我使用 performSelectorInBackground 方法调用此函数“loadASM”,该函数创建 AtlasSpriteManager 并将其存储在字典中。
[self performSelectorInBackground:@selector(loadASM:) withObject:fileName];
-(ASMHolder *)loadASM:(NSString *)fileName
{
AtlasSpriteManager *sprMgr = [AtlasSpriteManager spriteManagerWithFile:fileName capacity:40];
ASMHolder *asmHolder = [[ASMHolder alloc] init];
asmHolder.sprMgr = sprMgr; asmHolder.retainCount++;
[asmDict setObject:asmHolder forKey:fileName];
return asmHolder;
}
但是,如果我使用 performSelectorInBackground 在后台调用此方法,图像似乎不会加载。图像应该出现的位置会出现一个白色框。但是,AtlasSpriteManager 对象已创建并且它在字典中..但它只是变成空白精灵..而不是后台调用,如果我尝试直接调用方法'loadASM'(即[self loadASM:fileName]),图像正在加载..但当然,有延迟,因为这是同步调用..
我什至尝试缓存 Texture2D 对象而不是 AtlasSpriteManagers,但结果是一样的..
(我也尝试过 TextureManager 的 addImageAsync .. 但这对我的目的也没有帮助.. 因为它没有在回调方法的参数中给出它正在加载的文件名,没有它我的字典缓存的键无法创建.. )
请帮忙..
谢谢 桑卡尔
【问题讨论】:
标签: iphone caching cocos2d-iphone