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

请帮助..

由于 桑卡尔

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top