2010-08-26 64 views
1

我正在製作一個遊戲,需要在屏幕上繪製多個圖像。我使用這個代碼是:iPhone編程Quartz Slow

- (void)drawRect:(CGRect)rect { 
    for (i=1;i<=totalImages;i++) { 
     if (imageExists[i]) { 
      [image drawAtPoint:CGPointmake(imageX[i],imageY[i])]; 
     } 
    } 
} 

這drawRect中通過函數調用:

-(void) gameLoop { 
    [self setNeedsDisplay]; 
} 

而且gameloop由定時器稱爲每秒60個定時器

[NSTimer scheduledTimerWithTimerInterval:0.01666 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES]; 

imageExists [],IMAGEX []和圖像j []數組是我在gamecode用於創建/刪除,並在屏幕上移動圖像。

我的問題是,當我有大約40圖像周圍的framespeed移動幾乎是由時只有1圖像減半。我的遊戲最多需要88張圖片。 (這只是當我測試它在我的iPod Touch的發生,在模擬器,一切工作正常...)

我的問題是:爲什麼是的drawRect函數慢,或者是它的drawAtPoint?我該如何解決這個問題?我是否應該使用它來繪製圖像,還是應該學習OpenGL ES來製作遊戲?

+1

我不會建議這是答案,因爲我不知道這些效果,但是如果您使用CALayers作爲精靈,會發生什麼情況。在設置傳遞CGImage的邊界以初始化它們之後,只需在CALayers上調用-setContents即可。然後通過在圖層上調用-setPosition(或通過使用顯式動畫)來對動畫進行動畫處理。我建議這樣做的原因是因爲核心動畫運行在OpenGL之上,而不必明確使用OpenGL。我只是想知道它是否會給你更好的表現。 – 2010-08-26 15:09:17

+1

@Matt - 你應該讓這個答案,因爲這是一個完美的有效解決方案,他的表現問題。 – 2010-08-26 16:07:19

回答

1

我的建議是尋找到一個遊戲庫像cocos2d-iphone這需要照顧的大多數OpenGL的東西,你在幕後。對於典型的遊戲功能,Quartz和CoreAnimation會獲得更高的性能,並且包括用於集成遊戲交互的物理和聲音庫等內容。

寫OpenGL的主要事情可以做2D遊戲中更好地管理什麼進入視頻存儲與在RAM中,塊傳輸精靈在屏幕上的正確位置時,這能夠帶來很多東西停留。

+0

我會考慮Cocos2d-iPhone 謝謝^^ – 2010-08-26 15:09:59

0

幾件事情:

  • 不要使用定時器。使用CADisplayLink。它就像一個計時器,除非它在vsync上正確啓動。看看蘋果的文檔。

  • 是的,你一定要去了OpenGL | ES方式。在這裏,問題在於你在每個幀重繪時將40個以上的紋理從CPU推送到GPU。在OpenGL | ES中,您可以將所有紋理一次推送,然後告訴GPU「移動」它們。這將會更有效率。 (即固體60fps,CPU使用率非常低)。