指标视图

通过 指标 视图可深入了解骨架在运行时的执行情况。这里显示的指标包含所有可见骨架的汇总。

骨骼

骨架中骨骼的总数。

在运行时,一旦骨架姿势受到骨骼的局部变换操作(通常由应用动画效果造成),将会计算每个骨骼的世界变换(典型代码)。通常这在调用 Skeleton#updateWorldTransform 时发生。

计算骨骼的数量变化会占用 CPU。这通常消耗不多,但如果屏幕上有许多骨架,每个骨架又有多个骨骼,就会形成累积效应。例如,如果每个骨架有 30 个骨骼,而 50 个这样的骨架同时在屏幕上显示,那么需要计算骨骼 1,500 次世界变换。

对于台式机,数千个骨骼通常都不是问题。但对移动设备,一两千个骨骼就会出错。例如,在某些测试中,Nexus 4 能处理 2000 个骨骼,之后帧速率会跌至每秒 60 帧以下。

约束

骨架中约束的总数。

Spine 支持 1 或 2 个骨骼的 IK 约束。在运行时,1 个骨骼 IK 约束消耗资源不多(典型代码)。2 个骨骼 IK 会增加大量运算(典型代码)。

计算 IK 约束会占用 CPU。这些计算量相对较小,即使对于 2 个骨骼 IK,但如果屏幕上有多个骨架使用 IK,会形成累积效应。

插槽

骨架中插糟的总数。

插槽的数量表示骨架的复杂度,但对性能影响甚微。由于每个插槽可以有 0 或 1 个可见附件,所以这也表示在给定时间内可见的最大附件数。

时间轴

当前激活动画的时间轴总数。

在运行时,动画是由数个“时间轴”组成。每个时间轴都有一个关键帧值列表。当应用动画效果时,会应用到动画的每个时间轴。时间轴遍历其列表,查找当前动画时间的关键帧值,然后用这些值操作动画(典型代码)。每次将动画应用到骨架时,即使在第 0 帧只有 1 个关键帧的时间轴也会被应用动画效果。

应用时间轴会占用 CPU。应用单个时间轴消耗不多,但当多个骨架将动画应用到每一帧时,会形成累积效应。而且,可能将多个动画应用到单个骨架的每一帧。例如,如果同时跑步并射击,或者混合动画进行交叉淡入淡出。

总计

骨架中附件的总数。

附件总数不影响渲染性能,对加载时间影响甚微。

可见

骨架中可见附件的总数。

如果附件仅仅可见,则不影响渲染性能。例如,边界框附件不渲染任何内容。

顶点

所有可见区域和网格附件的顶点数。

顶点数表示有多少几何形状发送给 GPU。

顶点变换

所有可见区域和网格附件变换的顶点数。

与骨骼一样,区域和网格附件顶点需要从局部变换成世界坐标(典型代码:区域网格, 及加权网格)。

变换顶点会占用 CPU。其计算量消耗不多,但如果屏幕上有多个骨架,会形成累积效应。

三角形

所有可见区域和网格附件的三角形数。

三角形数表示有多少顶点索引发送给 GPU。

区域

全尺寸绘制骨架时所绘制的像素数。这包括透明像素绘制和由于过度绘制而多次绘制的像素。

绘制的像素数表示将多少 GPU 填充率用于渲染骨架。

选中

当选中一个或多个附件,会显示两组指标数字。正斜杠前的数字为所选附件。正斜杠后的数字为所有附件。

性能

性能这个问题很有意思,因为通常它并不重要。只要性能可接受,即使在最糟糕的硬件上运行最差的应用程序,也不需要优化。原则是:如果提高性能玩家也毫无察觉,那么提高性能完全是浪费时间。还不如将时间花在吸引玩家注意的方面。

这并不意味着在开发期间应忽略性能,只需要提前稍加注意即可,避免出现性能问题。开发人员很容易过多担忧,浪费时间,尤其是包含这么多变数:

  • 应用程序运行在什么硬件上,
  • 应用程序执行的所有任务和渲染骨架以外的游戏工具包,
  • 游戏工具包和 Spine 运行时如何执行渲染,
  • 渲染多少骨架,
  • 如何配置这些骨架,
  • 绘制多少像素,
  • 等等。

在设计 Spine 动画时,动画制作者很难面面俱到,只能做到交付运行正常的产品。应该努力避免浪费性能,如对必要的变形使用必要的网格顶点。只有出现性能问题时,才需要付出额外努力以简化骨架。

性能依赖于许多变数,不可能在 指标视图中概括哪个变数过高。如果您打算将性能发挥到极限,那么需要使用实际骨架在各种硬件上进行测试以了解特定环境下的极限。如果您不打算将 CPU 或 GPU 发挥到极限,那么就没必要浪费时间担心性能或牺牲动画的质量。

如果确定有性能问题,那么第一步是确定对性能影响最大的瓶颈,因为集中处理这一问题能取得最大效果。渲染 Spine 骨骼时最常见的瓶颈是 CPU 使用率、填充率和绘制调用。

CPU 使用率

如果 CPU 使用率过高,这意味着应用程序占用过多 CPU,以至于渲染的帧速率低于可接受水平(通常为 60 或 30 帧每秒)。CPU 使用率最重要的指标是骨骼、时间轴、顶点变换和约束。过多使用其中任何一项都会造成问题。

除了降低骨架复杂度以外,还有一些选择。如果有多个骨架,那么可以每帧只更新一部分,使用轮转的方式。另一种选择是仅让少数骨架实现动画效果,并使用这些姿势来渲染大量骨架。

填充率

如果 GPU 填充率耗尽,这意味着您在试图绘制的像素高于 GPU 可接受的帧速率。每次绘制像素时都会计算填充率。即使像素完全透明,或者多次绘制同一像素(这称为“过度绘制”)仍然如此,如附件重叠。

填充率受限的解决方案只有一个:减少绘制的像素。可以用网格来避免绘制透明像素,尽管这可能意味着在 CPU 上要做更多顶点变换。完全透明的像素仍然占用填充率,因此应该隐藏附件,而不是将其阿尔法值设置为零。有时可以用减少过度绘制的方式来创建作品,例如用单个较大的图片替代两个或多个重叠图片。

绘制调用

让 GPU 进行绘制是一项耗费资源的操作。如果要绘制多次,GPU 可能无法以可接受的帧速率完成绘制。

大多数游戏工具包会将尽可能多的几何形状批处理打包,从而减少 GPU 绘制次数。当 GPU 需要从不同纹理绘制时才会刷新批处理包,因此使用 纹理图集 来减少纹理切换。对于不使用 预乘阿尔法 渲染的游戏工具包,对插槽使用累加混合也可能造成批处理包更新。

下一节:轮廓 上一节:Mesh Tools