unity GPU優化(Occlusion Culling遮擋剔除,LOD多細節層次,GI(Global Illumination)全域性光照)
渲染管線:
定義:圖形資料在CPU上經過運算處理,最後輸出到螢幕的過程
1. 頂點處理:接收模型頂點資料、座標系轉換
2. 圖元裝配:組裝面、連線相鄰的頂點,繪製為三角面
3. 光柵化:計算三角面上的畫素,併為後面著色階段提供合理的插值引數(以及深度值)
4. 畫素處理:對每個畫素區域進行著色、寫入到快取中
5. 快取:一個儲存畫素資料的記憶體塊,最重要的快取是幀快取與深度快取
• 幀快取:儲存每個畫素的色彩(緩衝)
• 深度快取 Z—buffer:前後排序(深度資訊,物體到攝像機的距離)
Draw Call繪製呼叫:每幀呼叫顯示卡渲染物體的次數
一.Occlusion Culling遮擋剔除:
定義:當物體被送進渲染流水線之前,
將視錐以內看不到的物體進行剔除,減少每幀的渲染量,提高渲染效能
例一:unity自帶的Occlusion Culling(用碰撞實現的)很消耗GUP
步驟:
1.在Window中找到並點選Occlusion Culling
2.把需要進行渲染剔除的物體勾選為Static
3.在右邊的Occlusion中選中Object->Occlusion Areas點選Create new Occlusion Areas
4.在Object中點選Bake,和在Bake中點選Bake
5.點選Visuslization和移動相機就可以檢視效果了
效果展示:(相機沒有看到的物體自動把MeshRander隱藏了)
例項二:用InstantOC(使用射線)檢測物體
步驟
下載:AssetStore中下載InstantOC_Dynamic_Occlusion_Culling__LOD_v2.0.0.unitypackage外掛
百度雲連結:連結:http://pan.baidu.com/s/1jHPrAfG 密碼:v0yr
1.建立層
2.為遊戲物體指定層(將參與遮擋剔除)與標籤(將自動附加 IOClod指令碼)
3.物體新增碰撞器Collider元件(通過射線去檢測物體)
4.攝像機附加指令碼IOCcam
屬性
確保剔除物體顯示正常的陰影。Layer mask:參與遮擋剔除的遊戲物件層。
IOC Tag:將為指定標籤的遊戲物件自動新增IOClod指令碼物件。
Samples:每幀攝像機發射的射線數目。數量多剔除效果 好,但效能開銷大。通常在150—500之間。
Rays FOV:射線視野,應大於攝像機視野Field of View。
View Distance:檢視距離,射線長度。將影響攝像機Clipping Planes –Far 數值。
Hide Delay:延遲隱藏,當物體被剔除時延遲的幀數,建 議50—100之間。
•PreCullCheck:檢查採集資訊,建議勾選,可以提高剔除 效率。
•RealtimeShadows:實時陰影,如果場景需要實時陰影, 建議啟用,
注意:(物體需要新增Box Collider元件)
缺點:需要消耗額外CUP
適用:存在大量被遮擋的物體時使用
BUG:Realtime Shadows——使用會顯示材質丟失
優點:減少渲染壓力,優化GPU顯示
效果圖:
標記的物體沒有被遮擋時
標記的物體被遮擋了
二.LOD多細節層次:
定義:根據物體模型的節點在顯示環境中所處的位置 和重要度,決定物體渲染的資源分配,降低非重要物體的面數 和細節度,從而獲得高效率的渲染運算。(降低非重要物體(遠距離物體)的頂點數 (近精模 遠簡模))
步驟
1.建立層
2.建立空物體並將模型新增到其中,命名為:Lod_0 Lod_1 Lod_2
3.為父物體指定層與標籤
4.父物體或子物體新增碰撞器元件
5.攝像機附加指令碼IOCcam
屬性
Lod1 distance:攝像機到物體距離小於當前距離時,使 用Lod_0模型。
Lod2 distance:攝像機到物體距離大於Lod1且小於當前 距離時,使用Lod_1模型,大於當前值使用Lod_2模型。
LodMargin:LOD邊緣,如果物體在LOD各階段過渡時發 生閃爍,嘗試提高當前值。
缺點:消耗CPU判斷距離、佔用記憶體、需要三個模型(付費的不需要三個)
適用:高面模型比較多、有遠近變化
效能優化:
CPU、渲染、記憶體
例項:
三.GI(Global Illumination)全域性光照:
•簡稱GI,即全域性光照。
•能夠計算直接光、間接光、環境光以及反射光的光照系統。
•通過GI演算法可以使渲染出來的光照效果更為真實豐富。
直接光照
定義:從光源直接發出的光,通過Light元件實現。
Type 型別:燈光物件的當前型別
--DirectionalLight 平行光:平行發射光線,可以照射場 景裡所有物體,用於模擬太陽。
--PointLight 點光源:在燈光位置上向四周發射光線,可 以照射其範圍內的所有物件,用於模擬燈泡。
--SpotLight 聚光燈:在燈光位置上向圓錐區域內發射光 線,只有在這個區域內的物體才會受到光線照射,用於模擬探照燈。
--Area Light區域光:由一個面向一個方向發射光線,只照射該區域內物體,僅烘焙時有效,用在光線較為集中的區域。(僅烘焙用,極耗效能)
Range 範圍:光從物體的中心發射的範圍。僅適用於點光源和聚光燈。
Spot Angle 聚光角度:燈光的聚光角度。只適用於聚光燈。
Color 顏色:光線的顏色。
Intensity強度:光線的明亮程度。
Culling Mask 選擇遮蔽層: 選擇要照射的層Layer。
練習:為場景新增光源
陰影(直接光照)
•Shadow Type 陰影型別:Hard 硬陰影、Soft 軟陰影(軟陰影較硬陰影更消耗效能 )
--Strength 硬度:陰影的黑暗程度。
--Resolution解析度:設定陰影的細節程度。
--Bias 偏移:物體與陰影的偏移。
•GameObject通過Mesh Renderer 元件啟用/禁用陰影
--Cast / Receive Shadows 當前物體是否投射/接收陰影。
--Off 不投射陰影,On 投射陰影,Two Sided 雙面陰影,
Shadows Only 隱藏物體只投射陰影
•陰影剔除:設定顯示陰影的距離
Edit->Project Settings->Quality->Shadows Disdance
Tips:光可以設定陰影、物體可以選擇是否渲染陰影、陰影剔除可以選擇渲染的距離
間接光照
定義:物體表面在接受光照後反射出來的光。
•通過Light 元件中Bounce Intensity 反彈強度控制。
•可以通過Scene 面板Irradiance 模式檢視間接光照。
Tips:只有標記LightmapingStatic 的物體才能產生間接反彈光照。(要把物體設定為Static——靜態——才能使用間接光)
最不好實現,需要消耗大量效能計算(預計算)
環境光照
定義:作用於場景內所有物體的光照
通過Environment Lighting 中Ambient 控制。
來源:天空盒、梯度顏色、顏色
•Ambient Source 環境光源
--Skybox 通過天空盒顏色設定環境光照
--Gradient 梯度顏色
Sky 天空顏色、Equator 地平線顏色、Ground 地面顏色
--Ambient Color 純色
•Ambient Intensity 環境光強度
•Ambient GI 環境光GI模式
--Realtime實時更新,環境光源會改變選擇此項。
--Backed 烘焙,環境光源不會改變選擇此項。
反射光照
定義:根據天空盒或立方體貼圖計算的作用於所有物體的反射效果
通過Environment Lighting 中Reflection 控制。
•Reflection Source 反射源
--Skybox 天空盒
Resolution 解析度Compression 是否壓縮
--Custom 自定義
Cubemap立方體貼圖
•Reflection Intensity 反射強度
•Reflection Bounces 使用Reflection Probe 後允許不同遊戲物件間來回反彈的次數。
烘焙GI:
烘焙:Lightmap
原定義:當場景包含大量物體時,實時光照和陰影對遊戲效能有很大影響。使用烘焙技術,可以將光線效果預渲染成貼圖再 作用到物體上模擬光影,從而提高效能。適用於在效能較 低的裝置上執行的程式。
簡述:將光線效果預渲染成貼圖再作用到物體上模擬光影,從而提高效能,適合在效能較低的裝置上使用
Tips:手遊一般用烘焙GI)
烘焙後的貼圖儲存在Unity同目錄下
步驟
1. 遊戲物件設定為LightmapingStatic。
2. 設定Light元件Baking屬性。
3. 啟用Lighting 面板的Baked GI。
4. 點選Build按鈕。(如果勾選Auto 編輯器會自動檢測場 景的改動修復光照效果)
例:
根據上面的步驟:
遊戲物件(Cube/Sphere)設定為LightmapingStatic。
建立兩個SpotLight聚光燈光源
一個光源的Mode設定為Baked之後在Window Lighting-->Settings中設定
移動該光源下的Sphere可以知道 該Sphere的陰影固定在了Plane上,這是因為Baked僅烘焙時起作用,之後就是一張Texture3D貼圖(你可以把該光源刪除,理解更容易)
另一個光源的Mode改為Mixed測試
移動下面的Sphere檢視其特性
•Light 元件Baking 屬性:烘焙模式
--Realtime僅實時光照時起作用。
--Baked僅烘焙時起作用。
--Mixed 混合,烘焙與實時光照都起作用。
•可以通過Scene 面板Baked 模式檢視光照貼圖。
Baked GI
•Baked Resolution:烘焙光照貼圖解析度,建議比實時GI 解析度高10倍。
•Baked Padding:光照貼圖中各形狀間距,取值2到200。
•Compressed:是否壓縮光照貼圖,壓縮則提高效能,縮小容量,但畫質會降低。
•Ambient Occlusion:環境遮擋表面的相對亮度,值越高 遮擋處和完全曝光處區別越大,建議為1。
•Final Gather:選中後提高烘焙質量,但會消耗更多時間。
•Atlas Size:光照貼圖尺寸。
General GI
•常規GI設定,同時適用於實時GI與烘焙GI。
•Directional Mode 定向模式:
--Non– Directional 無定向模式,使用1種光照貼圖儲存 光照資訊。
--Directional 定向模式,使用2種光照貼圖儲存光照資訊, 相比之下效果更好,但空間佔用更大。
--Direction Specular 定向反射模式,使用4種光照貼圖存 儲光照資訊,效果最好,但佔用空間最大。
•除無定向模式外必須執行在GLES2.0與SM2.0以上的裝置。
GLES 指OpenGL ES 針對移動端,從iPhone5s 開始支援;
SM 指ShaderModel 針對PC 端,目前大部分顯示卡支援。
•Indirect Intensity 最終間接光照、反射光照的強度。1為默 認強度,小於1則減低強度,大於1則增大強度。
•Bounce Boost 增強間接光照。
•Default Parameters 高階GI引數。
--Default 預設
--Default –HighResolution高解析度
--Default –LowResolution低解析度
--Default –VeryLowResolution非常低的解析度
烘焙後會產生LightingData(燈光資訊,匹配圖片)
光照貼圖
批處理
1、DrawCall(繪製呼叫Draw Call):每次引擎準備資料(頂點資訊,不是面數資訊)並通知GPU的過程。通俗講,每幀呼叫顯示卡渲染物體的次數。CPU每幀呼叫圖形學介面,由圖形學介面通知GPU做圖形渲染的過程。DrawCall變多,CPU每幀呼叫的次數變多,幀率(FPS每秒幀數)變少,卡頓現象的。決定一個DrawCall的是資源,一個圖片資源放到多個場景物體中不會增加DrawCall。
2、DrawCall位置:遊戲執行時看Statics:, 為優化的DrawCall數。Profiler面板中的Total Batches的資料才是準確的DrawCall數。
3、DrawCall的優化(又稱為批處理),分為兩種:靜態(Batching)批處理、動態(Dynamic)批處理。動態批處理:可以將符合批處理原則的模型合併,合併後這些模型的DrawCall為一個。 Batched DrawCalls參與動態批處理的物體數量(合併的DrawCall數量),Bacthes降低DrawCall的兩種方式:精靈打包、圖集。【注意:貼圖不影響DrawCall,一個模型更換貼圖DrawCall不變,材質才影響DrawCall,給一個Cube加多維子材質,每個面有一個Standard材質,則場景中因為Cube存在增加6個DrawCall】
3.1動態批處理的條件:並不是所有的模型都可以參與動態批處理,不是所有的模型都符合動態批處理條件。滿足動態批處理的條件:
①場景中存在攝像機;
②模型的頂點數在300個頂點以內。
③與材質的Shader有關,如果材質的Shader是單通道,則可以參與動態批處理,如果是多通道,則不參與動態批處理。(一個Pass佔用一個DrawCall,至少要開啟一個通道才能將模型渲染出來,最基礎的是漫反射通道(Base Map佔用),如果給模型添加了反射、折射、透明、高光等貼圖,則Shader中開啟對應通道,則不能開啟動態批處理,與模型中材質的個數無關,與每個材質中是否有多通道有關);
④Transform元件中的Scale會影響批處理,Rotate、Position不會影響批處理。模型的縮放在不同的Unity版本中會有影響,如果模型的縮放倍數不是很大的話可以參與批處理,倍數過大可能就不能參與批處理。
⑤如果一個模型標記為靜態,無論什麼型別的靜態,則不能參與動態批處理;
⑥只有用Mesh Renderer渲染顯示的模型才能參與動態批處理,Skinned Mesh Renderer渲染顯示的模型不能參與動態批處理。
⑦Unity中提供的模型與3Ds Max中的模型不能一同參與動態批處理,即使使用同樣的材質。所以專案中不要用Unity自帶的模型。只要用同一個材質,即使網格不相同,只要頂點數少於300,也能一同參與動態批處理。
3.2、靜態批處理滿足的條件:
①模型必須是靜態的才可以參與批處理。
②頂點數無要求。
③對通道無要求,多通道也可以參與靜態批處理;
④參與燈光烘焙的模型(標記為靜態)也可以用靜態批處理;
⑤網格渲染元件也必須是Mesh Renderer;
⑥Transform元件也不影響靜態批處理(縮放範圍別過大即可)。
3.3、遇到模型頂點數很多的時候需要用動態批處理的做法:
①將模型打散成多個子物體,每個子物體的定點數小於300;
②利用多維子材質,給模型的所有子物體賦同一個多維子材質球,每一個材質球的都為單通道的即可。
3.4、當場景中有多類武器,每類武器會同時在場景中存在多個的情況時,就可以利用動態批處理。
3.5、批處理只能降低DrawCall不能降低CPU計算的頂點數。不能光盯著DrawCall的優化,要兼顧頂點的優化,頂點數多CPU計算量同樣會上升。
3.3、天空盒佔用一個DrawCall,因為天空盒的CubeMap用了一個單通道的Shader。
3.4靜態物體不能動態載入。
4、什麼情況下需要把小圖的標籤設定為一個(打包):圖片的型別、壓縮方式、透明、是否在同一個介面等可以放到一張大圖中。如果一張圖片在幾個介面都用,不如不打包這張圖片了,Unity打包策略:儘量將所有圖放到一張大圖中,圖片過多放到多個包中。
5、圖集:
6、因為每一個小方格都有單獨,單獨做成類。
7、讀取單個精靈用Load,讀取精靈圖集用LoadAll。
8、所有資料中,能快速定位資料的為字典集合,比陣列快多了。
---------------------
作者:leonardo_Davinci
來源:CSDN
原文:https://blog.csdn.net/leonardo_Davinci/article/details/78516955?utm_source=copy
版權宣告:本文為博主原創文章,轉載請附上博文連結!