Unity优化篇| Unity3D场景 常用优化策略,遮挡剔除层消隐距离技术 和 LOD多层次细节
Posted 呆呆敲代码的小Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity优化篇| Unity3D场景 常用优化策略,遮挡剔除层消隐距离技术 和 LOD多层次细节相关的知识,希望对你有一定的参考价值。
🎬 博客主页:https://xiaoy.blog.csdn.net
🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉
🎄 学习专栏推荐:Unity系统学习专栏
🌲 游戏制作专栏推荐:游戏制作
🌲Unity实战100例专栏推荐:Unity 实战100例 教程
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨
------------------❤️分割线❤️-------------------------
📢前言
- 本篇文章来简单介绍一下
Unity中几种常用3D场景优化策略
方法 - 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧!
- 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节
🎬Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节
🎄一、遮挡剔除(Occlusion Culling)
介绍
当场景中包含大量模型时,DrawCall就会非常大,造成的性能消耗就会比较大,从而会造成渲染效率降低,使用遮挡剔除
技术,可以使那些被阻挡的物体不被渲染,达到提高渲染效率的目的。
原理
在场景空间中创建一个区域,该遮挡区域有单元格组成,每个单元格构成整个场景的一部分,这些单元格会把整个场景拆分成多个部分,当摄像机能够看到该单元格时,表示该单元格中的物体会被渲染出来。
实现步骤
搭建一个简易场景
给场景中的小方块们设置“遮挡静态( Occluder Static/Occludee Static
)”,如下所示:
开始做遮挡剔除的烘焙(即点击菜单的Window-->Rendering-->Occlusion Culling
)出现遮挡剔除面板,选择“Bake–bake”即可
选择遮挡剔除窗口的Visualizatior
,然后运行程序移动摄像机即可看到效果
效果如下:
🎄二、层消隐距离技术
介绍
如果场景中存在大量小“物件”,则可以使用“层消隐距离”来优化场景;”层消隐距离“就是在比较远的距离将小物体剔除,以减少绘图调用的数量(比如:可以一个大型场景中,高大型的物体任然可见,但是一些小装饰内容(小狗、车子之类的则可以隐藏))
实现步骤
新建一个小物体剔除层,取名为separatesmall
新建一个空物体取名为SmallTest
,然后将需要剔除的小物体放在该SmallTest
物体下面,并且指定SmallTest
物体的层为 smallTest
编写一个控制小物体隐藏的脚本LayerBlankingDistance.cs
using UnityEngine;
public class LayerBlankingDistance : MonoBehaviour
void Start()
//定义大小为32的一维数组,用来存储所有层的剔除信息
float[] distances = new float[32];
//这里定义数组小标“9”表示第10层
distances[9] = 10;
//将数组赋给摄像机的layerCullDistances
Camera.main.layerCullDistances = distances;
将脚本挂在场景中,运行移动摄像机测试。
这个距离必须小于或等于摄像机的farClipPlane才有效。
效果如下:
🎄三、Unity中的 LOD技术(多细节层次)
LOD(Level of detail) 多层次细节
,是最常⽤的游戏优化技术。
它按照模型的位置和重要程度决定 物体渲染的资源分配,降低⾮重要物体的⾯数和细节度,从⽽获得⾼效率的渲染运算。
这就是说,根据摄像机与模型的距离,来决定显示哪一个模型,一般距离近的时候显示高精度多细节模型,距离远的时候显示低精度低细节模型,来加快整体场景的渲染速度。
- 作用:优化GPU
- 缺点:同一模型要准备多个模型,消耗内存
- 特点:以内存做消耗来优化GPU
实现步骤
在场景中对某一个游戏对象 准备三个不同精度的模型
创建一个空物体,并把3个精度的模型放下边,给空对象添加上 LOD组件
然后点击 LOD组件 的各个精度添加上不同精度的模型
然后此时移动 场景摄像机 或者 组件的摄像机 就可以看到效果了,如下所示:
它会根据游戏对象与摄像机之间的距离来切换不同精度的模型,达到一个高效率的渲染效果。
就像我们 大逃杀游戏 里面的效果一样,在飞机上的时候看地面都是光秃秃的,等到了地上之后才能看到房子和花花草草之类的图形。
LOD组件参数
LOD组件 有一个参数 Fade Mode(淡化模式)
有三种模式可以选择,None
、Cross Fade
和 Speed Tree
None 就是一个默认模式,不作处理。
其中Cross Fade为交叉淡入淡出,在这个选下还有一个可变属性叫Fade Transition Width(淡入淡出过渡宽度)
Fade Transition Width 是一个从0~1之间的值,代表淡入淡出的过渡区域占当前LOD级别的比例。如果值较小的话,可以延迟两个LOD级别混合的开始并且过渡更快,因为Unity通常使用的是屏幕空间抖动或透明度来实现交叉渐变。
Speed Tree 只需要物体提供0~1的状态,然后两个LOD级别的混合是从0开始到1结束的,也就是开始时是与前一级别的LOD一致,转换结束时就与后一个LOD级别完全匹配了。
Speed Tree 模式仅用于在两个Mesh LOD级别之间进行混合,即当前和下一个LOD级别都具有Mesh Renderer(网格渲染器)时。当转换到Billboard LOD级别或完全淡出时,Unity会执行Cross Fade风格的混合。
Project Settings中与LOD组件相关参数
菜单栏:Edit > Project Settings > Quality
,打开Quality Setting窗口
找到Other下的参数,如图所示:
Maximum LOD Level
:是最大LOD级别,表示游戏中使用的最高LOD级别。在该级别以上的模型不会被使用,并且在编译时忽略。(这将节省存储空间和内存空间)。
LOD Bias
:LOD偏离 ,LOD级别基于物体在屏幕上的大小。当物体大小在两个LOD级别之间,可以选择使用低细节模型或高细节模型。数值取值范围为0-1,数值越接近0,越偏向于选择低细节模型。
💬总结
- 本篇文章对Unity中三种常见的场景优化技术做了一个简单的介绍和实例。
- 在真正的项目优化处理中可能会更加繁琐和麻烦,先一步步走起慢慢积累经验。
- 本篇内容到此结束啦,下次再见~
专栏推广
Unity专栏简介
以Unity引擎为基础,介绍关于Unity的各种文章学习,共同进步!Unity是一款跨平台的专业游戏引擎,用它创建的游戏可以在PC端、移动设备等常见平台上运行。
资料白嫖,技术互助
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Unity系统学习专栏 🧡 | 入门级 | 本专栏从Unity入门开始学习,快速达到Unity的入门水平 |
💛 Unity实战类项目 💛 | 进阶级 | 计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。 |
❤️ 游戏制作专栏 ❤️ | 难度偏高 | 分享学习一些Unity成品的游戏Demo和其他语言的小游戏! |
💚 游戏爱好者九万人社区💚 | 互助/吹水 | 九万人游戏爱好者社区,聊天互助,白嫖奖品 |
💙 Python零基础到入门 💙 | Python初学者 | 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门 |
温馨提示: 点击下面卡片可以获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!
以上是关于Unity优化篇| Unity3D场景 常用优化策略,遮挡剔除层消隐距离技术 和 LOD多层次细节的主要内容,如果未能解决你的问题,请参考以下文章