我正在使用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 ..但这对我的目的也没有帮助..因为它没有给出它在回调方法的参数中加载的文件名,没有它我的字典缓存的密钥就无法创建了.. )
请帮助..
由于 桑卡尔