2008-10-28 40 views
2

我目前從頭開始爲XNA遊戲創建窗口系統。我主要爲Windows開發,但誰知道我將來可能支持哪些平臺。如果您知道本機Direct3D的這一點,請隨時回答,因爲性能語義應該相似。如果可能,考慮如果目標平臺是X-Box 360,會發生什麼變化。XNA中的窗口系統渲染策略(RenderTarget性能)

我正在取得良好進展,但現在我不確定如何準確呈現窗口。我想出了四種方法:

  • 只需將所有控件直接渲染到屏幕上。這就是我現在所做的。只要它們不是半透明的,控件就可以通過狀態之間的混合進行動畫。我沒有找到在任意數量的狀態之間進行動畫製作的好方法(假設一個按鈕目前正在從按鈕動畫到按鈕動畫,從鼠標滑過到鼠標滑過,然後它被禁用)。從最後一個狀態平滑地融合到新狀態,這種方法只適用於最後一個動畫完成後播放一個動畫,否則你將在動畫中跳轉。所有的控件都放到一個渲染目標中,然後用它在屏幕上以半透明的方式渲染頂層窗口,這使得頂層工作具有半透明性,並且易於管理,但不會改變動畫

  • 將每個控件渲染爲rende r目標,它只在控制變髒時更新(即,必須動畫或文本已被更改)。這樣,每個控件的半透明度就可以工作。

  • 和以前一樣,但是除了解決動畫問題之外,還有每個控件的第二個渲染目標。每當動畫開始時,交換渲染目標,所以我們有動畫開始時的狀態,並將其與目標狀態混合到另一個渲染目標中。這不應該增加以前的方法的開銷,我們只有兩倍的渲染目標,其中在任何給定幀中只有一個渲染目標(最多)。但問題來了:爲了達到這個目的,我需要讓「舊」渲染目標保留其內容。這應該能在Windows上獲得良好的性能,但似乎對X-Box 360有嚴重的性能影響。另一方面,只有在動畫處於活動狀態時才需要「保留」位。

這裏來了實際的問題。任何澄清的事情都是值得歡迎的。考慮到性能問題,請記住,這只是遊戲的窗口系統 - 背後的遊戲可能會使用許多渲染目標並吸取性能,而且可能比窗口系統要多得多。假設我們可能在絕對最差的情況下在屏幕上有五個頂級窗口,每個窗口都有20-40個控件。

  • 您會推薦哪些方法,如果有的話,爲什麼?當然,請隨意添加另一種方法。
  • 如果讓我們說200或400個渲染目標可用,那麼是否會對性能產生影響?假設只有20個渲染目標可以渲染到每個幀?
  • PreserveContents對X-Box 360的性能影響真的很差嗎? Windows有多糟糕?
  • 可以寫入RenderTarget2D.RenderTargetUsage屬性。在運行時切換這是一個好主意,僅在需要時啓用PreserveContents?
  • 請問你(作爲球員)心若控制動畫會跳在某些情況下,像盤旋在一個按鈕,出來,然後移動鼠標再次,所以「正 - >懸停」動畫從頭開始播放兩次因爲它比你慢?

回答

3
  • 如果你想與動畫控制(即具有多一次回事同一控制)的該級別,那麼你就要有做多遍。因此,在着色器中啓用這種類型的東西,並使用着色器進行多次傳遞,或者執行標準的Render-> Resolve-> Rerender循環。
  • 創建許多rendertargets確實有一個性能問題。創造這麼多不是一個好主意。您最好擁有較小數量的更大尺寸的渲染目標,併爲該目標編寫多個控件。
  • 它一直年齡,因爲我沒有任何360 DEV(開溜:(),但是從我可以rememeber,這不是真的很大。我會避免這個選項,除非絕對必要的。希望有人與更多的最新經驗,可以在這裏幫助。
  • 這可能會在運行時正常工作,但可能涉及幕後工作的公平一點。我不會期望,要執行太清楚了。我敢肯定,這很好,如果你不是在做渲染循環的中間。
  • 我覺得心驚肉跳動畫肯定會吸。恕我直言:)
+0

感謝您的輸入。我沒有想法將多個控件渲染成一個大的渲染目標,儘管現在你說這看起來很明顯。當我有空時,我會更深入地看待這一點,然後很可能會接受你的答案。 – OregonGhost 2008-12-09 12:56:09

4

如果你正在爲Xbox 360開發,你一定要小心渲染目標。 Xbox 360有一個特殊的內存(10MB)來保存渲染目標,包括用於在屏幕上渲染的渲染目標。

只要不超過10MB,從一個切換渲染目標到另一個沒有任何影響,即使有PreserveContents,因爲所有的渲染目標都存儲在這個特殊的記憶。

但是,當你有超過渲染PreserveContents目標10MB以上,這個屬性必須通過不斷切換渲染目標回正常記憶效仿。

所以渲染目標的數量並不像那些渲染目標的總數那麼重要。你可以知道一個渲染目標與這個公式大小:

size (bits) = width x height x color data size (bits) 

顏色數據大小是在Xbox 360上32位的話,作爲一個例子,如果你的庫的用戶正在開發自己的遊戲,高清只有沒有其他的渲染目標比主之一,他將使用:

3,515625MB = 29491200 bits = 1280 x 760 x 32 bits 

此外,應避免創建動態渲染目標。它花費太多。您應該在遊戲開始時創建一個靜態渲染目標池並讓您的GUI組件請求它們。

+0

感謝您的輸入。渲染目標池是一個有趣的想法。我實際上並沒有爲Xbox 360開發,我只是不想排除這個選項。渲染目標的10 MB似乎並不多。這幾乎滿1080p的屏幕。 – OregonGhost 2009-07-16 09:00:02

+0

是的,它非常有限。您可以認爲具有10MB以上的渲染目標,但更新超過10MB的渲染目標時,每個滴答開始花費CPU時間。 – Jodi 2009-07-19 00:55:40

1

Xbox360上有用於當前渲染目標的特殊10MB內存。但其餘的人談到它的工作原理並不準確。無論使用什麼渲染目標,都會佔用10MB的空間。否則,您可以擁有任意數量的渲染目標。如果您的渲染目標比10MB大(1280×720像一些AA多重採樣是),那麼XBOX360採用了一種名爲預測平鋪技術:http://msdn.microsoft.com/en-us/library/bb464139.aspx

我順利進入編寫一個窗口系統。我將窗口部件渲染到渲染目標,然後將窗口部件目標渲染到窗口目標,將窗口目標渲染到後端緩衝區。這使我可以輕鬆地添加滾動條並僅將部分渲染目標渲染到窗口渲染目標上。如果有更好的方法來處理滾動窗口內容的工作讓我知道。不知道這是否是最好的表現。