大場景VR的優化總結


 

 

     留坑,續寫。

     最近在做外景的項目,被相關的幀率優化和燈光布置困擾的不要不要的。下面寫下我是怎么優化幀率和對幀率的一些理解。

     幀率,游戲的重要影響因素,會對玩家的手感以及視覺產生重大的影響,一般的游戲幀率控制在30幀-60fps,而VR則要求90幀左右,主要關聯的硬件參數為CPU,GPU,以及內存。

而且不要忽略VR是雙目的,所以同樣面數的場景則VR的性能損耗是普通游戲的兩到三倍。所以性能優化在VR里可能跟重新制作游戲的工作量一樣大,那優化有什么策略呢?最好的解決方案是根據性能查看器來分析性能能損耗的因素,然后根據逐個因素來調優。

相關的性能分析器有:

unity自帶的:profile,frame debuger

intel:GPA

騰訊:Wetest

IOS平台-Xcode Instrument 
高通-adreno
 
侑虎科技-wpa

 

優化策略:

圖像層:

      減少Drawcacll-方法:減少材質球的使用,靜態批處理,動態批處理等,使用meshbaken和sample lod等插件對模型進行優化處理。降低資源-復用物體的材質,貼圖,把復用模型打包成prefab重復使用,其他方案:烘培,遮擋剔除,視線剔除等,

相關的插件:

 

      烘培:GI實時燈光很消耗幀率,基本是無燈光下每個模型增加幾個DC值,在無特殊的要求下盡量使用烘培后的燈光能很大程度的優化游戲的性能。烘培步驟:進行燈光設置,lighting面板設置,模型設置。當然以下是我的測試參數,可以慢慢的改變相關的參數進行更適合場景和效果的烘培。unity版本為5.4.03

                                                              

 

剔除渲染:occulusion (室外效果不錯)

把所需要進行剔除的物體的設置為static,然后打開window-occulusion culling面板進行bake操作,bake界面的參數越細致則剔除渲染需要的時間越久

 

優化前:

 優化后

 

但要注意的是很容易參數設置不准確,造成一些物體閃爍的影響。可視范圍內drawcall和面數明顯減低

 網格:

合並:

using UnityEngine;
using System.Collections;
 
public class MyClass : MonoBehaviour
{
    void Start ()
    {
        MeshFilter [] meshFilters = GetComponentsInChildren<MeshFilter> ();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];
 
        for (int i = 0; i < meshFilters.Length; i++) {
            combine [i].mesh = meshFilters [i].sharedMesh;
            combine [i].transform = meshFilters [i].transform.localToWorldMatrix;
            meshFilters [i].gameObject.active = false; 
        }
 
            transform.GetComponent<MeshFilter> ().mesh = new Mesh ();
            transform.GetComponent<MeshFilter> ().mesh.CombineMeshes (combine);
            transform.gameObject.active = true;
    }
}

1. 先在 Unity 中建立 空物件 ( Empty ) 
2. 再創建2個 Cube 方塊,並放入 空物件底下 (可以改成你自己的模型)
3. 把 MyClass 代碼丟進 空物件上 。
4. (可選) 建立一個 Material 材質,並且丟進 空物件上
5. 執行

貼圖:在外觀不變的前提下,貼圖大小越小越好。

合並:

 

粒子:

 

燈光:

像素光。
像素光可以讓你的游戲看起來效果很牛逼,但是不要使用過多的像素光。
在你的游戲中可以使用質量管理器來調節像素光的數量來取得一個性能和質量的均衡點.

性能占用順序:聚光燈>點光源>平行光。
一個好的點亮場景的方法就是先得到你想要的效果,然后看看哪些光更重要;
在保持光效的前提下看看哪些光可以去掉。

如果可以就烘焙吧

 

代碼層:

 1.減少每次代碼的幀調用

在 update函數里有些不需要很精確的操作可以減幀調用來進行優化

 

2.

 

 

profile里的占坑:

Gfx.WaitForPresent:

 

模型的規范化很重要:

這個一開始就要做好,不然后續很痛苦要返工的。

 

 其他的點:

1.允許的話在大場景中使用線性霧,這樣可以使遠距離對象或陰影不易察覺,因此可以通過減小相機和陰影距離來提高性能;

2.實時陰影很耗性能,盡量減小產生陰影的距離

3.少用像素燈和使用像素燈的Shader;

4.項目中如果沒有燈光或對象在移動那么就不要使用實時燈光

5.建材質球時盡量考慮使用Substance

6.養成良好的標簽(Tags)、層次(Hieratchy)和圖層(Layer)的條理化習慣,將不同的對象置於不同的標簽或圖層,三者有效的結合將很方便的按名稱、類別和屬性來查找;

 

 

 

 優化插件:

Mesh Baker-優化材質球,合並模型,會和渲染剔除有沖突,沒調好UV很容易錯誤

SimpleLOD-

 churer-減面,

 

 

 

 

 

踩到的坑:遠處的樹裁剪,一開始以為是相機的問題,然后發現不是,地形自帶的,tree didstant 以及廣告牌fade問題引起的。可以用實物的模型或者面片代替。在進行優化。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM