一、优化说明
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
材质性能排行(由高到低):
排序 | 属性 | 描述 |
---|---|---|
1 | Unlit | 仅为纹理,光线不产生效果 |
2 | VertexLit | 顶点光照 |
3 | Diffuse | 漫反射 |
4 | Normal Mapped | 法线贴图 |
5 | Specular | 高光 |
6 | Normal Mapped Specular | "" |
7 | Parallax Normal Mapped | "" |
8 | Parallax Normal Mapped Specular | "" |
尽量用性能消耗更小的shader来实现效果,复杂的shader需要专人定制、管理和维护,写好Shader需要时间和经验的积累。
参考资料:
Unity3D Shader性能排行
UnityShader学习资料推荐
Amplify Shader Editor手册
三、优化CPU
1、降低DrawCall
消耗CPU过大的情况很容易出现在图形渲染上,合并批处理,降低DrawCall可以极大的提升性能。
比如使用动、静态批处理,GPU Instance技术。
Comments | NOTHING
该文章已经关闭评论