如何減少遊戲中drawcall

https://blog.csdn.net/yupu56/article/details/50177935

儘管圖形是如此簡單,爲什麼我的遊戲延遲這麼多? 
爲什麼我的遊戲加載時間如此之高? 
爲什麼屏幕之間的切換如此之慢?
爲什麼我遊戲的FPS一直很低?
我已經壓縮過紋理貼圖和精靈了,怎麼還那麼大?
爲什麼我的遊戲總會崩潰?
爲什麼我的遊戲那麼費電?
爲什麼在手機上運行我的遊戲時,手機發熱怎麼會那麼嚴重?

在遊戲開發的某個階段,我們都會遇到這些問題。我們會試着分析新的圖形技術、新的圖像壓縮技術、新的代碼以及一些其他技術。因此,這讓我們犧牲了很多寶貴時間,而在最後的最後,或許我們解決了一些棘手的問題亦或是放棄了這些新技術。
在這裏,我們會盡量減少這樣的常見錯誤以及縮短困難期。其實我更願意說忽視Draw Call是粗心大意而不是一個錯誤。

Draw Calls是什麼?
Draw Call僅僅是一條指令!Draw Call指令從CPU傳到GPU,渲染一個網格。指令只指向一個被渲染的網格並且不包含任何材質信息。

drawcall是啥?其實就是對底層圖形程序(比如:OpenGL ES)接口的調用,以在屏幕上畫出東西。所以,是誰去調用這些接口呢?CPU。


在發出指令後,GPU的渲染狀態值(材質、紋理、shader等)和所有的頂點數據通過神奇的代碼轉化爲以一個信息,然後再在你的屏幕上呈現出美麗的畫面。
渲染就是在做一個巨大數量的小任務,比如計算成千上萬的頂點和在屏幕上繪製以百萬計的像素。
注意
每個用不同的材料的網格都需要一個單獨的Draw call。 

用Unity引擎開發,我們就要了解它們的工作機制,這樣在項目進行優化時也會有針對性,關於優化方面,筆者也做過一些視頻講座,當然這些系列文章是視頻中沒有的,Unity首先遇到的問題就是效率問題,很多項目由於效率問題夭折了,所以這個問題的解決非常重要,如何優化效率也就是運行幀率,針對於Unity就是減少Draw Call的數量。

 網上關於Draw Call的介紹非常多,這裏再給讀者向細的方向講一下,其實Draw Call的執行就是CPU與GPU之間的通信,這就涉及到渲染流水線的概念,渲染流水線的起點是CPU,主要分三個階段:

1、CPU把數據加載到顯存中

2、設置渲染狀態

3、調用Draw Call

 

正如我之前所說的,這取決於你的硬件水平,即使它是一個簡單的UI,也可能用了10個Draw Call去畫滿整個屏幕

現在想象一下一個完整的遊戲需要多少Draw Call?

大量的Draw Call會在每一幀生成成千上萬的網格。很明顯減少它們將減少GPU開銷。

“現代桌面級遊戲可以每幀處理500-5000 draw call。而移動端大約只能處理40到60個,最新的移動設備則可以處理120到160個draw call”

所以draw call會成爲一個很大的瓶頸!記住幀率既是王道!!

如果你的幀率很好,不需要擔心craw call。
大量的Draw Call會嚴重影響硬件的表現,並且每一幀都需要完成Draw Call

噢...我現在知道了,Draw Call是罪魁禍首,但怎麼解決呢?

幸運的是,在unity中有一個叫Sprite Packer的工具救了我們!

Unity官網原話:“爲了獲得最佳性能,最好將幾個精靈紋理打包在一起成爲一個圖集。Unity提供一個雪碧包實用工具,它可以將單獨的精靈紋理自動打包成一個圖集”

關於減少drawcall的方法,可以總結出來:

  1. 使用Draw Call Batching,也就是描繪調用批處理。Unity在運行時可以將一些物體進行合併,從而用一個描繪調用來渲染他們。具體下面會介紹。
  2. 通過把紋理打包成圖集來儘量減少材質的使用。
  3. 儘量少的使用反光啦,陰影啦之類的,因爲那會使物體多次渲染。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章