一 什么是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.

