Unity性能优化汇总

UWA | 致力于游戏VR和AR应用提供项目研发解决方案 | 简单优化、优化简单 | 侑虎科技 (uwa4d.com)

Unity游戏开发 - CPU优化篇 - 知乎 (zhihu.com) 

《小米超神》技术总监王啸予:重度MOBA的优化之路 - UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 (uwa4d.com)

Unity基础:DrawCall从入门到精通 - 知乎 (zhihu.com)

Unity线上技术大会干货盘点(2020)-《黑暗之潮》中次时代技术的应用经验及技术 - 知乎 (zhihu.com)

“所见即所渲”,西山居新作《解限机》这样使用Virtual Geometry - GameRes游资网 

 

1.网络同步方面的优化

 

2.CPU方面的优化

1.代码方面的优化

1.降低GC,避免卡顿

[笔记] Unity3D 优化:C#脚本 - 知乎 (zhihu.com)

Unity GC 学习总结 - 知乎 (zhihu.com)

2.通过分帧来优化卡顿

为了防止卡顿,所以把大量计算分帧执行,例如总耗时需要50毫秒的计算,分到10帧去执行,那么每帧只占用5毫秒的时间,那么就不会导致卡顿。 

首先获取当前时间,然后执行逻辑,再次获取当前时间,如果两次时间超过了分配的执行时间,则将剩余的逻辑放到下一帧执行。

最常见的是需要加载创建大量的对象,如果在一个for循环里去执行,那么这一帧肯定会很卡,消耗大量计算。可以分成多帧完成。分帧的思想有点类似Unity的协程,都是通过一个单线程来模拟异步操作。

参考:【工具类】Cocos 分帧执行函数 - gamedaybyday - 博客园 (cnblogs.com)

3.LUA性能分析器:

jeason1997/Miku-LuaProfiler: Unity lua性能分析器 (github.com)

  2.降低DrawCall

    1.GPU Instancing

    2.GPU动画:GPU动画 - JeasonBoy - 博客园 (cnblogs.com)

  3.降低IO造成的卡顿

资源加载策略:判断缓存中没有,再去加载本地,本地没有,再去判断下载目录,下周目录没有,再去联网下载。加载资源的时候,有些比较大的资源需要异步加载,避免卡住。

  4.物理引擎优化

    1.修改物理引起的更新方式会ScriptUpdate而不是默认的FixedUpdate,只在需要的时候更新物理引擎

    2.降低物理更新频率(detal)模拟步长(step),渲染依旧保持30/60帧平滑,但是物理模拟改为15帧左右,步长约长,模拟越粗糙,但性能消耗越低,根据需求取舍

    3.不要用Mesh Collider,用简单的Box Collider取代

    4.分层处理碰撞:通过 Physics.IgnoreLayerCollision 函数可以忽略特定层之间的碰撞,从而减少不必要的碰撞检测。

    5.当场景需要碰撞检测的物体比较复杂的时候,可以隐藏一些范围外的物体,降低物理引擎八叉树/四叉树的复杂度,加快碰撞检测速度

    6.使用 Raycasting 和 Overlap 检测代替复杂的碰撞检测,例如子弹是否集中物体,改成不停的在子弹前进的头部发一段射线去检测,而不是依靠子弹自身的碰撞体

 

  5.UI方面,UGUI的优化方式参考:Unity 优化之UGUI (2017年版【一】)

1.UGUI动态图集降低DC:

比如一个英雄可以学习50个技能,同时存在3个,那么把这50个技能打成一个图集是不可能的,打成多个图集,有需要同时加载多个,造成额外DC,

那么就可以用动态的方式,将这个英雄用到的所有技能,在游戏运行时动态打成一张图集,这样就只有一个DC了。

参考:Unity3D 性能优化:运行时动态图集 - 知乎 (zhihu.com),图集合并算法:Unity – generate SpriteSheets at runtime! – Da Viking Code

  6.合批的触发方式

1.3D场景合批:

     参考:关于静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析_真像大白阿的博客-CSDN博客Unity中的各种合批 - JeasonBoy - 博客园 (cnblogs.com)

相同的材质(贴图一样),相同的PASS,网格不同,会合在一起处理。 比如有10个模型,形状都不一样,但是他们使用同一个材质,并且这个材质只有一个PASS,则是一个合批。
但如果这个材质是2个Pass的,则瞬间变成10*2=20个批次。不同材质,不同的PASS,都会打断合批。 但是定点数有限制,达到一定程度后,会变成2个合批。

    • 静态合批:相同材质球的物体设置为static,打包时会合批成一个mesh,包体会变大,运行时内存会增加
    • 动态合批:相同材质球,对象可见,运行时会自动合批,增加CPU消耗,但降低了DC。(C#里用Renderer.material会生成一个材质实例,打断合批,改用ShareMaterial,一个Shader有多个PASS也不能合批)
    • GPU Instancing:GPU Instance 深入浅出 - 知乎 (zhihu.com) (如果材质球支持GPU Instancing的话,勾上,然后相同材质相同网格的物体就会合成一个批次。)
    • SRP Batcher:SRP Batcher 原理及应用_zionFisher的博客-CSDN博客(URP/HDRP专用,不能降低DC,可以不同网格,不同材质,但需要同样的Shader变体,主要是降低着色器的前置设置工作)

     GPU Instancing 跟 SRP Batcher只能存在其中一个。

2.UI合批

参考:官方UGUI优化指南, Unity3D 性能优化:UI的合批 图集和优化 - 知乎 (zhihu.com)
图片,相同材质,相同纹理,合成一批。如果一张不同批次的图片,穿插在两张同批的图片之间,则打断他们的合批。
文字,只要在图片之下,则打断该图片的合批,text的网格和image的网格重叠导致计算的UI深度值发生了变化,于是按照深度、材质、贴图、UI层级队列由小到大排序排序后得到的UI队列也变了,

就是重叠后两个image元素在待合批的队列中变得不相邻了,就无法合批处理

  

  

 

 

3.GPU方面的优化

游戏开发-unity 游戏性能优化_s178435865的博客-CSDN博客

 

4.1内存优化

【技术分享】《解限机》中的虚拟几何体技术 - 文章 OpenHarmony开发者论坛

Unity3D游戏内存瘦身指南: UI优化是关键_unity3d 天空盒 内存 占用很大-CSDN博客

 

4.2显存优化

虚拟纹理:当需要加载超大纹理的时候,可以通过虚拟纹理技术动态的加载纹理的某一部分,避免爆显存 Sparse Virtual Texture (虚拟贴图技术)-CSDN博客 

 

5.包体优化

 缩小包体体积,资源放在ab包,扫描并排除多次打包文件。纹理压缩,排除无用文件。

 

6.工具相关

jenkins打包速度优化

posted @ 2022-11-21 11:47  JeasonBoy  阅读(352)  评论(0编辑  收藏  举报