2011-02-06 55 views
4

我正試圖加速繪製每幀改變的全屏幕紋理。在我的系統中,我可以使用GDI和BitBlt()獲得大約1000 FPS,但我認爲可以通過使用Direct3D和動態紋理來提高性能。相反,我只能達到250 FPS左右。如何提高Direct3D流式紋理性能?

我在帶有當前驅動程序的ATI HD 4870的Mac Pro上運行。

我試過使用動態紋理,這給了我一個小的收益(〜15FPS),我試過使用紋理鏈來避免管道堵塞,並且沒有任何效果。

我環顧四周,很少有關於如何使用動態紋理的信息。

我錯過了一些基本的東西嗎?

設備設置:

 
pparams.BackBufferCount = 1; 
pparams.SwapEffect = D3DSWAPEFFECT_DISCARD; 
pparams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; 

紋理創建:

 
device->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, 
         D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL); 

紋理更新:

 
texture->LockRect(0, &locked, NULL, D3DLOCK_DISCARD); 
... write texture data 
texture->UnlockRect(0); 
device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, sizeof(*vertices)); 
... 

您可以從 http://www.libsdl.org/tmp/SDL-1.3.zip

得到進度代碼工作

謝謝!

回答

1

DrawPrimitiveUP非常慢。您應該使用動態頂點緩衝區(使用nooverwrite進行更新,如果已滿則丟棄)。

+0

很久以前我嘗試過,當我沒有使用動態紋理,並且因爲每幀只有一個DrawPrimitiveUP,它似乎並不重要。它會對動態紋理產生更多影響嗎? – 2011-02-06 09:29:04

3

如果您不需要讀回紋理,則可以使用(D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY)標誌創建紋理。