1,測試環(huán)境
2,為何drawcall多會影響性能
3, 哪些組件支持渲染
4,影響drawcall的因素
5,一句話介紹如何減少drawcall
6,哪些渲染組件不會被渲染
7,減少drawcall的理論(放在第二期)
8,理論指導實踐,實踐印證理論,demo實操(放在第三期)
9,總結(放在第三期)
「測試環(huán)境」 :
1.Mac 系統(tǒng)
2.cocoscreator 2.4.x版本
「為何drawcall多會影響性能?」
Drawcall: 繪制調用,指cpu調用圖形繪制接口命令gpu進行圖形繪制
「每一次繪制前,CPU要準備繪制參數(狀態(tài))比如色彩通道(color filter),繪圖方式(shader)等復雜的數據處理,然后Drawcall,如果有大量drawcall,cpu會很“忙”,而gpu的處理能力很強,這時他可能閑置,不能充分發(fā)揮應有的能力,導致性能下降?!?/p>
「哪些組件支持渲染:」 因為一個drawcall是一次cpu調用圖形繪制接口命令 gpu進行圖形繪制渲染的過程,所以需要了解cocoscreator中哪些組件支持渲染,才能更好的控制drawcall
**
- !#en
- Base class for components which supports rendering features.
- !#zh
- 所有支持渲染的組件的基類
- @class RenderComponent
- @extends Component
*/
let RenderComponent = cc.Class({
上面的注釋介紹 RenderComponent是所有渲染組件的基類,就是說他的子類和孫子類的組件。。。都是支持渲染的組件 可以全局搜索引擎,知道 粒子, 動畫,文字(label),遮罩(mask),運動軌跡(MotionStreak),精靈(Sprite),繪圖(Graphics)地圖(tiledmap)等等, 也可以在 cocoscreator界面 右側添加組件 -》渲染組件查看
「影響drawcall的因素:」
1,層級(zindex)
2,材質(Material)(shander,貼圖(紋理),混合模式(blend))。只有擁有相同材質的渲染節(jié)點 才可能進行批處理,貼圖,shader 決定了材質,而層級則決定了相同的材質 是否能 進行合并處理 即合并網格(mesh) 合并drawcall.,
「一句話介紹如何減少drawcall:」 繪制狀態(tài)的變化 是導致drawcall增多的 主要原因。cocoscreator認為要以深度(zindex)優(yōu)先的方式對渲染組件進行渲染,并且cocoscreator認為相同的材質可以被批量渲染。所以具有相同材質的并且連續(xù)的渲染節(jié)點 可以合并渲染 減少drawcall.
「連續(xù):」
1,層級相同添加順序相鄰,
2,層級不同 中間層級沒有其他材質的渲染組件。比如 a的層級是1 b的層級是3 在 1-3層級之間沒有其他材質的 渲染組件.
「影響drawcall的因素:」
「1,渲染節(jié)點(zindex)層級」
zIndex是節(jié)點的層級是用來對節(jié)點進行排序的關鍵屬性,它決定一個節(jié)點 在兄弟節(jié)點之間的層級,和誰被優(yōu)先渲染。
1) zIndex 的取值介于 cc.macro.M IN_ZINDEX 和 cc.macro.MAX_ZINDEX 之間
即 - math.pow(2,15). 和 math.pow(2,15)-1之間。
實際操作中一般是 -1 到 n n一般不會超過1000
2)父節(jié)點主要根據節(jié)點的 zIndex 和添加次序來排序,擁有更高 zIndex 的節(jié)點將被排在后面(后被渲染先被渲染的圖在后被渲染的圖下面),如果兩個節(jié)點的 zIndex 一致,先添加的節(jié)點會穩(wěn)定排在另一個節(jié)點之前。排在前面的節(jié)點先被渲染,也就是說兩張圖層級相同 先添加的會先被渲染 顯示出來的結果是 在后被渲染的圖的下面。
3)節(jié)點在 children 中的順序決定了其渲染順序。父節(jié)點永遠在所有子節(jié)點之前被渲染
4)node節(jié)點放在Canvas或者父節(jié)點的zindex默認值是0
5)決定節(jié)點層級的另一個因素是siblingIndex 他的權重低于 zIndex 當我們在編輯器上編輯借點的時候 兄弟節(jié)點之間的zIndex相同,為什么會出現一個先被渲染一個后被渲染呢 ,就是因為 siblingIndex 不同,排在前面的siblingIndex要小一些后面的要大一些 最終后面的后選擇然 層級就在 前面的上邊。 也就是說 zindex 其決定性作用,zIndex相同 就比較siblingIndex來判定最終層級。
「2,材質」
1)紋理(貼圖)
2)shander:渲染器,能夠讀懂的點和顏色的對應關系的程序,簡單來說就是繪圖的方式)
只有擁有相同材質的物體才可以進行批處理。因此,如果你想要得到良好的批處理效果,你需要在程序中盡可能地復用材質和物體。
如果你的兩個材質僅僅是紋理不同,那么你可以通過 紋理拼合 操作來將這兩張紋理拼合成一張大的紋理。一旦紋理拼合在一起,你就可以使用這個單一材質來替代之前的兩個材質了。
「哪些渲染組件不會被渲染」
cocoscreator 認為 透明度 === 0. 或者 active = false 的渲染組件 不會被渲染。