为Nintendo Switch优化香肠体育俱乐部

  • 在PC或其他控制台平台上并不昂贵的某些东西在Switch上也很昂贵。 空检查,Vector.magnitude / sqrMagnitude,Quaternion.Euler,Quaternion.LookRotation,设置transform.position / rotation(虽然可以确定localPosition / localRotation),设置body.velocity / angularVelocity都是我不得不减慢滚动速度的原因。
  • 在开发控制台时,在设备上进行速度测试非常重要。 他们的低级库与我的开发PC的工作方式不同,因此我保留了第二个项目(大部分为空),在这里我测试了Switch上的性能和功能的想法,而不必等待游戏的10分钟构建/部署时间。

垃圾收集

  • GC.Collect将使您的帧速率变得混乱,如果创建过多的垃圾,则会自动触发它。
  • 您的目标是在活动场景中创建零垃圾。 如果您使用协程或大多数资产商店插件,那实际上是不可能的,但是您的Update调用应该是无垃圾的。
  • 在游戏开始时,分配大量内存以使GC的集合更大,因此自动清除的频率会降低。
  • 致电GC.collect在低帧率不明显的地方(在场景变化,打开菜单等)中收集自己。
  • 对象池是必须的,因为创建和销毁对象会花费很长时间并且会产生垃圾。 我推荐这个旧但仍然不错的系统:https://github.com/UnityPatterns/ObjectPool/tree/master/Assets/ObjectPool

物理

  • 再次,熟悉Unity的探查器。 有一个Physics小部件,它显示每帧有效动态/运动学,静态碰撞器,刚体,触发器重叠,有效约束和接触的数量。 对于我的游戏而言,具有150多个动态,20个触发重叠或每帧500个接触是问题的征兆。
  • 第一步很简单,就是确保您拥有一个理智的物理碰撞矩阵。 确保不应该/不能碰撞的东西不检查碰撞。
  • 许多大型触发器非常危险,并且会与很多东西重叠,从而增加物理时间。
  • 碰撞是一个指数级的问题,因为所有对撞机都会与其他所有对撞机发生冲突。 优化物理的最简单方法之一是关闭/删除不需要的对撞机或物理对象。

渲染图

  • 再次! 熟悉Unity的探查器。 使用“渲染”小部件,您可以实时查看每帧发生了多少绘制调用,以及动态,静态批处理了多少绘制调用以及实例化了多少对象。 也有关于视频内存的信息,但是我不必担心。
  • 还要检查“帧调试器”,它显示了该帧的所有渲染步骤的分步排序列表。 它甚至按渲染队列分组,并显示每个对象的不同摄像机,图像效果和批处理/实例计数。 关于优化,此工具最适合解决批处理和实例化问题。
  • 透支是渲染时间的杀手。 对于放置在彼此顶部的每个混合的alpha粒子四边形或网格,需要再次绘制占用的像素。 即使在交换机的1280 x 720分辨率屏幕上,该成本也会迅速增加。
  • 您可以使用场景视图中的渲染类型下拉覆盖设置检查覆盖。 另外,如果您转动相机,突然游戏突然停止,那可能是透支了。
  • 类似地,具有许多纹理读取和指令的昂贵着色器可以产生乘法效果。 现在,相同数量的像素需要花费两倍的绘制时间,因为您要在GPU上抛出两倍的指令。 这很难从Unity进行调试,但是我使用Tegra Graphics调试器已经成功地检查了哪些着色器比内置着色器执行更多的操作:https://developer.nvidia.com/tegra-graphics-debugger

最后的想法

  • 您的时间比帧时间更重要。 有时,您会听说或发现某种方法来稍微改善整个游戏的性能。 但是,请确保测试该优化实际上会返回足够的时间来证明工作合理性。 很多时候,我发现一些小的优化并浪费了一天的时间在整个游戏中应用该课程,发现我只获得了0.02毫秒的时间。
  • 在构建过程中添加调试命令以测试设置。 如果禁用这些玩具中的一半,我将获得多少物理时间? LT + RT +Y。如果没有图像效果,我将获得多少渲染时间? LT + RT +X。
  • 警惕在重写逻辑,更改碰撞矩阵以及删除/简化对撞机时将创建的错误。 它们将很多,并且大多数将很小而不会立即注意到。 质量检查是您的朋友。
  • 注意依赖黑盒插件,因为它们可能会遇到无法解决的性能问题。