有无之境

Unity性能优化(一)

一、优化说明

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

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

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


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步设置,可以极大的降低贴图占用内存。

(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会出现提示,告诉我们哪里有问题。
对于压缩格式:一般要注意以下两个问题:

禁止宽高出现奇数,必须是偶数,打成图集的图片是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、使用多线程

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »