關(guān)于Draw call

Draw call就是CPU調(diào)用圖像編程接口(OpenGL中的glDrawElements命令),命令GPU進(jìn)行渲染操作的過程。
命令緩沖區(qū)
如果CPU要等到GPU完成上一個(gè)渲染任務(wù)才能再發(fā)送渲染命令,顯然會(huì)造成效率低下,因此為了讓CPU和GPU可以同時(shí)工作命令緩沖區(qū)就此產(chǎn)生了。
命令緩沖區(qū)包含里一個(gè)命令隊(duì)列,CPU向其中添加命令,而GPU從中讀取命令,添加和讀取過程是相互獨(dú)立的,這使得CPU和GPU可以相互獨(dú)立工作。
命令緩沖區(qū)除了Draw call以外還有其他命令(改變使用的著色器,使用不同的紋理等)。

命令緩沖區(qū)。CPU通過圖像編程接口向命令緩沖區(qū)中添加命令,而GPU從中讀取命令 并執(zhí)行。黃色方框內(nèi)的命令就是Draw Call,而紅色方框內(nèi)的命令用于改變渲染狀態(tài)。我們使 用紅色方框來表示改變渲染狀態(tài)的命令,是因?yàn)檫@些命令往往更加耗時(shí)

Draw call對(duì)幀率的影響
在每次調(diào)用draw call之前,CPU需要向GPU發(fā)送很多內(nèi)容,其中包括數(shù)據(jù)、狀態(tài)、命令等。在這一階段,CPU需要完成很多工作,列如檢查渲染狀態(tài)等。而一旦CPU完成了這些準(zhǔn)備工作,CPU就可以開始本次的渲染。GPU的渲染能力很強(qiáng),渲染200個(gè)和2000個(gè)三角網(wǎng)格通常沒有什么區(qū)別,因此渲染速度往往快于CPU提交命令的速度。如果Draw Call太多,CPU往往就會(huì)把大量的時(shí)間花費(fèi)在提交Draw Call上,造成CPU的過載。

命令緩沖區(qū)中的虛線方框表示GPU已經(jīng)完成的命令。此時(shí),命令緩沖區(qū)中沒有可以執(zhí) 行的命令了,GPU處于空閑狀態(tài),而CPU還沒有準(zhǔn)備好下一個(gè)渲染命令。

如何減少Draw Call
靜態(tài)批處理——(Static復(fù)選框打勾)
如果使用大量很小的網(wǎng)格時(shí),可以考慮是否合并它們。
避免使用過多的材質(zhì)。盡量在不同的網(wǎng)格中使用共同的材質(zhì)。

利用批處理,CPU在RAM把多個(gè)網(wǎng)格合并成一個(gè)更大的網(wǎng)格,再發(fā)送給GPU,然后在 一個(gè)Draw Call中渲染它們。但要注意的是,使用批處理合并的網(wǎng)格將會(huì)使用同一種渲染狀 態(tài)。也就是說,如果網(wǎng)格之間需要使用不同的渲染狀態(tài),那么就無法使用批處理技術(shù)

參考書籍《Unity Shader入門精要》

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

友情鏈接更多精彩內(nèi)容