2012-01-27 54 views
1

我正在用Java製作2D遊戲,導致低FPS(在我的慢速筆記本電腦上)的主要問題之一是不得不將複雜結構重新繪製到Graphics實例,例如帶有標記的刻度盤。緩存2D繪圖的一部分是否是一個好習慣?

除非窗口調整大小,否則刻度盤及其標記將永遠不會改變,所以我認爲將繪製到BufferedImage並重新繪製圖像而不是重新繪製細節是個好主意。針的位置明顯改變,所以這可以繪製在上面。

我從來沒有聽說過這樣做是爲了改進2D遊戲的FPS,所以我想知道是否實際上存儲圖像緩存的好方法或者是否有更好的方法來解決這類問題?我有沒有考慮過與此相關的任何問題?

回答

2

緩存圖像並不是一個壞主意:您可以依靠柵格渲染在大多數任何平臺上進行相當好的優化。根據我的經驗(無可否認,這主要是在涉及2D圖形的移動設備上),Graphics.drawXXX()方法通常比Graphics.drawImage()慢很多。

根據我的經驗,絕大多數2D遊戲利用精靈(即圖像)來渲染幾乎所有東西。通常情況下,即使圖形看起來像使用圖元渲染時也是如此!

另一個有用的技術思考是不重繪區域,除非你真的需要!

編輯:

正如其他人所提到的,主要的代價是,你要使用更多的內存。一旦你不再需要它們,你還必須確保你釋放這些圖像。

+3

由於CPU將整個精靈加載到圖形卡內存中,所以在精靈中渲染通常更快。隨後的調用然後引用已經加載的圖形卡內存。相比之下,一些drawXXX()命令通常不會存儲到圖形卡內存中,因此CPU必須一次執行一次,導致大量的PCI總線通信。一些庫支持「繪圖列表」,其中可以將多個drawXXX(...)命令加載到圖形卡存儲器中並稱爲單個例程;儘管我很長一段時間沒有對此感到困惑。 – 2012-01-27 16:42:59

+0

@EdwinBuck漂亮的背景信息,+1 – vaughandroid 2012-01-27 17:01:08

1

是否緩存部分2D繪圖是一個好習慣?

您正在繪製速度和存儲空間之間進行權衡。只有你可以確定哪個更重要。

您可能會考慮預先渲染撥號並將圖像保存爲GIF,JPG或PNG文件。在繪製這些圖像之前,您必須將這些圖像縮放到您的窗口大小。

您對圖形面板使用雙緩衝嗎?

0

是的,這是一個很好的做法,並且它一直都在進行。在屏幕上顯示圖像之前首先繪製圖像稱爲雙緩衝,並且可以根據程序的需要以不同的方式使用該方法。

雙緩衝的缺點是內存,因爲它需要更多的內存來存儲第二張圖片,但這聽起來像是需要做出的折衷。

+1

我只聽說過提到緩衝整個屏幕(或應用程序窗口)的「雙緩衝」。維基百科似乎同意:http://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics – vaughandroid 2012-01-27 17:07:42

相關問題