unity场景优化

近期实习过程中遇到了场景模型多加载慢的问题,所以了解一下场景优化
unity在场景优化过程中往往是选出不动的物体勾选static静态批处理 或者让美工尽可能减少模型面数,或跟产品沟通减少粒子特效之类的,Unity3D场景渲染优化的技术,包括遮挡剔除、层消距离技术、LOD(细节层次),旨在提高性能和减少卡顿。
所以本篇博客记录以下技术:
1.遮挡剔除 2.层消距离技术3.LOD
**

1.遮挡剔除

**
遮挡剔除技术允许Unity仅渲染屏幕上可见的物体,从而减少处理物体的数量,提高性能。优点是可以显著提高帧率(虽然我想这么干了,但产品说用视频就可以了哈哈哈哈 ),缺点是需要一定的预处理(提前烘培,就跟上篇文章提到的灯光烘培差不多),并且在动态场景中可能不够灵活。(有点类似打标签 选出遮挡剔除的物体即可)
选中需要遮挡剔除的物品 勾选 下图所示
“Occluder Static” 是指用来当作遮挡物的静态物体,它可以用来加速渲染效率。当 Unity 检测到一个静态物体可以当作遮挡物时,它会将其标记为 “Occluder Static”。
“Occludee Static” 是指被遮挡的静态物体,它可以被标记为 “Occludee Static”,从而避免这些物体被渲染,从而提高渲染效率。
unity场景优化_第1张图片
然后烘培场景 在windows->Rendering->Occlusion Culling

unity场景优化_第2张图片
unity场景优化_第3张图片
Bake并等待即可
效果如下视频

遮挡剔除


**

2层消距离技术

**
层消距离技术可以根据物体与相机的距离,动态调整物体的细节层次。这样可以减轻GPU的负担,提高总体性能。优点是可以根据需要动态调整细节层次,缺点是需要精确控制合适的细节层次,以避免影响图像质量。
关键点在于把需要层消的物体打上特定的 Layer也就是层

unity场景优化_第4张图片
然后我们需要让Camera"知道"这些层(最近在做地图意识到这一点的 地图上的红点可以是另一个layer的物体)
代码如下

using UnityEngine;

public class LayerBlankingDistance : MonoBehaviour
{
    public float Distance ;  //定义显示距离
    public int Layer ; //定义被剔除的层级
    
    float[] distance = new float[32];
    //经过测试 只能够在Start函数中使用
    void Start()
    {
        //Layer层显示的距离在Distance内 超过这个距离就不会显示
        distance[Layer] = Distance;
        //将数组赋给摄像机的LayerCullDistance
        Camera.main.layerCullDistances = distance;
    }
}

随便挂在场景某个空物体上就行(好像只能写在start上 其他生命周期似乎没效果?)
记着把要消除隐藏的gameobject的层级(Layer)换一下
运行代码,效果如下

层级消隐距离

3LOD
有点像mipmap的感觉,由远到近不同精细程度的模型依次加载,LOD技术可以根据物体与相机的距离,动态调整物体的细节层次。优点是可以节省GPU处理能力,提高总体性能;缺点是对于某些场景可能无法提供足够的细节层次,影响图像质量。用的不好的话有点突然“炸开”的感觉
建了三种不同精细程度的模型(原谅我的美术成绩为0的功底)

unity场景优化_第5张图片
然后在场景中建立一个空物体 挂载LOD Group组件 就这个
unity场景优化_第6张图片
然后可以由远到近一次挂载 LOD2 LOD1 LOD0即可 拖到组件上
拖拽后场景的空物体会增加这几个孩子

unity场景优化_第7张图片
拖动组件摄像机 效果如下(有种裂开的感觉)

LOD

如果有错的地方欢迎大家批评指正

你可能感兴趣的:(unity,unity,游戏引擎)