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...