Batch 合併Drawcall繪製HUD

2021-09-24 21:37:21 字數 2013 閱讀 3402

hud是遊戲中大量使用的元素,乙個血條往往只需要很少的表現。在unity中常用的ui大都是ngui或者ugui,因為**層級交錯或者depth重疊,往往帶來不少的drawcall開銷,從而導致遊戲效能的開銷。這裡我們建議使用3d mesh的方式去繪製hud,從而去優化效能。

我們使用c#**-hud.cs動態建立乙個mesh。首先動態建立乙個mesh,我們畫四個三角一共使用八個頂點。設定好他們對於的本地座標。建立好的mesh如下圖所示:

我們將前面兩個三角使用頂點色-紅色來表示血條, 後面兩個三角使用灰色表示滿血的情況。

專案中我們內建了兩個shader, 都是取樣頂點色。不同的是vertxsurfshader使用su***ce shader實現,會計算光照的顏色,而vertxfragshader直接輸出頂點色,不參與光照的計算。相對來說vertxfragshader更省一些。

fixed4 _color;

struct input

;void

vert

void surf (input in, inout su***ceoutput o)

在vertxfragshader中取樣頂點色的使用如下:

cgprogram

#pragma vertex vert

#pragma fragment frag

#include

"unitycg.cginc"

fixed4 _color;

float4 vertex : position;

fixed4 color : color;};

struct v2f

;fixed4 frag (v2f i)

: sv_target

endcg

然後設定關聯的render元件裡關閉反射光線和接收投射陰影。

對應的**實現如下:

rend.shadowcastingmode = shadowcastingmode.off;

rend.receiveshadows =

false

;rend.lightprobeusage = lightprobeusage.off;

rend.reflectionprobeusage = reflectionprobeusage.off;

繪製文字也不實用ngui或者ugui使用的元件,而是使用unity自帶的元件textmesh。我們把textmesh掛在hud元件下面,設定好文字大小和對齊方式。對應的**實現如下:

private

void

createtext()

控制血條進度,其實控制的就是頂點1、3、4、6的uv資訊。這些頂點的位置在[-x,x] 之間(x=2),我們根據傳進來的值在[-2,2]進行差值,算出最終的頂點位置,最後賦值給mesh,來達到控制血條進度的效果。

public

void

updatehud

(float v)

在unity中執行hudshow, 在game檢視左上角的gui-slider調整進度,我們可以發現對應的血條也跟著發生變化。下面檢視drawcall的資訊,執行dcshow,我們建立了大量的hud,並控制不同的血條進度和位置,開啟stats面板,我們看見一共只有四個drawcall,除了攝像機固定的兩個drawcall,所有的hud通過合批一共只有2個drawcall。

好了就這樣,拜拜!

Unity優化 drawcall系列

知識普及 drawcall影響的是cpu的效率。因為draw call是cpu呼叫圖形介面在螢幕上繪製對應的東西。主體 為了在螢幕上draw乙個物件 因為render和draw有些區別,所以為了區分清楚,這些概念用英文 引擎需要提供乙個draw call的api。draw call呼叫效能開銷是很大...

Unity效能優化 DrawCall

1.drawcall是啥?其實就是對底層圖形程式 比如 opengl es 介面的呼叫,以在螢幕上畫出東西。所以,是誰去呼叫這些介面呢?cpu。比如有上千個物體,每乙個的渲染都需要去呼叫一次底層介面,而每一次的呼叫cpu都需要做很多任務作,那麼cpu必然不堪重負。但是對於gpu來說,圖形處理的工作量...

DrawCall的簡單介紹

unity每次在準備資料並通知gpu渲染的過程稱為一次draw call。一般情況下,渲染一次擁有乙個網格並攜帶一種材質的物體便會使用一次draw call。對於渲染場景中的這些物體,在每一次draw call中除了在通知gpu的渲染上比較耗時之外,切換材質與shader也是非常耗時的操作。draw...