在后台线程中加载AtlasSpriteManager不起作用

时间:2009-10-27 17:36:02

标签: iphone caching cocos2d-iphone

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

请帮助..

由于 桑卡尔

1 个答案:

答案 0 :(得分:0)

你需要做多特别的事情才能从多个线程中使用OpenGL。请参阅this question