合並圖片、EUI順序、CacheAsBitmap對drawcall影響的測試


 

一 什么是DrawCall

Draw Call 理解和優化:

http://blog.csdn.net/sakyaer/article/details/44459881

 

draw call是openGL的描繪次數
一個簡單的openGL的繪圖次序是:設置顏色→繪圖方式→頂點座標→繪制→結束。 
每幀都會重復以上的步驟。這就是一次draw call

如果有兩個model,那么需要 
設置顏色→繪圖方式→頂點座標A→繪制→結束。 
設置顏色→繪圖方式→頂點座標B→繪制→結束。 
兩次draw calls; 
也就是說在openGl繪制前,如果色彩通道(color filter),繪圖方式(shader),頂點座標(model)不同的情況下draw calls就會增加。

對openGl來說繪制參數(狀態值)的變更要比繪制大量的頂點更耗費cpu。

 

二  Egret中減少DrawCall

1  使用6張單張圖片和1個Label,drawcall數是6圖片+1文本=7。

 

 

2 現在將6張圖片合並成一張,drawcall數是1圖片+1文本=2

 

 

 

 3 現在只將兩個按鈕合並

 

 

 drawcall數如下圖,是10次。

 

 

如果圖"朋友圈"和"微信"是同一張圖drawcall算1次,那么應該是9次才對,為什么是10次?

 因為當A和B是一張圖,C是單張圖。

如果渲染順序是 A->B->C 則drawcall是2

但是渲染順序A->C->B則drawcall是3

 

三  Egret中減少drawcall的合圖做法

1 將同一場景或模塊的圖片合成一張,則可以大幅度減少drawcall數

2 合圖可以使用texturemerger,手動合並。

   也可以使用wing發布時的合並圖選項,但是wing發布合圖時根據資源組合並,所以你必須事先將同一場景或模塊分好了資源組。 (測試wingIDE的合圖有問題,不建議使用)

 

四 EUI中的排列順序對DrawCall的影響

 

現在有ABCD四張圖

當在EUI中由上到下是ABCD時,drawcall是2

 

 

 

 

 當順序是ACBD時,DrawCall是4

 

 

 

 

 總結:EUI的渲染次序是從上到下的,將同一圖片放在相鄰的順序上,可以減少drawcall數。

 

五、cacheAsBitmap緩存為位圖對drawcall的影響

 

drawcall由4變成了2

 

總結:將靜態圖片放在一個group內,並使用cacheAsBitmap,可以減少drawcall

 

其他:

1. EUI的多個Group不增加drawcall。

 

 

2. EUI的自定義組件,如果組件內圖片是同一張,多個組件不增加drawcall。

以下組件GruideHand,組件內使用的圖片是一張圖,則多個自定義組件在EUI內drawcall是1.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM