天天看點

對CocosCreatorr的Draw call的了解

Draw call比較直覺的描述應該是: 在CPU不改變渲染資料的情況下,openGL的一次渲染。

opengGL的一次渲染:CPU調用圖形繪制接口來使GPU執行渲染操作,渲染流程是CPU和GPU并行工作的過程。CPU和GPU之間通過一系列的緩沖區來聯系,CPU将緩沖區的資料發送給GPU來讓GPU執行渲染指令。

插一句:

大家如果對openGL的渲染流程感興趣,可以參考https://blog.csdn.net/u013654125/article/details/79698469。

回到正題:

正因為CPU和GPU并行工作,是以會出現其中一方處理資料較慢,而另一方閑置的情況。而這種情況一般隻會是CPU處理處理資料處理不過來,而GPU閑置。

來個栗子:

當你有A,B,C三個節點,其中A,B使用同一張貼圖,C使用另一張貼圖。

假設繪制順序是:

A

C

B

這種情況的Draw call是:3。因為A繪制完和需要替換貼圖,然後繪制B後再替換貼圖,最後繪制C。

假設繪制順序是:

A

B

C

那麼可以做到A,B同時繪制,最後繪制C。

這時的Draw call是:2。

再詳細點:

對CocosCreatorr的Draw call的了解
對CocosCreatorr的Draw call的了解

這樣排就是8個Draw call。

這裡如果我們把“閃”連續渲染,這樣Draw call就是五個(ttf label不能連續合并)。 

對CocosCreatorr的Draw call的了解

總之,Draw call的規則是這樣的:

1.render command 相鄰,大緻可以了解為節點樹中順序相鄰

2.texture 一緻

3.blend function 一緻

3.shader program 一緻

是以當我們要渲染的節點很多,且Draw call也多的時候,CPU需要在每次渲染的時候來進行資料處理,這時GPU閑置。

我們要避免這樣的情況,就可以根據上述情況來着手,盡量把相同的節點放在相鄰的節點樹中。

最後,使用圖集減少Draw call是有一定前提條件的(像上述條件),圖集并不能減少Draw call,材質從哪裡來的和glDrawElements次數沒關系。

真正減少Draw call是需要多個連續繪制的節點使用同樣的貼圖時,可以一次性批量繪制。

參考資料:

http://www.cocoachina.com/bbs/read.php?tid=228121

http://forum.cocos.com/t/drawcall/43273/4

https://blog.csdn.net/srk19960903/article/details/73457321

繼續閱讀