2011-07-01 163 views
4

我正在嘗試創建一個平臺遊戲,並且我正在採取各種精靈模塊,並將它們拼合在一起以繪製關卡。這要求每一幀在屏幕上繪製大量的精靈。一臺好的電腦在處理所有精靈時沒有問題,但它開始影響老電腦的性能。由於這不是一個大型遊戲,我希望它能夠在幾乎任何一臺電腦上運行。現在,我使用下面的DirectX函數畫我的精靈:DirectX9 - 高效繪製精靈

D3DXVECTOR3 center(0.0f, 0.0f, 0.0f); 

D3DXVECTOR3 position(static_cast<float>(x), static_cast<float>(y), z); 

(my LPD3DXSPRITE object)->Draw((sprite texture pointer), NULL, &center, &position, D3DCOLOR_ARGB(a, r, g, b)); 

有沒有在屏幕上繪製這些圖片更有效的方法?有沒有一種方法可以使用不太複雜的圖片文件(我現在正在使用普通的png)來加快速度?

總結:在DirectX中繪製精靈的性能最友好的方法是什麼?謝謝!

回答

4

您使用的ID3DXSPRITE接口已經非常高效。如果可能的話,在精靈開始和結束調用之間確保所有精靈繪製調用都在一個批處理中發生。這允許精靈界面以最有效的方式排列繪圖。

爲了獲得額外的性能,您可以將多個較小的紋理加載到一個較大的紋理中,並使用紋理座標將它們排除。這使得紋理不必經常交換。請參閱:

http://nexe.gamedev.net/directknowledge/default.asp?p=ID3DXSprite

您正在使用的紋理文件類型並不重要,只要是被預裝到紋理。確保在遊戲/關卡加載完成後將它們全部加載到貼圖中。一旦你將它們加載到紋理中,它們的格式就無關緊要了。

如果你仍然沒有獲得所需的性能,請嘗試使用PIX來分析你的應用程序並找出瓶頸的真實位置。

編輯:

這是太長,無法在一個評論,所以我會編輯這個職位。

當我說交換紋理時,我的意思是用SetTexture將它們綁定到紋理階段。每次調用SetTexture時,都會有一個小的性能影響,因爲它會改變紋理階段的狀態。通常情況下,這個延遲相當小,但如果DirectX必須將紋理從系統內存拉到視頻內存,那麼效果可能會很差。

ID3DXsprite將重新排序開始和結束呼叫之間的拖動。這意味着SetTexture通常只會針對每個紋理調用一次,而不管您將它們劃入的順序如何。

通常值得將小紋理加載到大紋理中。例如,如果可以將所有小紋理合併到一個大紋理中,那麼紋理階段可以保持綁定到所有繪製的紋理。通常情況下,這會帶來顯着的改善,但測試是唯一可以確定它有多大幫助的方法。它看起來很糟糕,但你可以投入任何大的紋理,並假裝它是合併的,以測試性能差異。

+0

非常有幫助!謝謝!還有幾個問題。 交換紋理是什麼意思,它是如何減慢性能?就像我連續繪製三次圖像x,然後連續兩次圖像y一樣,然後再次繪製圖像x,每個圖像都處於不同的alpha級別......這是否會導致2次紋理交換? 將圖像組合成一個紋理映射圖像會使性能顯着提高嗎?如果是這樣,我會很樂意這樣做,但這需要很多工作,因爲我所有的小精靈都是單獨的圖像文件。 – Jeremy

+0

非常好的主意。我會嘗試爲所有內容渲染相同的圖像,並查看其中的差別。再次感謝...非常非常有幫助! – Jeremy

+0

當然,沒問題:) – dschaeffer

2

我同意dschaeffer,但是想補充一點,如果您使用的是大量不同的紋理,最好在單個(或幾個)較大的紋理上將它們揉在一起,並相應地調整不同精靈的紋理座標。紋理狀態變化花費很多,這可能會加速舊系統的速度。

+0

嗯......這聽起來像是一些非常好的信息。謝謝! – Jeremy