1慷垮,測試環(huán)境
2,為何drawcall多會影響性能
3, 哪些組件支持渲染
4,影響drawcall的因素
5否淤,一句話介紹如何減少drawcall
6,哪些渲染組件不會被渲染
7棠隐,減少drawcall的理論(放在第二期)
8石抡,理論指導(dǎo)實(shí)踐,實(shí)踐印證理論助泽,demo實(shí)操(放在第三期)
9啰扛,總結(jié)(放在第三期)
「測試環(huán)境」 :
1.Mac 系統(tǒng)
2.cocoscreator 2.4.x版本
「為何drawcall多會影響性能?」
Drawcall: 繪制調(diào)用嗡贺,指cpu調(diào)用圖形繪制接口命令gpu進(jìn)行圖形繪制
「每一次繪制前隐解,CPU要準(zhǔn)備繪制參數(shù)(狀態(tài))比如色彩通道(color filter),繪圖方式(shader)等復(fù)雜的數(shù)據(jù)處理暑刃,然后Drawcall,如果有大量drawcall厢漩,cpu會很“忙”,而gpu的處理能力很強(qiáng),這時(shí)他可能閑置岩臣,不能充分發(fā)揮應(yīng)有的能力溜嗜,導(dǎo)致性能下降〖芑眩」
「哪些組件支持渲染:」 因?yàn)橐粋€(gè)drawcall是一次cpu調(diào)用圖形繪制接口命令 gpu進(jìn)行圖形繪制渲染的過程炸宵,所以需要了解cocoscreator中哪些組件支持渲染,才能更好的控制drawcall
**
- !#en
- Base class for components which supports rendering features.
- !#zh
- 所有支持渲染的組件的基類
- @class RenderComponent
- @extends Component
*/
let RenderComponent = cc.Class({
上面的注釋介紹 RenderComponent是所有渲染組件的基類谷扣,就是說他的子類和孫子類的組件土全。捎琐。。都是支持渲染的組件 可以全局搜索引擎裹匙,知道 粒子瑞凑, 動畫,文字(label),遮罩(mask),運(yùn)動軌跡(MotionStreak)概页,精靈(Sprite),繪圖(Graphics)地圖(tiledmap)等等籽御, 也可以在 cocoscreator界面 右側(cè)添加組件 -》渲染組件查看
「影響drawcall的因素:」
1,層級(zindex)
2,材質(zhì)(Material)(shander,貼圖(紋理),混合模式(blend))惰匙。只有擁有相同材質(zhì)的渲染節(jié)點(diǎn) 才可能進(jìn)行批處理技掏,貼圖,shader 決定了材質(zhì)项鬼,而層級則決定了相同的材質(zhì) 是否能 進(jìn)行合并處理 即合并網(wǎng)格(mesh) 合并drawcall.哑梳,
「一句話介紹如何減少drawcall:」 繪制狀態(tài)的變化 是導(dǎo)致drawcall增多的 主要原因。cocoscreator認(rèn)為要以深度(zindex)優(yōu)先的方式對渲染組件進(jìn)行渲染绘盟,并且cocoscreator認(rèn)為相同的材質(zhì)可以被批量渲染鸠真。所以具有相同材質(zhì)的并且連續(xù)的渲染節(jié)點(diǎn) 可以合并渲染 減少drawcall.
「連續(xù):」
1,層級相同添加順序相鄰,
2,層級不同 中間層級沒有其他材質(zhì)的渲染組件龄毡。比如 a的層級是1 b的層級是3 在 1-3層級之間沒有其他材質(zhì)的 渲染組件.
「影響drawcall的因素:」
「1弧哎,渲染節(jié)點(diǎn)(zindex)層級」
zIndex是節(jié)點(diǎn)的層級是用來對節(jié)點(diǎn)進(jìn)行排序的關(guān)鍵屬性,它決定一個(gè)節(jié)點(diǎn) 在兄弟節(jié)點(diǎn)之間的層級稚虎,和誰被優(yōu)先渲染。
1) zIndex 的取值介于 cc.macro.M IN_ZINDEX 和 cc.macro.MAX_ZINDEX 之間
即 - math.pow(2,15). 和 math.pow(2,15)-1之間偎捎。
實(shí)際操作中一般是 -1 到 n n一般不會超過1000
2)父節(jié)點(diǎn)主要根據(jù)節(jié)點(diǎn)的 zIndex 和添加次序來排序蠢终,擁有更高 zIndex 的節(jié)點(diǎn)將被排在后面(后被渲染先被渲染的圖在后被渲染的圖下面),如果兩個(gè)節(jié)點(diǎn)的 zIndex 一致茴她,先添加的節(jié)點(diǎn)會穩(wěn)定排在另一個(gè)節(jié)點(diǎn)之前寻拂。排在前面的節(jié)點(diǎn)先被渲染,也就是說兩張圖層級相同 先添加的會先被渲染 顯示出來的結(jié)果是 在后被渲染的圖的下面丈牢。
3)節(jié)點(diǎn)在 children 中的順序決定了其渲染順序祭钉。父節(jié)點(diǎn)永遠(yuǎn)在所有子節(jié)點(diǎn)之前被渲染
4)node節(jié)點(diǎn)放在Canvas或者父節(jié)點(diǎn)的zindex默認(rèn)值是0
5)決定節(jié)點(diǎn)層級的另一個(gè)因素是siblingIndex 他的權(quán)重低于 zIndex 當(dāng)我們在編輯器上編輯借點(diǎn)的時(shí)候 兄弟節(jié)點(diǎn)之間的zIndex相同,為什么會出現(xiàn)一個(gè)先被渲染一個(gè)后被渲染呢 己沛,就是因?yàn)?siblingIndex 不同慌核,排在前面的siblingIndex要小一些后面的要大一些 最終后面的后選擇然 層級就在 前面的上邊。 也就是說 zindex 其決定性作用申尼,zIndex相同 就比較siblingIndex來判定最終層級垮卓。
「2,材質(zhì)」
1)紋理(貼圖)
2)shander:渲染器师幕,能夠讀懂的點(diǎn)和顏色的對應(yīng)關(guān)系的程序粟按,簡單來說就是繪圖的方式)
只有擁有相同材質(zhì)的物體才可以進(jìn)行批處理。因此,如果你想要得到良好的批處理效果灭将,你需要在程序中盡可能地復(fù)用材質(zhì)和物體疼鸟。
如果你的兩個(gè)材質(zhì)僅僅是紋理不同,那么你可以通過 紋理拼合 操作來將這兩張紋理拼合成一張大的紋理庙曙。一旦紋理拼合在一起空镜,你就可以使用這個(gè)單一材質(zhì)來替代之前的兩個(gè)材質(zhì)了。
「哪些渲染組件不會被渲染」
cocoscreator 認(rèn)為 透明度 === 0. 或者 active = false 的渲染組件 不會被渲染矾利。