Webgl性能瓶頸,圖形繪製是異步的流水線繪製以及瀏覽器的本身的缺陷。嘗試優化的方法如下:
- 找到性能瓶頸,嘗試降低CPU或者GPU的時鐘頻率去測試哪個效率低
- 紋理受限,可以採取 減少canvas的長寬或者使用低分辨率的紋理測試;webgl 紋理綁定伸展和收縮效果時,gl.NEAREST 是最快的但會產生塊狀效果,gl.LINER因爲是取平均值,會產生模糊
- 將Mip映射應用於紋理貼圖
- 處理webgl丟失上下文的問題
- 不要經常切換program,在切換program和在着色器中使用if else語句都需要進行考量
高級shader優化,基本思路是找到性能瓶頸,嘗試降低CPU或者GPU的時鐘頻率去測試哪個效率低:
- 避免在頂點數組數據中使用常量
- 在webgl中,使用drawElements()的gl.TRIANGLE_STRIP 結合退化三角形 比使用drawArrays()的gl.TRIANGLE方式節省內存,並且減少使用drawArrays和drawElements的次數
- 頂點組織順序按照數組排序,不要使用亂序,因爲難以命中緩存
- 減少使用drawArrays和drawElements的次數
- 避免繪製時從GPU讀回數據或狀態,例如,gl.getError() gl.readPixels(), 影響流水線的實現
- 用webgl inspector找出冗餘的調用,因爲webgl是的狀態是跨幀持續的,減少使用改變webgl狀態的方法。比如gl.enable(XXX),只執行一次就行了
模型優化:
- 用細節層次簡化模型(LOD技術)
其他新的怪異想法:
- 利用WebAssembly技術,提高Web應用程序的性能;
- 利用
OffscreenCanvas+Web Worker方案,OffscreenCanvas是另外一個作爲幕後計算的Canvas與幕前顯示的Canvas做頻繁替換