合并圖片控漠、EUI順序蔓倍、CacheAsBitmap對drawcall影響的測試
一 什么是DrawCall
Draw Call 理解和優(yōu)化:
http://blog.csdn.net/sakyaer/article/details/44459881
draw call是openGL的描繪次數(shù)
一個簡單的openGL的繪圖次序是:設(shè)置顏色→繪圖方式→頂點座標(biāo)→繪制→結(jié)束。?
每幀都會重復(fù)以上的步驟润脸。這就是一次draw call
如果有兩個model柬脸,那么需要?
設(shè)置顏色→繪圖方式→頂點座標(biāo)A→繪制→結(jié)束。?
設(shè)置顏色→繪圖方式→頂點座標(biāo)B→繪制→結(jié)束毙驯。?
兩次draw calls;?
也就是說在openGl繪制前倒堕,如果色彩通道(color filter),繪圖方式(shader)爆价,頂點座標(biāo)(model)不同的情況下draw calls就會增加垦巴。
對openGl來說繪制參數(shù)(狀態(tài)值)的變更要比繪制大量的頂點更耗費cpu。
二 ?Egret中減少DrawCall
1 ?使用6張單張圖片和1個Label铭段,drawcall數(shù)是6圖片+1文本=7骤宣。
2 現(xiàn)在將6張圖片合并成一張,drawcall數(shù)是1圖片+1文本=2
?3 現(xiàn)在只將兩個按鈕合并
?drawcall數(shù)如下圖,是10次拓提。
如果圖"朋友圈"和"微信"是同一張圖drawcall算1次撑刺,那么應(yīng)該是9次才對释漆,為什么是10次芬膝?
?因為當(dāng)A和B是一張圖望门,C是單張圖。
如果渲染順序是 A->B->C 則drawcall是2
但是渲染順序A->C->B則drawcall是3
三 ?Egret中減少drawcall的合圖做法
1 將同一場景或模塊的圖片合成一張锰霜,則可以大幅度減少drawcall數(shù)
2 合圖可以使用texturemerger筹误,手動合并。
? ?也可以使用wing發(fā)布時的合并圖選項癣缅,但是wing發(fā)布合圖時根據(jù)資源組合并厨剪,所以你必須事先將同一場景或模塊分好了資源組。 (測試wingIDE的合圖有問題友存,不建議使用)
四 EUI中的排列順序?qū)rawCall的影響
現(xiàn)在有ABCD四張圖
當(dāng)在EUI中由上到下是ABCD時祷膳,drawcall是2
?當(dāng)順序是ACBD時,DrawCall是4
?總結(jié):EUI的渲染次序是從上到下的屡立,將同一圖片放在相鄰的順序上钾唬,可以減少drawcall數(shù)。
五侠驯、cacheAsBitmap緩存為位圖對drawcall的影響
drawcall由4變成了2
總結(jié):將靜態(tài)圖片放在一個group內(nèi)抡秆,并使用cacheAsBitmap,可以減少drawcall
其他:
1. EUI的多個Group不增加drawcall吟策。
2. EUI的自定義組件儒士,如果組件內(nèi)圖片是同一張,多個組件不增加drawcall檩坚。
以下組件GruideHand着撩,組件內(nèi)使用的圖片是一張圖,則多個自定義組件在EUI內(nèi)drawcall是1.