2011-03-02 51 views
2

不斷向GPU上傳紋理(並替換舊紋理)的開銷是多少。我正在研究使用OpenGL的新跨平臺3D窗口系統,並計劃爲每個窗口(包含UI元素)上傳單個位圖。該位圖將與GPU同步更新(使用VSync)。我想知道這是否是一個好主意,或者如果經常編寫位圖會帶來太多的性能開銷。謝謝!在OpenGL中不斷向GPU上傳新紋理的開銷是多少?

+0

爲什麼渲染ui客戶端? – RecursiveExceptionException 2016-07-10 18:05:16

回答

7

好像nVidia的Geforce 460M在本地內存上有60GB/sec的帶寬。

PCI Express 2.0 x16可以管理8GB /秒。

因此,如果您嘗試通過PCIe總線傳輸太多紋理,您可能會遇到內存帶寬問題。它在60Hz時每幀可以提供約136 meg。未壓縮的24位1920x1080大約是6兆。所以,足以說你可以在16x顯卡上每幀上傳幾幀視頻。

當然不是那麼簡單。有大約20%的PCIe開銷。所有繪圖命令也必須通過該鏈接上傳。

一般來說,雖然你應該罰款,你不要過度做。請記住,在下一個(甚至更晚)之前上傳一個您不期望使用的幀的紋理是明智的。這樣,您就不會在渲染停止等待PCIe上傳完成時造成瓶頸。

+0

應該指出,純glTexImage具有重新初始化紋理對象的開銷。如果性能很重要,應該使用glTexSubImage;在像素緩衝區對象的情況下glBufferSubData + glTexSubImage – datenwolf 2011-03-03 00:37:27

+0

一旦你使總線飽和,創建新紋理對象的CPU時間是否真的很重要? – 2011-03-03 00:44:46

+0

這可能是因爲在傳輸之前,創建一個新的紋理對象需要至少2個內存分配(實際上,更有可能3:用於數據結構,一個用於主內存中的位圖,另一個用於位於gpu內存中的位圖)甚至開始。轉移的延遲不會隱藏這種開銷,它是最重要的。此外,分配必須不僅在應用程序的線程中同步,而且還在系統上的所有線程中同步,因爲內存由所有內容共享,所以我不一定會在「不顯着」類別中預訂開銷。 – Damon 2011-03-03 10:50:20

0

最終,你的答案將被分析。但是,如果沒有更改,可以進行的一些早期優化是避免更新紋理。根據紋理和像素格式的大小,這可能會非常昂貴。

配置文件具有更簡單的情況,可以模擬您期望的使用類型。根據這些窗口的大小,我懷疑性能開銷(沒有我提到的優化,至少)將無法使用,如果你有一些窗口更大。