赞
踩
近期实习过程中遇到了场景模型多加载慢的问题,所以了解一下场景优化
unity在场景优化过程中往往是选出不动的物体勾选static静态批处理 或者让美工尽可能减少模型面数,或跟产品沟通减少粒子特效之类的,Unity3D场景渲染优化的技术,包括遮挡剔除、层消距离技术、LOD(细节层次),旨在提高性能和减少卡顿。
所以本篇博客记录以下技术:
1.遮挡剔除 2.层消距离技术3.LOD
**
**
遮挡剔除技术允许Unity仅渲染屏幕上可见的物体,从而减少处理物体的数量,提高性能。优点是可以显著提高帧率(虽然我想这么干了,但产品说用视频就可以了哈哈哈哈 ),缺点是需要一定的预处理(提前烘培,就跟上篇文章提到的灯光烘培差不多),并且在动态场景中可能不够灵活。(有点类似打标签 选出遮挡剔除的物体即可)
选中需要遮挡剔除的物品 勾选 下图所示
“Occluder Static” 是指用来当作遮挡物的静态物体,它可以用来加速渲染效率。当 Unity 检测到一个静态物体可以当作遮挡物时,它会将其标记为 “Occluder Static”。
“Occludee Static” 是指被遮挡的静态物体,它可以被标记为 “Occludee Static”,从而避免这些物体被渲染,从而提高渲染效率。
然后烘培场景 在windows->Rendering->Occlusion Culling
Bake并等待即可
效果如下视频
遮挡剔除
**
层消距离技术可以根据物体与相机的距离,动态调整物体的细节层次。这样可以减轻GPU的负担,提高总体性能。优点是可以根据需要动态调整细节层次,缺点是需要精确控制合适的细节层次,以避免影响图像质量。
关键点在于把需要层消的物体打上特定的 Layer也就是层
然后我们需要让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的功底)
然后在场景中建立一个空物体 挂载LOD Group组件 就这个
然后可以由远到近一次挂载 LOD2 LOD1 LOD0即可 拖到组件上
拖拽后场景的空物体会增加这几个孩子
拖动组件摄像机 效果如下(有种裂开的感觉)
LOD
如果有错的地方欢迎大家批评指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。