Unity中DrawCall和openGL、光柵化等有何內在聯繫,為什麼說DC降低有助於渲染性能優化?
01-13
打個比方,你是遊戲引擎,你手中的畫筆就是渲染語句,畫板就是遊戲空場景,然後你要渲染場景。
你鋪開顏料,用畫筆蘸了蘸顏色,簡單混色之後畫了棵綠樹;
然後你洗了洗筆,重新混色,畫了朵紅花;然後你洗了洗筆,重新混色,又畫了棵綠樹;然後你洗了洗筆,重新混色,畫了朵紅花;
你可能要罵了,你特么不能一口氣畫完樹再畫花啊?
你看,你每次蘸顏料的過程就是一次drawcall,有效減少drawcall就是對性能的提升。
如有不對,我瞎說的,因為我是策劃,不是程序或者美術drawcall是啥?其實就是對底層圖形程序(比如:OpenGL ES)介面的調用,以在屏幕上畫出東西。所以,是誰去調用這些介面呢?CPU。比如有上千個物體,每一個的渲染都需要去調用一次底層介面,而每一次的調用CPU都需要做很多工作,那麼CPU必然不堪重負。至於說光柵化指的是在屏幕上產生一個三角形的圖形時,要確定這個三角形所覆蓋的是哪些像素的過程。和drawcall沒有什麼直接關係。
drawcall是遊戲渲染效率的一個標準 但並不是「嚴格的」drawcall次數越少越好 想將多個渲染任務組織成一次drawcall 是有條件的 需要渲染環境相同 材質屬性相同等
光柵化是顯卡對於提交的頂點插值的過程 光柵化不止用在渲染中 很多頂點間插值的過程都成為光柵化 比如尋路網格生成中也有光柵化的過程
把很久以前dx9時代的總結髮過來, opengl其實也差不太多。DrawPrimitive 簡稱DP對應的就是unity DrawCall。
1. DirectX從應用程序那裡接收到一條命令時,就必須先對這條命令進行分析和處理,再向圖形硬體發送相對應的硬體命令。由於這個分析和處理的過程由CPU完成,所以每一條DX API命令都會帶來CPU的負載。2. D3D9的DrawPrimitive類函數會觸發提交一個batch。
3. 一個batch要提交給驅動需要從用戶模式提升到內核模式,這個切換性能代價相對是比較大的,要具體的可以看386保護模式彙編的資料。所以要盡量減少提升到內核模式的次數。
4. Directx9 中,每提交一次batch,都會對使用的相關數據進行驗證。而DirectX 10中,僅在數據被創建時驗證一次。
5. batch過小一般會讓CPU忙於提交batch,而GPU卻輸入不足而處於空閑飢餓狀態。浪費GPU處理能力。也就是你對一個人說打一千桶水,和說一千次打一桶水的區別。
Unity 安卓手機平台用的是Opengl, DrawCall可以認為Opengl提交三角形,draw三角形一個過程。DrawCall 過程中,頂點shader之後是光柵化。
其實是drawcall時driver要做整個狀態的檢查,非常耗時。這個問題在ogl上最明顯。
這麼理解吧。unity中有這個概念嗎?(待查)d3d中確實有dp的概念,和樓主說的應該算類似的東西。說一下本題的答案。渲染呢,就是把算好的數據發給顯卡。顯卡根據傳過來的數據進行繪製並顯示。繪製並顯示這一過程涉及到大量的硬體操作,比處理器計算要慢很多。就好比向硬碟輸出數據一樣。當數據量等同時,必然是向硬碟寫的次數越少,寫入時間就越短,性能就越好。
到現在仍然不是很明白這個問題,希望可以提供思路。drawcall,理解為調用一次繪製。
在調用繪製前有若干準備工作,準備之後調用繪製,在繪製中又做若干工作。
所以壓根不調用繪製,那自然省去後面這些工作。但是drawcall的數量和性能不是線性相關,比如畫一個矩形,和畫一個史萊姆,雖然都是一次,但是對於性能的消耗是不同的,這個需要用相關的工具去看apicall,再結合api的複雜度來分析。跟opengl的關係,一個drawcall中可能調用多次opengl的api,這個我不確認,但是應該沒有線性關係。跟光柵化的關係,光柵化是最後將所有換為像素的過程,所以也是沒有線性關係,drawcall多了光柵化的工作會更多。寫完。。。坐等打臉。。推薦閱讀: