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(淡化模式)



有三种模式可以选择,NoneCross FadeSpeed 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多层次细节的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D性能优化之资源导入标准和属性设置篇

unity3d 怎样优化大场景模型

unity3d优化-代码篇(不定期更新)

Unity3D性能优化之资源原理科普篇

Unity3D场景性能优化/渲染/卡顿/搭建优化 遮挡剔除/层消距离技术/LOD(多层次细节)

Unity3D场景性能优化/渲染/卡顿/搭建优化 遮挡剔除/层消距离技术/LOD(多层次细节)