vivominigame / issues

vivo小游戏问题反馈和统一回复入口
13 stars 9 forks source link

Unity转vivo小游戏常规性能优化建议 #270

Open xinyangcuncun opened 3 months ago

xinyangcuncun commented 3 months ago

手动关闭物理模块

如果游戏中没有使用到物理模块,应关闭Auto Simulation选项,该选项默认开启,会导致不必要的性能浪费。 Edit->Project Settings->Physics->Auto Simulation

调整物理计算频率

在Unity自带的物理引擎中,物理模块运行在FixedUpdate.PhysicsFixedUpdate中,FixedUpdate的时间间隔也代表这物理模块的时间间隔 Edit->Project Setting->Time

Fixed Timestep:决定了FixedUpdate的更新间隔,该值越大,则间隔越大 Maximum Allow Timestep: 该值会对FixedUpdate的执行此时进行限制 适当调整Fixed Timestep与 Maximum Allowed Timestep降低计算频率

选用合适的碰撞体类型

对于物理碰撞精度要求不高时,可以考虑选用开销较低的碰撞体类型,以下是各种常用碰撞体的开销排序 sphere Collider(最低) capsule Collider box Collider Mesh Collider(开销最大,且远大于前3种)

UI

关于UI的优化可以参考 https://www.youtube.com/watch?v=EK8sX8oCQbw Unity官方的优化建议,从12:46开始介绍UI模块的优化 https://learn.unity.com/tutorial/optimizing-unity-ui#5c7f8528edbc2a002053b5a1 https://mp.weixin.qq.com/s?__biz=MzI3MzA2MzE5Nw==&mid=2668924034&idx=1&sn=7887d7b8ca3e1b303db41d338d753755&chksm=f1c920f0c6bea9e6ee2fda67181a41d52d486a0eff1d6109b17324f856107c48f25be21f2a53&cur_album_id=1950061584714661889&scene=190#rd

使用图集

sprite Atlas是一个图集打包工具,使用Sprite Atlas 减少drawcall 减少包体大小 减少图片运行时的加载时间 如果游戏中大量使用2DSprite,可以考虑使用(Unity - Scripting API: SpriteAtlas),可以参考Introduction to the Sprite Atlas - Unity Learn

合批与Canvas重建 合批的规则可以参考:

https://zhuanlan.zhihu.com/p/339387759 https://www.cnblogs.com/moran-amos/p/13858990.html 关于UI合批,对于同一深度,Unity会尽可能将相邻的使用相同材质和贴图的元素合批。 Canvas重建可以参考: https://zhuanlan.zhihu.com/p/448293298 Canvas中的所有元素最终会合并成一个SharedMesh,修改 Canvas中的任意元素会导致整个Canvas重建,一个比较直接的优化方式是动静分离,即活动的元素放在一个Canvas下,不可活动的元素放在另一个Canvas下。

Overdraw相关

UI是在透明队列中渲染的,任何一个fragment都会计算所有覆盖在该fragment上的所有层级,而大多数情况下只有最上层的才是真正需要的,会导致不必要的消耗。 对于OverDraw检测可以使用Unity内置 Scene->Shading Mode->Overdraw 也可以使用外部的检测工具如RenderDoc,可以参考 https://docs.unity3d.com/2021.3/Documentation/Manual/RenderDocIntegration.html

一些配置上的小建议

如果某个Image组件不需要与点击事件交互,那么应该关闭Raycast Target选项。 需要Raycast交互的元素,不要放在过深的层级里面,原因是Raycast将暴力遍历根部的所有Transform层级,并要检测与Transform关联的所有组件,以寻找某个组件是否实现了ICanvasRaycastFilter。一个优化方法是在某个偏浅的节点接收Raycast,再将信息传递到某个偏深的节点。 Text组件尽量避免开启Best Fit选项,这会导致在运行时实时计算最佳大小。 尽量避免使用mask组件,会导致额外的drawcall,如果避免不了,可以考虑使用Rect Mask 2D,该组件不会影响合批,但是只支持矩形Mask。

减少DrawCall

可以参考文档 https://docs.unity3d.com/2021.3/Documentation/Manual/optimizing-draw-calls.html 其他如LOD、光照、纹理等优化方案,可以参考详细文档优化Unity WebGL的渲染性能

启用WebGL2.0

WebGL2.0支持延迟渲染,可能会对多光源场景有较大优化。 WebGL2.0支持GPU Instancing,可以进一步合并DrawCall。 WebGl2.0具体可见WebGL2.0渲染支持说明

SRP Batcher

SRP Batcher只能运行在WebGL2.0上 SRP Batcher将材质信息持久化存在显存中,同时批量处理了两个DrawCall之间的绑定操作,大大减少了CPU的消耗,更多信息可以参考官方文档 https://docs.unity3d.com/2021.3/Documentation/Manual/SRPBatcher.html

定制小游戏的 URP 管线

参考 https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/CustomURP.md