Unity 性能优化经验整理
优化思路
个人优化原则:
三原则:
注意细节、注意细节、注意细节!
优化手段:
1.善于使用工具
2.减少总量
3.空间、时间互换
4.由浅入深
1.善于使用工具:
一定要善于使用工具来分析性能问题(Profiler),先找出性能瓶颈再做优化。
2.减少总量:
尽量减少性能消耗的总量(内存和CPU占用)。
3.空间、时间互换:
CPU和GPU可以互换,CPU和内存可以互换、内存和磁盘可以互换。
4.由浅入深:
先优化小的细节再优化大的结构。
先优化浅显的表面,再优化深邃的底层。
先优化资源设置再优化代码实现。
先优化逻辑再优化算法。
先优化部分实现再优化整体结构。
先想清楚实现过程再做具体实现。
先优化自己的思路再优化代码。
优化说明:
工欲善其事,必先利其器。优先利用性能分析工具快速找出性能瓶颈,从瓶颈入手分析性能问题产生原因,可以事半功倍。
尽量减少占用的内存(资源体积)和CPU(计算量),首先着重减少总量才能更好的进行后续细节的优化。
总量降低后,性能依旧有问题,那么可以考虑时间空间转换的手段。一般情况下,GPU比CPU富余,内存比CPU富余,磁盘比内存富余,分线程比主进程富余。所以一般都是GPU换CPU,内存换CPU,磁盘换内存,利用多线程分担主进程的压力。
比如利用GPU Instance可以减少CPU的压力。利用对象池缓存,可以省略加载资源、实例化、销毁实例、卸载资源的步骤,可以明显降低CPU的消耗。
利用Loading进度条按需加载资源,可以减少内存峰值,大量节约内存。
利用分线程进行计算,可以分担主进程的压力。
通常来说先优化细节,如果细节优化已经做的很好,没什么太多潜力可以挖了,性能还是消耗太大,那么就需要考虑重构结构了。
性能分析:
使用Profiler性能分析器首先确定性能瓶颈出现在哪里,定位性能问题出现的根本原因,按照具体原因去做优化。
通常来说,性能问题大致出现在两个方面:
1.细节不够好(资源问题、插件问题、代码写法问题)
2.结构不够好(框架问题、底层API问题)
细节问题解决成本低,可以独立调整,对其他部分影响小,可以批量解决。
结构问题解决成本高,牵一发动全身,对其他部分影响大,需要大修、大测。
由于游戏整体是由各个细节组成的,所以当细节做的不够好时,整体也会显现出问题。
反之当结构不够好时,细节即使做的很好,游戏整体表现出的性能也不会太好,两者是相辅相成的。
我的建议是:用严格认真的态度控制细节,用丰富的经验积累出可靠的结构。
前者靠态度,后者靠经验。当我们经验不多时,应该依靠态度严控细节,当我们经验足够时,两方面都要兼顾。
多读官方API:
多读官方API,多读官方API多,读官方API。重要的事情说三遍,不要重复造轮子。Unity中有很多性能细节问题都出现在功能不熟悉上,没玩明白导致的,熟悉官方API可以让我们事半功倍。C#代码也一样,也要熟悉C#官方API。
优化内存
Unity中 资源占用的内存量比代码高的多,只要代码不往死掉写,或者使用大量的泛型(注意泛型会被转成静态类,占用大量内存),一般不会占用太高内存,我们要特别注意资源的内存占用。
Unity资源内存占用排行榜
1.贴图 Textures
2.动画 AnimationClips
3.网格 Meshes
4.音频 AudioClips
5.材质 Materials
资源内存占用说明:
名称 | 单个体积 | 同时使用数量 | 总体内存占用 | 内存占用说明 |
---|---|---|---|---|
贴图 | 大 | 很多 | 很大 | 占用超级大户 远超其他资源(超级土豪VIP熟客 需重点关照 利润大) |
动画 | 大 | 多 | 大 | 占用大户 时间越长 关键点越多体积越大(普通顾客 认真对待 利润中) |
网格 | 中 | 中 | 中 | 占用中等 和精细度有关 一般内存问题不会出现在它身上(普通游客 利润小) |
音频 | 大 | 少 | 小 | 占用大 压缩比高 ogg加进内存后 体积增大10倍(土豪游客 出现一次狠宰) |
材质 | 很小 | 少 | 很小 | 占用很小 数量也少 (邻居 别指望从它身上赚钱了) |
1.优化贴图(Texture)
内存占用超级大户,史前怪兽级别的,要优化内存先从优化贴图格式开始。
按照下面3步设置,可以极大降低贴图占用内存。
1.降低分辨率
2.拆分透明通道
3.调整压缩格式
4.禁用Mipmap
5.启用Use Crunch Compression
1.降低分辨率(Max Size):
根据Game摄像机距离物体最近时,物体所占的像素大小(QQ截图),来确定最大分辨率。
一般美工或Asset Store上下载的资源很可能是高清资源,1024x1024、2048x2048或更大,我们需要根据实际使用的尺寸确定。
2048x2048降低为1024x1024后 内存会降低为原来的1/4 极大降低内存占用 这里是是大头 要控制好。
(图片大小和像素有关 像素点数=宽x高=面积 宽高各变为1/2 面积变为1/4)
2.拆分透明通道(Alpha):
不需要Alpha通道的一定要去除Alpha通道 因为带Alpha通道的贴图 Unity会默认选择RGBA格式。
如果不能剔除Alpha 要把format由RGBA格式选为RGB格式 以减小内存占用。
非渐变的透明贴图 可以调成RGB + 1bit alpha的格式 拆分alpha通道。
(RGBA一般各通道是平均分 每份1/4 剔除一个通道 体积减少1/4)
3.调整压缩格式(Compression):
尽量选用当前平台支持的最高压缩格式,不要轻易使用RGBA32格式,更不要使用不压缩格式,内存天差地别。
只要启用Compression选项,Unity会自动帮我们选用合适的压缩格式 要注意的是压缩格式的支持都是有条件限制的。
当不能使用更好的压缩格式时,Unity会出现提示,告诉我们哪里有问题。对于压缩格式:一般要注意以下两个问题。
(1)不需要Alpha透明通道的贴图 请在PS里剔除。
(2)高压缩比格式要求图片宽高是2的倍数(4的倍数更好) 宽高不能被2整除,会导致不能用高压缩比的格式。
宽高禁止出现奇数,必须都是偶数,打成图集的图片是2的倍数即可,单独使用的图片宽高要是4的倍数。
以一张512x512分辨率的图片为基准 测试不同平台 不同压缩格式占用的内存:
PC常用图片格式:DXT
图片格式 | 512x512(启用Mipmap) | 1024x1024(启用Mipmap) | 图片质量 | 内存(压缩比) | 说明 |
---|---|---|---|---|---|
RGBA 32 bit | 1M(1.3M) | 4 M(5.3M) | 最高 | 最大(1) | 透明高清无压缩 最靠后选择 |
ARGB 16 bit | 0.5M(0.7M) | 2 M(2.7M) | 中 | 中(1/2) | RGBA32阉割版 靠后选择 |
RGB(A) BC7 | 256KB(341.4KB) | 1M(1.3M) | 中高 | 小(1/4) | 透明高清高压缩 次优先选择 |
RGBA DXT5 | 256KB(341.4KB) | 1M(1.3M) | 中 | 小(1/4) | 透明中清高压缩 最优先选择 |
RGB 24 bit | 0.8M(1M) | 3M(4M) | 高 | 很大(3/4) | 不透明高清无压缩 最靠后选择 |
RGB 16 bit | 0.5M(0.7M) | 2M(2.7M) | 中 | 中(1/2) | RGB24阉割版 靠后选择 |
RGB DXT1 | 128KB(170.7KB) | 0.5M(0.7M) | 中 | 很小(1/8) | 不透明中清高压缩 最优先选择 |
RGB(A) BC7:高质量高压缩格式 但是mac上不兼容
Android常用图片格式:ETC
图片格式 | 512x512(启用Mipmap) | 1024x1024(启用Mipmap) | 图片质量 | 内存(压缩比) | 说明 |
---|---|---|---|---|---|
RGBA 32 bit | 1M(1.3M) | 4 MB(5.3M) | 最高 | 最大(1) | 透明高清无压缩 最靠后选择 |
ARGB 16 bit | 0.5M(0.7M) | 2 MB(2.7M) | 中 | 中(1/2) | RGBA32阉割版 靠后选择 |
RGBA ETC2 8 bits | 256KB(341.4KB) | 1 MB(1.3M) | 中 | 小(1/4) | 透明中清高压缩 最优先选择 |
RGB 24 bit | 0.8M(1M) | 3M(4M) | 高 | 很大(3/4) | 不透明高清无压缩 最靠后选择 |
RGB 16 bit | 0.5M(0.7M) | 2M(2.7M) | 中 | 中(1/2) | RGB24阉割版 靠后选择 |
RGB ETC2 4 bits | 128KB(170.7KB) | 0.5M(0.7M) | 中 | 很小(1/8) | 不透明中清高压缩 最优先选择 |
RGB ETC 4 bits | 128KB(170.7KB) | 0.5M(0.7M) | 中 | 很小(1/8) | 不透明中清高压缩 次优选择 |
IOS平台常用图片格式:PVRTC
图片格式 | 512x512(启用Mipmap) | 1024x1024(启用Mipmap) | 图片质量 | 内存(压缩比) | 说明 |
---|---|---|---|---|---|
RGBA 32 bit | 1M(1.3M) | 4 MB(5.3M) | 最高 | 最大(1) | 透明高清无压缩 最靠后选择 |
ARGB 16 bit | 0.5M(0.7M) | 2 MB(2.7M) | 中 | 中(1/2) | RGBA32阉割版 靠后选择 |
RGBA PVRTC 4 bits | 128KB(170.8KB) | 0.5M(0.7M) | 低 | 很小(1/8) | 透明低清高压缩 最优先选择 |
RGBA ASTC 6x6 block | 115.6KB(154.7KB) | 456.9KB(0.6M) | 中 | 很小(~1/8) | 透明中清高压缩 iPhone6之后首选 |
RGB 24 bit | 0.8M(1M) | 3M(4M) | 高 | 很大(3/4) | 不透明高清无压缩 最靠后选择 |
RGB 16 bit | 0.5M(0.7M) | 2M(2.7M) | 中 | 中(1/2) | RGB24阉割版 靠后选择 |
RGB PVRTC 4 bits | 128KB(170.8KB) | 0.5M(0.7M) | 低 | 很小(1/8) | 不透明低清高压缩 最优先选择 |
RGB ASTC 6x6 block | 115.6KB(154.7KB) | 456.9KB(0.6M) | 中 | 很小(~1/8) | 透明中清高压缩 iPhone6之后首选 |
PVRTC:IOS原生支持的一种压缩格式 优点是:高压缩比 兼容性好 缺点是:有损压缩 图片质量较差,对于透明像素的边缘和渐变的透明度有特别明显的失真。
ASTC :IOS支持的一种新的压缩格式 优点是:比PVRTC更高的压缩比和质量,透明贴图质量更高 缺点是:兼容性差 iPhone6才开始支持该格式,iPhone5和之前不支持该格式。
参考资料:
《干货:Unity游戏开发图片纹理压缩方案》https://www.jianshu.com/p/f7c...
《Unity3D的图片压缩格式详解》https://www.jianshu.com/p/bec...
《Unity3D~纹理格式》https://www.cnblogs.com/rayya...
《Unity中一个简单的图形优化指导》http://gad.qq.com/program/tra...
4.禁用Mipmap
Mipmap相当于Texture的LOD 启用后会生成多级纹理 会占用更多的内存 好处是会让贴图看起来更平滑。
启用该选项会生成多级小贴图 内存会增加1/3。
5.启用Use Crunch Compression
Crunch是Unity支持的最新压缩格式,压缩比非常高,如果你用其他格式,图片依然很大的话,这个格式会进一步压缩图片大小。
Crunch支持Android和IOS平台,能把图片压的很小,但要注意的是图片质量有损失,旧型号或低端硬件的手机可能不支持Crunch,会回退为RGBA32格式。
Crunch在Editor下,计算压缩的时间很长,77张2048的图片要压缩5~8分钟左右。
对于大量贴图的更新来说,整个团队的开发人员都要消耗相当长的时间来导入贴图,十分痛苦 很容易拉仇恨(说的就是我自己)。
参考资料:
《Unity性能优化之内存-贴图格式优化》https://segmentfault.com/a/11...
《Unity优化(一):图形优化》https://gameinstitute.qq.com/...
《[Unity优化] unity图片mipmap》https://www.jianshu.com/p/651...
《Unity 2017.3 中的Crunch纹理压缩库》https://www.sohu.com/a/204935...
《Unity官方文档Texture》https://docs.unity3d.com/Manu...
2.优化动画(Animation Clip)
总结一下优化动画的手段:
1.减小动画长度
2.减少骨骼数量
3.减少关键帧密度
4.减少动画精度
1.减小动画长度:
有些动画实际使用的的长度,远小于动画时长,如果有被加快使用的动画,应该考虑改短动画,降低大小,Animator里加快速度不会减少动画大小。
2.减少骨骼数量:
动画导入后,查看有无无效的骨骼点,删除这些节点可以降低动画大小。
(1)Animation里 骨骼点变成黄色说明缺少该骨骼点,需要确定是骨骼点丢失还是不需要这些骨骼点,如果动画正常,则说明这些骨骼点无效可以删除。
(2)注意IK骨骼点 如果不需要使用反向动力学功能,而动画里又包含了IK骨骼点, 则删除这些骨骼点(通常是美工做完动画忘删IK了)。
3.减少关键帧密度:
启用FBX > Animation选项 > Anim.Compression选项 > Keyframe Reduction
Keyframe Reduction官方文档翻译:减少导入的冗余关键帧。如果选择,将显示动画压缩错误选项。这将影响文件大小(运行时内存)和如何评估曲线。
4.减少动画精度:
Unity存储Animation的数值精度比较高,可以通过减少数值精度的手段,降低动画大小。
参考资料:
《Unity骨骼动画资源解析与优化》https://www.cnblogs.com/damow...
《unity性能优化之降低动画文件的大小》https://blog.csdn.net/rhett_y...
《Unity 优化翻译官方文档(三) Animation Clips》https://blog.csdn.net/dengshu...
3.优化网格(Mesh)
1.减少顶点
2.开启Optimize Mesh选项
1.减少顶点Vertex:
减少顶点会显著的提升网格的性能,减少内存的占用,通常来说,在可以实现美术效果的前提下,顶点越少越好。
2.开启Optimize Mesh选项:
官方文档翻译:为了更好的GPU性能,顶点和索引将被重新排序。需要严格顶点排序的技术,如网格变形或特殊的粒子网格发射器效果,应该禁用此选项。
注意:开启网格压缩(Mesh Compression)可能会导致Optimize Mesh失败,占用更大的内存。
参考资料:
《Unity的Mesh压缩:为什么我的内存没有变化?》https://www.cnblogs.com/muron...
4.优化音频(Audio Clip)
音频同时使用的数量较少,但是压缩比率大,默认音频格式解压缩进内存后,实际占用内存体积很可能会比文件体积要大上10倍。
对于较大的音频文件(以MB为单位的),要特别注意。
Load Type 改为 Streaming,可以极大降低内存峰值。
建议较长的音频使用.mp3或.ogg格式,较短的音频使用.wav 或.aiff格式。
音频的最佳实践:
音频默认设置:
优化按照音频文件的大小分为小、中、大三个级别。
1.较小的文件(几十KB):
2.中等的文件(几百KB):
3.较大的文件(几MB)
参考资料:
《Unity优化翻译官方文档(四) ------ Audio Clip》https://blog.csdn.net/dengshu...
《自动设置资源属性》https://www.jianshu.com/p/46a...
5.优化材质
材质性能排行(由高到低):
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性能排行》https://www.cnblogs.com/tim-u...
《UnityShader学习资料推荐》https://blog.csdn.net/wwlcsdn...
《Amplify Shader Editor手册(中文版)》https://blog.csdn.net/Debugge...
优化CPU
1.降低DrawCall
2.注意代码规范
3.内存换CPU
4.使用异步代替同步
5.使用多线程
1.降低DrawCall:
消耗CPU过大的情况很容易出现在图形渲染上,合并批处理,降低DrawCall可以极大的提升性能。比如使用动、静态批处理,GPU Instance技术。
2.注意代码规范:
良好的代码规范会让你获得更好的性能,并且避免很多陷阱,减少入坑的几率,节约时间。多读官方API,避免重复造轮子。
3.内存换CPU:
CPU不够时,不但可以想方法降低CPU的消耗,也可以考虑用内存换CPU。使用对象池就是一种常见的内存换CPU的手段。
4.使用异步代替同步:
使用异步Async(非阻塞式)代替同步Sync(阻塞式),可以优化用户体验。比如加载时用异步加载,显示进度条就属于这种方式。
但是通常异步比同步消耗的时间更多,遇到的问题更多,所以要合理使用异步和同步。
5.使用多线程:
主进程计算量大时,会造成游戏卡顿,除了优化算法减小计算量以外,也可以使用多线程分担计算压力,具体技术可以看C# Job System。
优化代码
建议先看看Unity官方正在推广的DOTS技术。
DOTS: 面向数据的技术栈
Unity中的具体实现: ECS + C# Job System + Burst Compiler
总的来说,DOTS是Unity官方正在推广的一种高性能编程方式,利用实体组件系统 + 多线程 + 爆发式编译,可以极大提升代码性能。
ECS对应面向数据,这种架构更适合处理量级较大的任务。
C# Job System对应多线程,可以利用多核CPU进行硬件加速。
Burst Compiler对应底层API,可以把脚本代码编译成高度优化的本地机器码,进行底层API的软件加速。
这样一套架构 + 开源 + 节流的组合拳下来,可以极大提升游戏性能。
我个人理解是:[实体组件系统]是为了使用[多线程]和[爆发式编译]这两个大招,需要学习的前置心法。
参考资料:
《Unity ECS(二)HelloWorld!ECS!(1)》https://connect.unity.com/p/u...
《Unity DOTS(一) Job System 介绍》https://zhuanlan.zhihu.com/p/...
《Unity DOTS技术详解 - 宣雨松》https://www.bilibili.com/vide...
《用好lua+unity,让性能飞起来——lua与c#交互篇》
https://www.cnblogs.com/zwywi...
《优化Unity游戏项目的脚本》
https://connect.unity.com/p/y...
参考资料:
《[Unity优化]减少DrawCall:批处理》https://blog.csdn.net/lyh916/...
《阿里巴巴Java代码规范》https://www.cnblogs.com/han-1...
《Unity官方文档-DrawCallBatching》https://docs.unity3d.com/Manu...
《Unity GPU Instance(大量相同网格物体合批)》https://segmentfault.com/a/11...
《Unity 对象池》https://blog.csdn.net/wangjia...
《Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条》https://www.xuanyusong.com/ar...
自动更改资源设置
在资源导入时,利用脚本自动修改资源设置,增加工作效率。
参考资料:
《Unity 之 自动设置导入资源属性选项(模型、图片、声音)》https://www.jianshu.com/p/46a...
Unity 性能优化经验整理相关推荐
- unity性能优化方案整理 一些思路 一些技巧(持续更新 2019-09-12)
原文链接1:https://www.cnblogs.com/zhenlong/p/4862869.html 原文链接2:http://www.xuanyusong.com/archives/3205 ...
- Unity 性能优化总结
影响性能的因素 造成游戏性能瓶颈的主要原因分成以下几个方面: (1)CPU 1.过多的 draw call 2.复杂的脚本或者物理模拟 (2)GPU 1.顶点处理 过多的顶点.过多的逐顶点计算 2.片 ...
- java性能瓶颈分析_Java性能优化技巧整理,做一个深度的程序员
原标题:Java性能优化技巧整理,做一个深度的程序员 在我们身边是一大批的程序员,层次不一,但是放眼观,我们很容易就可以看到那些是业务型程序员,那些是有层次的程序员.注重细节,注重性能,做一个有深度的 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
http://www.cnblogs.com/alan777/p/6135703.html Unity性能优化(2)-官方教程Diagnosing performance problems using ...
- Unity - 性能优化 - 包体,内存 - 偏静态资源的优化
文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...
- Unity性能优化大合集,All In One !(更新至8.18)
引擎把握篇 性能卡顿.内存泄露.资源冗余...这些开发中遇到的疑难杂症大部分都能在这里找到解决方法.这些经验总结无不通过大量的项目深度优化和周而反复的测试验证.如果你想避开一些不必要的坑,请务必啃下这 ...
- 欢乐互娱庞池海:《龙之谷》项目性能优化经验分享
欢乐互娱庞池海:<龙之谷>项目性能优化经验分享 在5月12日,UNITY 2017案例分享专场上,欢乐互娱技术引擎开发工程师娱庞池海分享了<龙之谷>项目性能优化经验.以下为分享 ...
- Unity性能优化分析思路
1)Unity性能优化分析思路 2)Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常 3)FBX默认会冗余lit.mat ...
- 网易视频云:游戏开发性能优化经验总结
网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PaaS服务.在线教育.远程医疗.娱乐秀场 ...
- Unity性能优化 – 脚本篇
最近开始进行Unity性能优化的工作,主要分为三类:CPU.GPU和内存.由于我们游戏的核心战斗是计算密集型,所以主要是受限于CPU.CPU的优化又分为渲染和脚本,本文将着重于脚本优化. 一般来说,优 ...
最新文章
- ThinkPHP 详细介绍
- 为什么python注释不能中文_python中输入中文注释是无法编译
- leetCode刷题--两数相加
- springboot和springcloud有什么关系
- Android用第三方jar包ClassNotFoundException:XXX in loader dalvik.system.PathClassLoader[/app/XX.apk]...
- idea中新建.xml文件找不到选项的解决方法
- java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
- 解决 Maven ‘parent.relativePath‘ of POM
- PC端-移动端自适应屏幕
- Nginx动静分离配置
- ActiveMQ的传输协议
- 计算机网络中常见的数据传输方式(电路交换,报文交换,分组交换)
- 2023年美国大学生数学建模竞赛(春季赛)
- 现代通信网复习资料(第一章:绪 论)
- 李翔敏:城市停车管理的五点困境、六大展望与三项思考
- 类unix系统中启动脚本记录
- vue中播放flv格式视频(b站flv.js的使用)
- web扫描姿势——xray被动扫描
- 无敌简单hls入门教程
- 易经的智慧(1)---阴阳之道
热门文章
- Rust: map中的问题,两种写法有什么不同?
- (转)人工智能的钟摆
- Julia: 如何一次性insert Array{Any,2} to SQLite DB?
- (转)【特征工程】特征工程技术与方法
- 中台,都被你们说糊涂了
- 阿里巴巴招聘操作系统研发专家
- OpenStack回顾和展望-2018
- 【机械仿真】基于matlab GUI 汽车悬架(钢板弹簧+减震器)设计【含Matlab源码 1631期】
- 【单目标优化求解】基于matlab遗传算法求解非线性目标函数最小值问题【含Matlab源码 1574期】
- 【图像增强】基于matlab可见边缘梯度比率图像增强【含Matlab源码 1404期】