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。
再詳細點:
這樣排就是8個Draw call。
這裡如果我們把“閃”連續渲染,這樣Draw call就是五個(ttf label不能連續合并)。
總之,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