2011-04-20 129 views
1

我有5個圖塊。每個都是16x16像素,大小爲8kb。它們都使用imageNamed加載。例如,[UIImage imageNamed:@「dirt.png」]。它們在init之外的drawRect之外加載。我有一個名爲「map」的數組,用於映射這些圖塊的位置。在DrawRect中,我有一些代碼使用兩個for循環來呈現舞臺,如下所示。性能問題使用UIImage渲染圖像imageNamed方法

tileNum = startPoint; 
for(int i = 0; i< stageHeight; i++){ 
    for(int ii = 0; ii< stageWidth; ii++){ 
     if(map[tileNum] == 0){ 
      [dirt drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)]; 
     }else if(map[tileNum] ==1){ 
      [tree1 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)]; 
     }else if(map[tileNum] ==2){ 
      [tree2 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)]; 
     }else if(map[tileNum] ==3){ 
      [tree3 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)]; 
     }else if(map[tileNum] ==4){ 
      [tree4 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)]; 
     } 
     tileNum++; 
    } 
    tileNum += (mapWidth - stageWidth); 
} 

一切工作在模擬器真棒,只是我想要它。但是,當我放入設備(3GS)時,幀頻會慢慢下降(大約每秒1幀)。我懷疑它可能與使用imageNamed有關。還是僅僅因爲我渲染了太多的瓷磚? (在16x16的時候,我每幀渲染600塊瓷磚,但它們是小文件,90%的瓷磚都是「污垢」瓷磚)。如果是這樣,創建一個簡單的磁貼引擎有什麼更好的方法?

這是我第一次發佈問題。感謝任何人的幫助。

回答

1

對於這類工作,您最終可能會得到比單獨的圖像文件更好的紋理圖譜。它很難準確地說出那裏發佈的代碼量,但我猜你正在開發某種類型的遊戲,這意味着你可能想要使用opengl進行繪圖。

我建議從蘋果的OpenGL ES Programming Guide開始,特別是關於Texture Data的部分,當我開始潛入gamedev時,它幫了我很多。

+0

非常感謝你們。我會看看OpenGL。你有沒有覺得這是一個學習曲線? – 2011-04-20 19:43:52

+0

我實際上在學校上過OpenGL課,所以從純OpenGL到OpenGL ES幾乎沒有學習曲線。查看[GLTextureAtlas](http://developer.apple.com/library/ios/#samplecode/GLTextureAtlas/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40009014)以獲得絕佳的出發點。 – Sam 2011-04-21 01:03:05