簡體   English   中英

直接寫入頂點緩沖區

[英]Writing directly into vertex buffer

我繼承的DirectX 9應用程序/游戲使用動態頂點緩沖區。 每一幀,它:

  1. 鎖定頂點緩沖區
  2. 循環通過網格並將頂點數據寫入臨時緩沖區(在程序啟動時動態分配),直到它滿了
  3. 將臨時緩沖區的內容復制到頂點緩沖區
  4. 重復步驟2和3,直到復制完所有數據
  5. 解鎖頂點緩沖區

我的問題是,是否需要使用臨時緩沖區? 有沒有理由不將頂點數據直接寫入頂點緩沖區?
我在官方文檔中沒有找到任何這種做法的證據,我不相信以前的程序員。

Discaimer:我不知道DirectX頂點緩沖區如何工作,我可能在這里錯了。

它可能會更慢:分配頂點緩沖區以優化來自GPU的訪問 ,即優選地在GPU自己的內存中的某處。 這意味着直接從CPU訪問它比訪問普通RAM要慢得多。 另一方面,復制整個數組可以相對較快地完成,因此最好在主存儲器中准備這樣的數組並一次性將其復制到頂點緩沖區。

需要臨時緩沖區,但需要注意。

DirectX動態頂點緩沖區針對GPU的讀取訪問和CPU的訪問進行了優化。 寫訪問優化稱為寫組合 ,涉及與普通內存緩存不同的機制。 考慮到您以4/8/16字節塊的順序寫入內存,CPU將批量寫入。

請注意,由驅動程序決定從動態緩沖區的鎖定中獲取哪種內存,它可能不是寫入組合,但是將其視為最佳選擇。

寫入組合內存不會被緩存,因此從中讀取是一個性能災難。

它可以解釋為什么你繼承的游戲使用臨時緩沖區,如果它讀取和寫入臨時緩沖區,或者不按順序編寫組件 - 例如,首先是位置,然后是紋理坐標。

不需要臨時緩沖區。 Lock返回的指針本質上實際上已經是一個臨時緩沖區。 一旦解鎖緩沖區,驅動程序只能在其上實際開始任何有意義的操作。

如果您使用D3DLOCK_DISCARD ,則驅動程序沒有義務使用任何敏感數據來表示讀取。 因此,實現可以很好地返回malloc(size)

如果你使用D3DLOCK_DISCARD ,那么,這是一個單獨的問題,真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM