性能优化讲座
性能优化讲座
——摘自维塔士Switch性能优化讲座 2024.8.22
项目准备阶段
项目准备阶段,监测游戏在主平台的性能情况,同时分析Switch平台的性能瓶颈。
- 监测主平台游戏性能,与客户商定性能优化的分工合作,减少或避免双方在不同平台上的优化工作。
- 剖析Switch游戏的性能表现,在技术文档中定位性能瓶颈,提出实施流程以及优化策略,与客户商定。
内存瓶颈
- 游戏开始时加载了过多数据表,导致很多不必要的资源被加载进内存并常驻。
- 模型面数过高且LOD层数过多。
- 声音资源的内存占用超过600M。
GPU瓶颈
- Grass造成了Vertex Bound并且Overdraw相当严重。
- 多个玩家角色同时渲染造成GPU Bound。
- 默认的Deferred渲染管线在Switch上很昂贵,测试地图的GPU消耗超过了85ms。
CPU瓶颈
- Drawcall超过8000,计算物体可见性耗费44ms。
- 计算动态阴影耗费11ms。
- 角色移动时物理和动画计算过于昂贵。
- 低先级的小物件被设为Always Tick。
- UI界面的重绘每帧会消耗5ms以上。
项目开发阶段
选定一张目标地图进行优化策略验证。
- 选定一张地图作为试验范围,验证主要优化策略能否达到预期目标。同时在性能优化和视觉表现上找到平衡点,与客户商定。
- 先着手内存优化工作,并行修复严重的游戏显示问题。内存优化完成后,同时进行GPU和CPU优化。
实施内存优化
- 按需加载资源,减少常驻内存物体的数量。
- 根据平台硬件性能,减少模型的精度和LOD层数。
- 优化声音质量等级,优先使用Streaming方式加载声音资源。
实施GPU优化
- 优化Grass模型并调整密度解决Vertex Bound问题;同时开启Early-z解决Overdraw问题。
- 限制最大可显示玩家数量,不可见的玩家以名字标识。
- 使用Mobile Deferred优化渲染管线。
实施CPU优化
- 引入DetailMode在Switch上排除低优先级物件,并设置可见距离来裁掉远处的小物体。
- 减少室内动态光源数量,调整TOD更新的时间间隔。
- 异步物理计算:按距离和可见性调整角色更新频率。
- 减少每帧需要Tick的物件数量:按事件触发Tick,成组Tick,屏蔽低优先级物件Tick。
- 使用Global invalidation缓存UI以减少重绘界面数量。
- 优化声管中的特效
性能优化讲座
https://enlight3n.github.io/2024/09/30/UnitySummary/性能优化讲座/