2011-12-30 77 views
0

問題是2D特定的。緩衝direct3d繪製操作

我是一個不斷更新的紋理,這是我的一個圖層的渲染目標。更新是整個紋理的重繪,並通過繪製精靈和輸出文本來執行。該操作頻繁執行,消耗了相當多的CPU,當然,我已經優化了重繪的次數以保持它不下來。

有沒有辦法在Direct3D中緩存這些操作?因爲目前我必須重複構建一系列精靈/文本操作。讓我們假設任何遊戲都在進行世界更新 - 他們如何克服這種乏味的工作?也許通過創建更多圖層?

對我來說最好的辦法是創建一個可修改的繪製鏈對象,但我在Direct3D中沒有找到像這樣的東西。

回答

1

有可能會考慮一些通用的方法:

  • 配料:順序,並結合即將進行的幾次電話成爲可能,並繪製狀態變化之間儘可能多的對象,你可以。
  • 緩存:儘可能多地在頂點緩衝區中保留幾何圖形。隨着2D,這變得更有趣,因爲大多數東西都是有質感的四邊形。在這種情況下...
  • 着色器:可能會寫一個頂點着色器,該着色器需要一個float4給出您的四邊形的X/Y位置/大小,然後使用該着色器繪製4個頂點。您不需要執行全矩陣狀態更改,只需更新着色器中的4個浮點數(跳過所有視圖計算,減少75%的內存和數學運算)。爲了確保正確的設置與着色器一起使用,...
  • 狀態塊:爲每種類型的精靈保存一個狀態塊,並綁定所有顏色,模式和着色器。然後只需應用狀態塊,綁定紋理,設置座標並繪製。充其量,你可以讓每個精靈降至4個電話。即使仍然...
  • Cu:最好不要畫任何東西。如果你可以做簡單的屏幕邊界檢查(可以比每個多邊剔除更快),排序和基本遮擋(帶有透明度的標誌精靈)。使用2D,大多數撲殺檢查非常便宜。無論你在哪裏,都可以進行排序和剪輯。

就實際緩衝而言,司機會在適當的時間和地點爲您處理。狀態塊可以通過在一次調用中提供所有模式(我忘記它是好還是壞,但我相信它們可能是有益的)來影響緩衝。將呼叫切斷爲:

if (sprite.Visible && Active(sprite) && OnScreen(sprite)) 
{ 
    states[sprite.Type]->Apply(); 
    device->BindTexture(sprite.Texture); 
    device->SetVertexShaderF(sprite.PositionSize); 
    device->Draw(quad); 
} 

很有可能幫助CPU使用。