2015-01-02 31 views
4

當我們的上下文使用preserveDrawingBuffer時,我們需要照顧我們自己清理繪圖緩衝區。我在我的應用程序中使用這種技術。preserveDrawingBuffer false - 是否值得付出努力?

我看了一篇文章說 - 設置這個標誌爲false可以獲得更好的性能。

在我的應用程序設置爲false時,在某些情況下,我需要照顧清除前臺緩衝區,因爲當沒有繪圖發生時,我們仍然可以看到之前繪製的內容。

我的問題是,現在是否值得將我的應用程序顛倒並覆蓋所有情況以獲得更好的性能?它真的好多了嗎?

當這個標誌爲真(並且執行gl.clear(..))與虛假比較時,是否有演示顯示不同的演奏?

+0

在良好的視頻卡中,清除是按區域逐個區域地完成的(expl 64X64'區塊')。所以一個好的webgl實現只會清除這些標誌,而不會在內存中寫入一堆零。我敢打賭,當preserveDrawingBuffer爲true或false時,性能增益非常小(rq:我從未在我的配置文件中看到clear())。希望你能有一個更完整的答案。 – GameAlchemist

回答

9

我知道這已經回答了其他地方,但我不能找到這麼....

preserveDrawingBuffer: false 

指的WebGL可以交換緩衝器,而不是複製的緩衝區。

WebGL畫布有2個緩衝區。您正在繪製的那個和正在顯示的那個。當繪製網頁時,WebGL有2個選項

  1. 將繪圖緩衝區複製到顯示緩衝區。

    這種操作是很明顯慢作爲複製數千或數百萬像素不 自由操作

  2. 交換兩個緩衝器。

    該操作實際上是即時的,因爲除了交換 兩個變量的內容之外,沒有什麼需要發生。

無論WebGL的互換或複印件要由瀏覽器和其他各種設置,但如果preserveDrawingBufferfalse的WebGL可以換,如果是true它不能。

如果您希望看到perf差異,我建議在手機上試用您的應用。確保抗鋸齒功能已關閉,因爲抗鋸齒功能需要解決這是有效複製操作的步驟。

+0

我的應用程序沒有運行在手機上(至少現在),但我的客戶圖形卡很便宜,所以我決定去找它,並檢查我的應用程序的所有錯誤'preserveDrawingBuffer = false'會導致並可能得到那裏有更好的表演。謝謝分配 –

+2

工作完成並覆蓋了所有情況後,我設法通過'preserveDrawingBuffer = false'發佈了一些版本。個人而言,我沒有看到任何性能變化,但是,在我的客戶使用他們糟糕的顯卡時,他們說有很棒的性能提升。只想分享 –

0

據我所知,preserveDrawingBuffer=true意味着WebGL必須刷新幀之間的管道。 OpenGL圖形不是同步的,因此當你完成你的框架時,繪圖命令仍然處於流水線中。

這相當於在渲染循環結束時放置一個flush。 https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/flush

所以這就是爲什麼結果可能會有很大差異。如果你的GPU已經緩存了很多命令,那麼當所有的GPU命令執行時,程序將被強制停止。但是,如果你的GPU速度很快,那麼緩衝區中可能沒有太多東西,所以事情簡單地繼續下去。

我見過在渲染循環結束處放置flush調用的情況,將FPS降低了50%。

我會避免preserveDrawingBuffer=true,因爲當你最需要它時會損害性能。

+0

'preserveDrawingBuffer:true'與'gl.flush'沒有任何關係。它只與交換緩衝區和複製緩衝區有關係。在蘋果公司的要求下,它專門增加了該規範,聲稱在iOS上交換緩衝區的速度會更快。 'gl.flush'應該不會影響幀速率。這可能會產生影響。 'gl.flush'只是意味着「知道我迄今爲止發佈的所有命令」,其中'gl.finish'意思是「執行我迄今發佈的所有命令,並且在它們完成之前不會返回」 – gman