Unity性能优化的一些学习和整理

本文详细介绍了Unity性能优化的各个方面,包括通过Game页面的状态显示面板和Profiler监控性能,资源优化如模型和贴图压缩、减少冗余资源,音频设置优化,以及GPU渲染优化技术如LOD、OcclusionCulling、Lightmapping和Mesh合并。此外,还讨论了代码层面的CPU优化,如使用资源池和避免频繁的对象生成销毁。总结了Unity性能优化的关键点,为游戏开发者的性能调优提供了宝贵经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哪里能够看到性能表现?


除了在游戏运行时,人为的感知游戏是否卡顿的情况,unity提供了几个工具来展示一些参数供我们进行参考。


1,Game页面的状态显示面板

如下图所示,这里在展示了几个很有用的参数:FPS,Batches等等。在运行的时候,我们可以大概的看下哪些参数出现异常,而去分析接下来怎么进行优化。FPS是一个大家比较常见的参数,这个数据过低是十分影响游戏的体验的。
在这里插入图片描述


2,Unity Profiler

这是unity主要的分析器,打开路径为windows菜单–Analysis–分析器。这里可以看到各种性能分析的数据,通常我们查看渲染页下的Draw Calls,Batched Draw Calls来观察游戏的渲染次数以确定哪里出现了性能问题。
在这里插入图片描述
以上两个工具更详细的数据解读,可以参考:https://blog.csdn.net/wdmzjzlym/article/details/51335915


资源优化(Resource)篇

在游戏制作的过程中,模型,图片,音乐等资源占用很大一部分内存。并且高精度的模型和图片在渲染的时候需求很高的CPU性能。这里有一个资源优化标准做参考:
在这里插入图片描述


1,模型和贴图优化

作为美术工作的一部分,了解一下还是可以有助于工作的开展。首先我们知道模型是由点和线组成的框架,然后加上贴图使它成为一个完整的物体。在这里应该知道:
①,顶点和线越多,模型看起来越精细,同时会更加消耗渲染时候的性能压力;
②,贴图的数量越多,在渲染的时候需要渲染的次数就越多;
③,远处的物体使用简单的模型可以减少渲染;
④,贴图尽可能的复用和整合以减少渲染的次数。


2,减少冗余资源和重复资源

在开发的时候,文件目录结构也是很重要的部分。合理的目录结构不仅要使我们寻找文件的时候能够快速找到,还要保证资源文件不会被重复打包进去,并且保证不使用的资源文件不会被打包进去。
A、Resources目录下的资源不管是否被引用,都会打包进安装包,不使用的资源不要放在Resources目录下
B、不同目录下的相同资源文件,如果都被引用,那么都会打包进资源包造成冗余,保证同一个资源文件在项目中只存放在一个目录位置。


3,关于音频的一些设置

下面两个表格展示了一些设置,主要的Load Type和音频的引用,选择合理的设置来平衡内存和性能,以达到优化的目的。对于一次性播放的音效,要去释放它来节省内存。
在这里插入图片描述

有一些第三方公司,会给我们一些付费的服务来协助我们进行资源优化。如果预算充足的话,可以购买相应的服务。比如:https://www.uwa4d.com/#assetbundle。


渲染优化(GPU)篇

来自知乎的回答告诉我们:
GPU比较适合大量可并行的简单任务。比如场景渲染,光照处理等等。你看到的图像都是显卡渲染出来的。同时现在的GPU也支持一些其他的运算,比如通过GLSL,HLSL和Cg支持并行运算等等。GPU同时也对游戏中的一些物理效果提供支持,比如PhysX。一般CPU用于一些数值运算,比如伤害,随机数等等。同时你的敌人AI也是CPU运算出来的。


1,LOD - 层级细节

LOD Group是一个很好用的组件。这项技术,能够让我们对同一个物体设置2个以上的模型。用途是根据模型距离摄像机的远近来渲染不同的模型,从而减少了渲染需要的性能。
通常在摄像机拉远的时候,模型的精细程度并不能分辨出来,所以直接使用粗糙的模型可以大大的降低渲染的压力。如图所示的组件设置中,LOD从0到2是依次距离相机从近到远,直接拖拽相应的模型到对应的模块即可设置。
在这里插入图片描述


2,Occlusion Culling - 遮挡剔除

unity中的Occlusion Culling可以帮助我们去除不在视野内的模型,也是一个减少模型渲染的方法。在一个场景中如果存在大量的物体,设置Occlusion Culling后,在摄像机视野以外的物体可以不进行渲染。
设置步骤:
①,首先把需要遮挡的模型选择Occluder static状态;
②,windows菜单—渲染----遮挡剔除,打开Occlusion Culling的设置窗口;
③,勾选Occluder static,对Occluder static的模型进行遮挡剔除;
④,点击Bake按钮进行渲染烘焙,然后选择一个摄像机。


3,Lightmapping - 光照贴图

在很多项目中,光照是很重要的部分。特别是一些暗房里可能不止一个光源,但是实时的光照是很消耗渲染的计算的。所以尽可能的采用光照贴图来减少光照的计算。
光照贴图烘焙:
①,设置好需要的光源;
②,windows菜单—渲染----照明设置,打开照明设置窗口;
③,点击生成照明按钮,即可进行光照贴图烘焙。
在设置旁边有一个自动生成的选项框,尽量不要勾选。因为它在每次打开或者修改了项目的是都会重新烘焙,很耗时间,并且可能会造成卡死!


4,Mesh合并

有的时候,项目中会需求把多个模型组合在一起组成一个新的物体。这个时候,物体中模型被遮挡的部分还是存在着很多顶点的。unity提供了一个Mesh合并的方法,可以使用代码来减少物体的顶点数量以减少渲染的压力。
操作步骤:
①,建一个空Gameobject作为新的物体,把需要合并的模型作为子物体放在下面;
②,在空Gameobject上挂载带有如下方法的脚本,在awke或者start里调用这个方法即可(也可以在编辑器下使用该方法,可保存此物体)
方法主要是利用的CombineInstance类和Mesh下的CombineMeshes方法,使用CombineMeshes生成新的Mesh赋值给原有的空物体即可生成新的Mesh。
在这里插入图片描述


代码优化(CPU)篇

在编码的过程中,一些方法是很消耗CPU性能的,比如频繁的进行变量的GC回收,unity中的物体生成和销毁等。所以如果是需要经常使用的变量或者物体,可以通过存储在内存中来减少CPU的性能消耗。
而在游戏开发中,资源池是经常使用的一项技术。通过建立一个ObjectPool类来管理游戏中需要生成和销毁的物体,主要具备的功能是:
①,创建一个List作为一个池来存储需频繁创建和销毁的物体;
②,如果资源池中存在,则直接从资源池中取出物体进行初始化;
③,销毁的物体不是直接Destroy,而是设置Active为false状态并放入资源池。

除去资源池外,对于UIPanel等页面频繁关闭和打开的管理,都需采用SetActive的方式来进行展示和隐藏。需要加载的AB包,在必要的场景中加载到内存中是十分重要的。


总结

稀里糊涂写了一大堆,学习是漫长的,加油!
关于优化的内容,都是一些皮毛。作为一个学习的记录吧,希望有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值