2009-10-27 30 views
0

我正在做一个使用cocos2d的iPhone游戏,涉及到一大组角色动画(至少25个不同的角色动画)..为此我有大量的每张重约100KB的图片200KB。我曾经为这些按需创建AtlasSpriteManagers。但是当我在设备上测试这个时候,围绕这些动画出现了很多性能问题..有帧丢失..游戏挂图像加载和所有..在后台线程中加载AtlasSpriteManager不工作

因此,我决定创建一个预加载和缓存技术,我不断地向前看并创建可能需要的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 ..但这并不能帮助我的目的..因为它没有给出它在加载回调方法的参数中的文件名,没有这个参数我的字典缓存的密钥不能被创建.. )

请帮助..

感谢 桑卡尔

回答

0

你需要做特别的事情来使用OpenGL从多个线程。见this question

+0

感谢您的帮助,大卫。我是新的OpenGL ..所以任何想法如何我可以做到这一点在cocos2d ..我认为AtlasSpriteManager内部使用OpenGL ..但我可以编写OpenGL代码,将影响AtlasSpriteManager? – Sankar 2009-10-28 06:10:13

+0

您可能需要在链接的文章中谈论魔术,以告诉您的新线程使用匹配的OpenGL上下文。我建议搜索cocos2d和EAGLShareGroup,看看是否可以找到已经这样做的人......另外,您可能需要管理自己的线程,而不是仅使用performSelectorInBackground。 – 2009-10-28 18:51:56

+0

谢谢大卫..我没有搜索这个,发现addImageAsync函数已经在内部做这些事情。所以我改变了我的代码,以某种方式使用该函数本身..谢谢反正.. :) – Sankar 2009-11-02 11:04:29