什麼是DrawCall?

前言

遊戲開發圈裏的人一定聽過優化遊戲要降低DrawCall,這樣到底什麼是DrawCall呢?Unity中應該如何降低DrawCall,這裏就來講解一下關於DrawCall知識點。

1.是誰拖了後腿?

通俗的來說就是Cpu:(#`O′)餵你好,是Gpu嗎?快點醒醒我這裏又有畫畫的任務了(Cpu調用Gpu的次數),打一個比方比如上傳很多文件到百度雲或其他地方時,都會把它壓縮到一個文件夾裏,不會把它們分開上傳(當然還有原因就是它們數據是相關,比如是主題的一套ico文件或軟件的安裝文件),排除這些和文件整合的原因,假設網速沒有波動,分開傳和壓縮包,壓縮包速度一定快很多的(不僅僅是因爲壓縮包更小),主要是每次上傳還有一些預備動作(比如與服務器鏈接,初始化Socket等等),細心的會發現文件當拖動到百度雲會有幾毫秒的延遲。其實優化DrawCall主要是Cpu的處理速度的優化,Cpu和Gpu是並行工作的,處理的方式有一個命令緩存區,具體如圖所示:

exp1

別看圖中畫的好像是Cpu在等待Gpu,實際上Cpu纔是拖後腿的那個,現實中Gpu早就把命令緩存區裏命令都處理完畢了,Cpu確還在準備DrawCall的命令,Cpu通過圖像編程接口向命令緩存區添加命令,而Gpu通過緩存區獲取命令處理。

2.爲什麼會拖後腿?

在每次調用DrawCall之前,因爲Cpu需要向Gpu發送很多內容,包括數據、狀態和命令,在這個階段Cpu需要完成很多工作,比如檢查渲染狀態等(有一堆工作要Cpu處理,纔會存放到緩存區),存放到緩存區以後,Gpu就要開始工作了,Gpu渲染能力還是很強的,渲染200或2000個三角網格通常看不出區別,導致Gpu渲染速度大於Cpu的提交速度,影響渲染流水線速度就是提交比較慢的Cpu(現在知道玩遊戲要買的電腦配置了吧,一般選擇Cpu比較好的,Gpu一般的即可,當然遊戲畫面特別好的,還是建議把顯卡買好點的,有些遊戲硬性條件普通顯卡根本渲染不了,並不是渲染速度的問題了),最後可想而知Cpu會花費大量的時間在提交DrawCall的路上,造成Cpu的過載,Gpu確會出現空閒。

look1

3.優化DrawCall

降低DrawCall的方式還是很多的,先討論如何降低2d遊戲的DrawCall,2d遊戲的資源都是圖片,單個圖片調用一次DrawCall會導致Cpu太難了,這樣有沒有辦法降低提交次數呢?可以通過打包圖集的操作來降低DrawCall,比如界面所用到的圖片打包成圖集或者人物的序列圖打包到圖集,具體如圖所示:

exp2

可能會思考把所有界面的資源打包到一個圖集裏,豈不是美哉?這個時候Gpu會說太難了,只是渲染某個界面卻要拿出整個圖集去操作,熱更新也會說我太難了,只是更新某個界面裏的按鈕圖片樣式卻要替換整個圖集,所以合理打包圖集。
其實對圖集這個東西理解還是比較深刻,寫過和看過圖集打包軟件的源代碼(當然和Unity的圖集不是一個,但是大同小異),一般情況就是把圖片數據全部寫到一個文件裏,然後保存ID或其他信息可以把單個圖片找出來的方式,通過圖集實現了提交大量的DrawCall。接下來思考模型如何降低DrawCall的調用。 Unity中可以通過靜態批處理實現優化DrawCall,靜態批處理的原理就是合併網格,而合併過程是需要消耗時間,因此批處理技術更加適合那些靜態的物體,比如不會動的地面、樹和石頭,對於這些靜態物體我們合併一次即可,當然可以使用動態批處理,但是,由於這些物體不斷移動的,因此每幀都需要進行合併發送給Gpu,對時間和空間都有一定的影響。具體如圖所示:

exp3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章