大场景VR的优化总结

别说谁变了你拦得住时间么 提交于 2020-03-29 12:14:46

 

 

     留坑,续写。

     最近在做外景的项目,被相关的帧率优化和灯光布置困扰的不要不要的。下面写下我是怎么优化帧率和对帧率的一些理解。

     帧率,游戏的重要影响因素,会对玩家的手感以及视觉产生重大的影响,一般的游戏帧率控制在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问题引起的。可以用实物的模型或者面片代替。在进行优化。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!