自学内容网 自学内容网

Unity性能优化(简略版)

一、规范美术的资源

  • 比如对于没有透明通道的图片美术导出时就不需要带透明通道,因为RGB和RGBA压缩的内存大小有一倍的差距
  • 降低模型面数,降低模型骨骼数量,降低贴图大小

二、UI的Draw Call优化

  • 通过打图集减少DrawCall次数
  • Canvas会打断合批
  • Text也算一次DrawCall也会打断合批
  • Mask也会打断合批,使用RectMask2D可以避免
  • 直接修改Image的Color属性会造成Rebulid,可以通过修改材质的Color属性来避免

三、批处理

  • 静态批处理:将相同材质的物体合批,静态合批的物体不能自由移动,并且会增加内存占用
  • 动态批处理:动态批处理开启后会自动合批,但是对定点数有限制
  • GPU Instancing:将多个相同网格和材质的对象进行合批,与静态相比不会造成内存激增,但是是通过传递Transform列表,如果物体没有移动/旋转/缩放只需要一次开销,所以不合适需要频繁修改Transfrom的物体
  • 通过代码运行时做批处理

四、UI优化

  • 频繁调用SetActive,隐藏一个较大的有很多子节点的UI界面会有很大的开销,可以通过移除屏幕或者修改Layer的方式,频繁对Canvas进行Enable操作会重新执行构建Rebuild以及重新批处理Rebatch
  • Image和Text不需要响应时间去掉RaycastTarget可以节省性能
  • Mask替换为RectMask2D,Mask会打断合批
  • 将UI进行动静分离,不可活动的元素放在一个Canvas下,可获得的放在一个Canvas下,虽然打断了合批,但是减少了网格重建的时间

五、代码上

  • 减少GC调用,合理使用值类型和引用类型(等到GC时才会释放),合理使用局部变量(频繁调用的作为全局变量避免不断产生垃圾)和全局变量,每帧调用的函数中限定只有需要分配时才使用某些函数
  • 对象池,对于频繁创建和删除的对象利用对象池操作,避免频繁的垃圾回收
  • 字符串,移步String和StringBuild的区别
  • 装箱会产生GC,Unity创建一个临时的Sytem.Object去包装值类型,临时的引用对象创建和销毁时产生了垃圾
  • 协程,注意嵌套协程
  • 使用异步加载避免一次性加载大量资源,使用AssetBundle释放不使用的资源

原文地址:https://blog.csdn.net/m0_67428211/article/details/143437145

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!