2009-10-27 66 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