2017-07-19 54 views
0

我曾經假設綁定頂點比綁定着色器和紋理更重要,但現在我知道它是相反的。所以我正在重新配置我的繪圖。基本上:模型中每個網格的緩衝區是否最優?

在每個模型中使用一個緩衝區在模型中繪製多個網格是否最佳?還是有一種替代解決方案來綁定更少的更大的緩衝區? (我曾經把所有的網格結合到一個大的緩衝區中,並簡單地調用偏移量,但現在這意味着我綁定了不必要的頂點,因爲這些頂點現在可以被綁定,但稍後會被使用)。

通過優化我的意思是CPU,GPU和驅動程序的傳輸速度。

+0

「*現在這意味着我綁定了不必要的頂點,因爲這些頂點可能會在以後綁定*」這是什麼意思? –

回答

1

答案當然是「取決於」,因GPU,驅動程序和應用程序需求而異。

綁定可以是一個非常輕量級的操作(類似於設置一個指針),或者可能需要將數據從主機(CPU)內存傳輸到GPU - 這在很大程度上取決於資源使用情況和駐留在GPU內存中。例如,如果有許多靜態幾何圖形與所有其他圖形資源(例如,紋理,元素數組等)一起適合GPU內存,那麼較大的緩衝區可能會更好,因爲您可以初始化它一次,並且司機會很快發現它應該保持常駐狀態。相反,如果您爲每個對象使用大量不同的資源(例如,切換大量紋理),所有這些資源不能同時駐留在GPU中,那麼使用較小的緩衝區可能會更好,因爲它提供了驅動程序通過驅逐回收記憶的更多選擇。然而,硬幣的另一方面是它可能導致內存碎片,並可能浪費一些內存(儘管如果你關心這一點,你不需要回答這個問題)。

我可以提供的最佳建議是,如果您需要更新來自CPU的緩衝區中的數據,請嘗試僅更新受這些更改影響的緩衝區的區域。使用類似glBufferSubData的東西,只更新所需的區域(並且明智;例如,如果需要更新由兩個字節分隔的兩個1K塊,請在一個操作中完成所有操作)。並儘量避免在離散內存GPU系統上使用glMapBuffer和朋友。該操作可能需要大量來自GPU的數據拷貝;它對集成內存GPU系統的影響較小(儘管這不是一個具體規則 - 緩衝區可能會被重新格式化,以便在幕後進行更優化的內存操作)。

最明智的建議是:做得對,然後加快速度(只有速度不夠快)。

+0

雖然我同意你的大部分答案,但是就我所知,針對'glMapBuffer'的建議是不正確的。首先,使用它來更新緩衝區可以節省用戶空間和驅動程序內存之間的複製。其次,在最新硬件上實現最高吞吐量數據流的普遍看法是使用'glMapBufferRange'和'GL_MAP_UNSYNCHRONIZED_BIT'。 – ybungalobill

+0

@ybungalobill:在最新的硬件上,您使用持久映射緩衝區。 –

+0

嗯,有沒有辦法在一個大塊中寫入內存,然後將其分段爲單獨的緩衝區? –

相關問題