2016-08-02 68 views
7

可以通過計算他可以在一秒鐘內調用這些函數的次數來對常規JavaScript函數進行基準測試。然而,在WebGL上,諸如gl.drawArrays之類的函數是異步的,因此您無法通過基準API調用來測量着色器所需的時間。我如何基準WebGL着色器?

有什麼方法可以對WebGL函數進行基準測試嗎?

回答

3

由於存在大量的上下文並且它們非常具有GPU特性,因此很難對着色器進行基準測試。

你也許可以說,如果一個着色器是由之前和繪圖一堆東西與着色器(幾千到萬元繪製調用),然後通過調用gl.readPixels拖延GPU後使用performance.now比另一個更快。它會告訴你哪個更快。它不會告訴你它們有多快,因爲拖延GPU包括啓動和停止時間。

想想一輛賽車。對於一個拖拉機,你需要時間加速到目標。對於賽車來說,你需要一圈時間全速前進。在進行計時前,你先讓車先行一圈,然後在第二圈前完成,汽車越過起跑線,全速行駛,終點線也全速前進。所以,你可以獲得賽車的速度,而對於dragster你可以獲得加速(與GPU通常無關,因爲如果你想提高速度,你絕對不應該啓動和停止)。

在不增加開始/停止時間的情況下,另一種時間的方法是在​​幀之間繪製一束。繼續增加金額,直到幀之間的時間跳出整個幀。然後比較着色器之間的數量。

雖然在實際使用中還存在其他問題。例如,平鋪的GPU(如許多移動設備上的PowerVR)嘗試剔除將被透支的部分基元。所以在非平鋪GPU上大量渲染的重陰影可能在平鋪GPU上速度很快。

還要確保你的計時是正確的。如果您正在計算頂點着色器,則可能需要使畫布1x1像素,並且儘可能簡化片段着色器,並在一次繪製調用中傳遞大量頂點(以消除調用時間)。如果您計算片段着色器,那麼您可能需要一個大畫布和一組包含幾個完整畫布四邊形的頂點。

另見WebGL/OpenGL: comparing the performance

2

有沒有辦法得到準確的着色器的執行時間,而不也許有些GPU供應商特定的工具。然而,除了gman的建議之外,還有EXT_disjoint_timer_query擴展,它允許測量繪圖調用的執行時間,這在很大程度上取決於着色器執行時間,特別是當着色器很重時(因此大部分時間GPU花費在執行上畫電話)。

+0

'EXT_disjoint_timer_query'不會給你像PowerVR(iOS)這樣的平鋪架構的有用信息,因爲它們使用了延遲渲染器,他們可以做的最好的事情就是在所有多邊形被拆分後給出整個幀的時間,在瓷磚,遮擋修剪,瓷磚全部渲染等。https://imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ – gman

+0

@gman是的。但是,我們正在討論**着色器**基準測試。情況給了TBDR生命不安的機會,從而獲得了一定程度的適當結果。我錯了嗎?從未測試過這個假設。 –

+0

但是,你能嗎?我猜只要你打開混合,你至少可以知道一個着色器是否比另一個更快。混合所有透支將被撲滅。你只需要記住你回來的時間包括所有的多邊形分割,瓦片分流等,所以它不僅僅是你着色器的時間。我想這也假設擴展架構上存在擴展,以及它實際返回的結果。 – gman