我目前從頭開始爲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?
- 請問你(作爲球員)心若控制動畫會跳在某些情況下,像盤旋在一個按鈕,出來,然後移動鼠標再次,所以「正 - >懸停」動畫從頭開始播放兩次因爲它比你慢?
感謝您的輸入。我沒有想法將多個控件渲染成一個大的渲染目標,儘管現在你說這看起來很明顯。當我有空時,我會更深入地看待這一點,然後很可能會接受你的答案。 – OregonGhost 2008-12-09 12:56:09