Unity优化总结(2021.04.08)

项目性能优化的三个方面:
1.CPU优化
Cpu优化不够会出现的问题:
  • 由于短时间计算量太大,画面流畅性降低,出现跳帧
  • 发热严重,耗电量高
(1)代码方面
  • 删除一些空的方法,尤其是Update等;
  • 使用for循环代替foreach,使用List代替ArrayList,尽量少使用封箱拆箱操作;
  • 循环中可以Break掉的直接退出循环,减少不必要的循环;
  • 少使用复杂运算,如触发、开平方根、反余弦,使用+、*代替;
  • FixedUpdate等频繁调用的方法可以扩大间隔,可以使用协程、InvokeRepeating代替;
  • OnGui最好只在一个脚本中出现;
  • OnBecameVisible当物体被相机看到才执行一些操作,常用于AI
  • 不使用打印、不出现警告;
  • 不能频繁的获取组件、创建新的对象,使用全局变量代替;
(2)物理系统方面
  • 碰撞检测方面、使用离散的检测;
  • 碰撞器不使用MeshCollider,使用简单模型代替;
(3)动画和粒子系统
  • 使用简单的动画
  • 减少例子系统数量、缩小效果
(4)Shader特效和灯光方面
  • Shader尽量使用一些简单的算法,不使用复杂的效果;
  • 尽量不使用透明的处理;
  • 减少屏幕特效的复杂运算;
  • 灯光方面不使用实时阴影,使用Mixe
2.GPU优化
  • 批处理
动态批处理:要求比较高,对面数、顶点数、材质球都有要求;
静态批处理:把不动的物体标记成static,相同的材质球设置为预设物使用;
  • 减少模型数量、骨骼数、片面数,使用发现贴图来代替细节模型
  • 减少场景的大小,场景中树、草模型数量
  • 灯光烘焙使用光照探测、Mixed
  • 遮挡剔除、LOD(消耗内存)、MipMap(消耗内存)
  • 减少镜头特效、减少透明的效果、反射效果
  • 减少不必要的层级,打包图集,一个图集最好不要超过1024*1024
  • 使用序列帧动画代替粒子系统(消耗内存)
3.内存优化
内存优化的不够会出现的问题
闪退和卡死,安卓的低内存杀手Low Memory Killer会在低内存情况下杀掉内存占用过大的程序
 
内存有三种:
  1. 程序代码
  2. 托管堆(Managed Heap)
  3. 本机堆(Native Heap)
除了动态加载和卸载资源,比如在游戏内的时候,我们可以把游戏外的一些UI图集卸载掉;除了降低资源质量或屏幕分辨率,这是有损优化,一般作为最后的手段。还有如下优化建议:
 
程序代码
程序代码包括了所有的Unity引擎使用的库、以及你所写的所有的游戏代码。
在编译后,得到的运行文件将会被加载到设备中执行,并占用一定内存。这部分内存实际上是没有办法去“管理”的,它们将在内存中从一开始到最后一直存在。一个空的Unity默认场景,什么代码都不放,在iOS设备上占用内存应该在17MB左右,而加上一些自己的代码很容易就飙到20MB左右。想要减少这部分内存的使用,能做的就是减少使用的库,稍后再说。
也许,这就是,为什么不用Unity高效开发APP的原因吧?但还是可以考虑用Unity开发APP,毕竟还好吧~
 
托管堆
托管堆是被Mono使用的一部分内存。Mono是一个开源的.net框架的一种实现,对于Unity开发,其实充当了基本类库的角色。托管堆用来存放数组、字符串、类的实例等。“托管”的意思是Mono“应该”自动地改变堆的大小来适应你所需要的内存,并且定时地使用垃圾回收(GC)来释放已经不需要的内存。
 
本机堆
本机堆是Unity引擎进行申请和操作的地方,比如贴图,音效,关卡数据等。Unity使用了自己的一套内存管理机制来使这块内存具有和托管堆类似的功能。基本理念是:如果在这个关卡里需要某个资源,那么在需要时就加载,之后在没有任何引用时进行卸载。
听起来很美好也和托管堆一样,但是由于Unity有一套自动加载和卸载资源的机制,让两者变得差别很大。自动加载资源可以为开发者省不少事儿,但是同时也意味着开发者失去了手动管理所有加载资源的权力,这非常容易导致大量的内存占用(贴图什么的你懂的),也是Unity给人留下“吃内存”印象的罪魁祸首。
 
优化程序代码的内存占用
 
这部分的优化相对简单,因为能做的事情并不多:主要就是减少打包时的引用库(即 库剥离),改一改build设置即可。
 
当使用Unity开发时,默认的Mono包含库可以说大部分用不上,在Player Setting面板里,将最下方的Optimization栏目中“Api Compatibility Level”选为.NET 2.0 Subset,表示你只会使用到部分的.NET 2.0 Subset,不需要Unity将全部.NET的API包含进去。
接下来的“Stripping Level”表示从build的库中剥离的力度,每一个剥离选项都将从打包好的库中去掉一部分内容。你需要保证你的代码没有用到这部分被剥离的功能,选为“Use micro mscorlib”的话将使用最小的库。库剥离可以极大地降低打包后的程序的尺寸以及程序代码的内存占用。
 
另外还有
IO和网络
IO和网络优化不好会出现的问题:
  1. 网络延迟甚至掉线
  2. 加载资源导致的跳帧
  3. 加载时间过长
常见的优化手段:
  1. 使用独立的线程进行加载,Unity中还能利用协程
  2. 减少网络包里面的冗余数据
  3. 合并小包,减少请求数据的次数
  4. 分帧对回包进行处理
  5. 限制一定时间内的发包频率

 

posted @ 2024-05-20 10:41  weigang  阅读(11)  评论(0编辑  收藏  举报