性能优化讲座

性能优化讲座

——摘自维塔士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/性能优化讲座/
作者
Enlight3n
发布于
2024年9月30日
许可协议