Unity性能优化(一)


一、优化说明

1、善于使用工具(Profiler),先找出性能瓶颈再做优化

优先利用性能分析工具找出性能瓶颈,从瓶颈入手分析性能问题产生原因。

通常来说,性能问题大致出现在两个方面:

  • 细节不够好(资源问题、插件问题、代码问题)
  • 结构不够好(框架问题、底层API问题)

2、减少内存和CPU性能消耗总量

尽量减少占用的内存(资源体积)和CPU(计算量),总量减少后再进一步优化其他细节。
Unity中资源占用的内存量比代码高的多,只要不大量使用泛型(泛型会被转换成静态类,占用大量内存),
代码一般不会占用太高内存,所以我们特别要注意资源的内存占用。


3、时间和空间相互转换:CPU和GPU,CPU和内存,内存和磁盘

消耗总量降低后,依旧有性能问题,那么可以考虑时间空间转换的方法。
一般情况下,GPU比CPU富裕,内存比CPU富裕,磁盘比内存富裕,分线程比主线程富裕。
所以一般都是GPU换CPU,内存换CPU,磁盘换内存,利用多线程分担主线程压力。

比如利用GPU Instance可以减少CPU压力。
利用对象池缓存,可以明显降低CPU的消耗。
利用Loading按需加载资源,可以减少内存峰值,大量节约内存。
利用分线程进行计算,分担主线程压力。


4、由浅入深

  • 先优化小的细节再优化大的结构
  • 先优化浅显的表面,再优化深邃的底层
  • 先优化资源设置再优化代码实现
  • 先优化逻辑再优化算法
  • 先优化部分实现再优化整体结构
  • 先想清楚实现过程再做具体实现
  • 先优化自己的思路再优化代码

细节问题解决成本低,可以单独调整,对其他部分影响小,可以批量解决。
结构问题解决成本高,牵一发动全身,对其他部分影响大,需要大改、大测。
通常来说先优化细节,如果细节优化已经很好,性能还是消耗很大,那么就需要考虑重构结构了。

游戏整体是由各个细节组成,所以细节做的不够好,整体就会出现问题。
反之,当结构不好时,细节即使做的再好,游戏整体表现出的性能也不会太好,两者是相辅相成的。


二、内存占用排行榜

名称单个体积同时使用数量总体内存占用内存占用说明
贴图很多很大占用量远超其他资源
动画时间越长,关键点越多,体积越大
网格占用中等,和精细度有关,一般内存问题不会出现它身上
音频占用大,压缩比高,ogg加进内存后体积增大10倍
材质很小很小占用量很小,数量也少

1、贴图 Textures

贴图是内存占用大户,要优化内存先从贴图格式开始。
按照下面3步设置,可以极大的降低贴图占用内存。

  • 降低分辨率
  • 拆分透明通道
  • 调整压缩格式
  • 禁用Mipmap
  • 启用Use Crunch Compression

(1) 降低分辨率(Max Size)

根据Game摄像机距离物体最近时,物体所占的像素大小,来确定最大分辨率。
一般美工或者AssetStore上下载的资源很可能是高清资源,10241024、20482048或者更大,
我们需要根据实际使用的尺寸确定,2048降低到1024后,内存会降低到原来的1/4,
极大降低内存,这里是大头,需要控制好
(图片大小和像素有关,像素点数=宽*高=面积,宽高各变为1/2,面积变为1/4)


(2)拆分透明通道(Alpha)

不需要Alpha通道的一定要去除Alpha通道,因为带Alpha通道的贴图Unity会默认选择RGBA格式。
如果不能剔除Alpha,要把format由GRBA格式选为RGB格式,以减小内存占用。
非渐变的透明贴图可以调成RGB+1bit alpha的格式 拆分alpha通道。
(RGBA一般各通道的平均分,每份1/4剔除一个通道,体积减少1/4)


(3)调整压缩格式(Compression)

尽量选用当前平台支持的最高压缩格式,不要轻易使用RGBA32格式,更不要使用不压缩格式,内存天差地别。
只要启用Compression选项,Unity会自动帮我们选用合适的压缩格式,要注意的是压缩格式的支持都是有条件限制的。
当不能使用更好的压缩格式时,Unity会出现提示,告诉我们哪里有问题。
对于压缩格式:一般要注意以下两个问题:

  • 不需要Alpha透明通道的贴图,请在PS里剔除
  • 高压缩比格式要求图片宽高是2的倍数(4的倍数更好)宽高不能被2整除,会导致不能用高压缩比的格式。

禁止宽高出现奇数,必须是偶数,打成图集的图片是2的倍数即可,单独使用的图片宽高是4的倍数。


(4)禁用Mipmap

Mipmap相当于Texture的LOD启用后会生成多级纹理,会占用更多的内存,好处是会让贴图看起来更平滑。
启用该选项会生成多级小贴图,内存会增加1/3。


(5)启用Use Crunch Compression

Crunch是Unity支持的最新压缩格式,压缩比非常高,如果你用其他格式,图片依然很大的话,这个格式会进一步压缩图片大小。
Crunch支持Android和IOS平台,能把图片压的很小,但是注意的是图片质量有损失,旧型号或低端硬件的手机可能不支持Crunch,会回退为RGBA32格式。
Crunch在Editor下,计算压缩的时间很长,77张2048的图片要压缩5~8分钟左右。
对于大量贴图的更新来说,整个团队的开发人员都要消耗相当长的时间来导入贴图。


2、动画 AnimationClips

3、网格 Mesh

(1)减少顶点Vertex

减少顶点会显著提升网格性能,减少内存的占用,通常来说,在可以实现美术效果的前提下,顶点越少越好。


(2)开启Optimize Mesh选项

官方文档翻译:为了更好的GPU性能,顶点和索引将被重新排序。
需要严格顶点排序的技术,如网格变化或者特殊的粒子网格发射器效果,应该禁用此选项。

注意:开启网格压缩(Mesh Compression)可能会导致Opimize Mesh失败,占用更大的内存

参考资料:
Unity的Mesh压缩:为什么我的内存没有变化?


4、音频 AudioClips

5、材质 Materials

材质性能排行(由高到低):

排序属性描述
1Unlit仅为纹理,光线不产生效果
2VertexLit顶点光照
3Diffuse漫反射
4Normal Mapped法线贴图
5Specular高光
6Normal Mapped Specular""
7Parallax Normal Mapped""
8Parallax Normal Mapped Specular""

尽量用性能消耗更小的shader来实现效果,复杂的shader需要专人定制、管理和维护,写好Shader需要时间和经验的积累。

参考资料:
Unity3D Shader性能排行
UnityShader学习资料推荐
Amplify Shader Editor手册


三、优化CPU

1、降低DrawCall

消耗CPU过大的情况很容易出现在图形渲染上,合并批处理,降低DrawCall可以极大的提升性能。
比如使用动、静态批处理,GPU Instance技术。


2、注意代码规范

3、内存换CPU

4、使用异步替换同步

5、使用多线程

声明:有无之境|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Unity性能优化(一)


有无之境