Unity3D 性能优化

2023-11-19

优化思路

个人优化原则:

三原则:

注意细节、注意细节、注意细节!

优化手段:

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) R GB24阉割版 靠后选择
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/46ae6967846

文章转载自:https://segmentfault.com/a/1190000019844821#item-3
————————————————

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3D 性能优化 的相关文章

  • C# ASP.NET 如何判断DropdownList是否为空

    程序运行时 鼠标下拉 DropdownList控件 发现下拉列表为空 参见下图 如何判断 DropdownList控件为空呢 参见下述代码 if DropDownList1 Items Count 0 Response Write retu

随机推荐

  • 【win】引用的账户当前已经锁定,且可能无法登陆

    错误信息 错误原因 原保留的登录账号已失效 解决方法 1 打开控制面板 gt 选择 用户账户 2 选择 管理你的凭据 3 选择 windows凭据 展开10 10 0 2登入项 选择 删除 或 编辑 即编辑为现在可用的账户和密码 5 运行
  • Android Studio 中Gradle Build时报错:请求的操作无法在使用用户映射区域打开的文件上

    今天在运行Android项目 Android Studio 中Gradle Build时报错 请求的操作无法在使用用户映射区域打开的文件上执行 1 问题描述 Error java io FileNotFoundException F And
  • 大模型学习 -- CLIP

    本文是CLIP算法的学习笔记 从CLIP算法介绍到具体实现原理 再到应用方法和后续一些优化策略来学习CLIP系列算法 CLIP是什么 CLIP全称是Contrastive Language Image Pre training 一种基于对比
  • 堆叠查询注入攻击

    堆叠注入原理及介绍 Stacked injections 堆叠注入 从名词的含义就可以看到应该是一堆sql语句 多条 一起执行 而在真实的运用中也是这样的 我们知道在mysql中 主要是命令行中 每一条语句结尾加 表示语句结束 这样我们就想
  • 极速入门体验Qt5软件开发,从安装到打包,少走弯路,Qt入门指南,串口调试助手开发实战

    文章目录 前言 一 成果先行 二 下载安装 1 安装QT 三 项目开发实战 1 创建新项目 2 UI设计 3 编写widget h头文件 4 编写widget cpp源文件 四 编译运行 五 项目打包 1 编译发布版 2 绿色版打包 3 安
  • python 调用matlab的.m文件

    最近在找算法的时候扒到一篇有用matlab写的算法 但我平时用的都是python 所以在网上找了有关python调用matlab m文件的教程 但或多或少都有点问题 经过不断尝试总算成功了 先说下软件版本我用matlab是R2020a py
  • 为多用户安装conda_Conda在中文用户名下运行

    让Conda在中文用户名下运行 本实验仅测试于Windows10系统中 理论上这个方法可以适应任何系统 核心是修改 condarc文件中的参数路径 使其脱离中文 关于如何使用conda anaconda miniconda 可以参照我这个博
  • SSM + Activiti5 简单OA系统

    介绍 本项目是为简单版自动化办公流程 项目内置 出差报销流程 可以作为熟悉了解Activit流程引擎学习项目 软件涉及技术 Spring4 SpringMVC4 MyBatis3 MySQL8 Pagehelper 分页控件 Activit
  • python-pickle模块

    python3 pickle持久化的储存数据 python程序运行中得到了一些字符串 列表 字典等数据 想要长久的保存下来 方便以后使用 而不是简单的放入内存中关机断电就丢失数据 python模块大全中pickle模块就排上用场了 他可以将
  • 最先进的深度学习:Mask R-CNN简介

    介绍 Introduction From my experience as a time traveller I can confidently say that autonomous driving is was will be all
  • android dm-verity 功能

    Android dm verity 实现原理深入研究 思维导图 dm verity 说明 源码基于 SC20 平台 Android5 1 Android dm verify overview 目录 Android dm verify ove
  • 协方差矩阵的实例与意义

    协方差矩阵的实例与意义 在机器学习中经常需要计算协方差矩阵 本科时没学过这个概念 一直对此非常头疼 现在试图通过实例的计算 图形化的表示来梳理一下什么是协方差矩阵 A numerical example 问题 有一组数据 如下 分别为二维向
  • Visual Studio 2022配置PCL1.12.1版本点云库

    说明 这个配置步骤是当时自己参考2019配置的 当时网上还没有VS2022的配置步骤 我在自己电脑上是配置成功了 所以我将配置过程记录了下来 仅供参考 1 软件下载 Microsoft Visual Studio 2022 Pro http
  • Kali 实现ARP断网攻击_arp断网攻击_arp欺骗

    1 安装软件包 在中端中执行 apt install dsniff ssldump 2 搜索局域网内的ip地址 nmap sn 192 168 0 这里的192 168 0 有的是192 168 1 执行结果 Nmap scan repor
  • SQLite外键(Foreign Key) 的使用例子

    从SQLite 3 6 19 开始支持 外键约束 sqlite gt PRAGMA foreign keys 0 sqlite gt PRAGMA foreign keys ON sqlite gt PRAGMA foreign keys
  • 机器学习:k近邻算法(KNN)介绍

    k近邻算法是一种最简单最经典的机器学习算法之一 该算法的原理为 当对测试样本进行分类时 首先通过扫描训练样本集 找到与该测试样本最相似的k个训练样本 根据这个样本的类别进行投票确定测试样本的类别 也可以通过个样本与测试样本的相似程度进行加权
  • 并发编程(二)——内存模型

    前言 欢迎大家一起来学习多线程 大家一起来学习吧 并发编程 一 多线程快速入门 并发编程 二 内存模型 并发编程 三 多线程之间如何实现通讯 并发编程 四 JUC并发包常用方法介绍 并发编程 五 线程池及原理剖析 并发编程 六 java中锁
  • linux给用户添加sudo权限

    切换到拥有sudo权限的用户下 输入命令 sudo vim etc sudoers 开始编辑 etc sudoers文件 找到 root ALL ALL ALL ALL 这一 行 在它下面添加 xxx ALL ALL ALL ALL 这里的
  • 数组对象在ts中的用法

    数组对象在TS中的用法 length长度 let songs string red blue pink console log songs length push push 方法将一个或多个元素添加到数组的末尾 并返回该数组的新长 3 fo
  • Unity3D 性能优化

    优化思路 个人优化原则 三原则 注意细节 注意细节 注意细节 优化手段 1 善于使用工具 2 减少总量 3 空间 时间互换 4 由浅入深 1 善于使用工具 一定要善于使用工具来分析性能问题 Profiler 先找出性能瓶颈再做优化 2 减少