cocoscreator 2.4.x版本 drawcall優(yōu)化 第一期(掌握控制drawcall數量的必要知識)

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 的渲染組件 不會被渲染。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容