指标视图
通过指标视图,可以深入了解骨架在运行时的表现。
显示的指标是所有可见骨架的总和。
动画指标仅在动画模式下显示。
骨架
骨骼
骨架中的骨骼总数。
计算骨骼的世界变换会使用CPU,计算成本相对较低,但屏幕上有许多骨架时就会增加计算成本,每个骨架又有很多骨骼。例如,如果每个骨架有30个骨骼,50个骨架同时显示在屏幕上就需要计算1500个骨骼的世界变换。
在运行时,一旦通过操纵本地骨骼变换(通常通过应用动画)设置骨架姿势,就会计算每个骨骼的世界变换(典型代码)。通常在调用骨架updateWorldTransform时会发生这种情况。
在桌面上,数千个骨骼通常不是问题。在手机上,超过几千个骨骼可能是个问题。例如,在某些测试中,Nexus 4在帧速率降至每秒60帧以下之前可以处理大约2000个骨骼。
约束
骨架中的约束总数。
计算约束会使用CPU。计算成本相对较低,但当屏幕上有许多使用约束的骨架时计算成本就会增加。
有1个骨骼的IK约束计算成本非常低(典型代码), 而2个骨骼的IK需要更多运算(典型代码,尽管一些代码路径很少使用。
变换约束不需要太多运算,尽管它们应用于每个受约束的骨骼(典型代码)。
路径约束需要相当多的运算,具体取决于路径有多少顶点和受约束的骨骼(典型代码)。
插槽
骨架中的插槽总数。
插槽数量对性能的影响可以忽略不计。由于每个插槽可以有0或1个附件可见,因此在任何时候它都指示了可见的最大附件数量。
附件
总计
骨架中的附件总数。
附件总数不会影响渲染性能,对加载时间的影响可以忽略不计。
可见
骨架中可见附件的数量。
附件仅是可见不会影响渲染性能。例如,不会为边界框附件渲染任何内容。
顶点
所有可见附件的顶点数。
顶点数表示发送到GPU的几何体数量。
顶点变换
为所有可见附件变换的顶点数。
变换顶点会使用CPU。计算成本相对较低,但屏幕上有许多骨架时就会增加计算成本。顶点数和每个顶点有权重的骨骼数量决定了顶点变换的数量。
与骨骼类似,附件顶点需要从本地坐标转换到世界坐标(典型代码: 区域附件, 网格附件)。
三角形
所有可见区域和网格附件的三角形数。
三角形的数量表示有多少顶点指数被发送到GPU。
区域
以全尺寸绘制骨架时绘制的像素数。这包括透明像素和由于过度绘制而多次绘制的像素。
绘制的像素数表示使用多少GPU填充速率来渲染骨架。
裁剪多边形
凸面剪裁多边形数。如果剪裁附件顶点是凹面的,则会将它们分解为两个或多个凸面多边形。
最佳性能情况是每个剪裁附件都是凸面的,从而就产生一个剪裁多边形。多个剪裁多边形会增加剪裁三角形的数量。有关更多信息,请参阅裁剪性能。
剪裁三角形
可见剪裁附件剪裁的附件三角形数。
为了提高性能,最好的做法是剪裁尽可能少的三角形。有关更多信息,请参阅剪裁性能。
选择
选择一个或多个附件时,某些指标会显示两组数字。正斜杠前的数字表示选定的附件。正斜杠后面的数字表示所有附件。
动画
时间轴
当前活动动画的时间轴总数。
应用时间轴会使用CPU。应用单个时间轴的成本相对较低,但当许多骨架的每一帧都应用了动画时,时间轴的成本就会增加。此外,每帧还可能将多个动画应用于单个骨架。例如,当同时跑步和射击时,或者混合动画以进行交叉淡入淡出时。
在运行时,动画由许多“时间轴”组成。每个时间轴都有一个关键帧值列表。应用动画时,将应用动画的每个时间轴。时间轴会查看其列表以查找当前动画时间的关键值,然后使用这些值操作骨架(典型代码)。即使在第0帧处只有1个关键帧的时间轴,在每次将动画应用于骨架时仍会应用。
性能
性能之所以有趣,是因为它要么是一个大问题,要么根本就不是问题。只要性能可以接受,即使是在糟糕的硬件上运行的最差的应用程序也不需要优化。规则是:如果提高性能对用户来说并不明显,那么花在改进性能上的任何时间都是完全浪费的。把时间花在用户能注意到的事情上总是更好的。事实上,优化过多会降低动画的质量,使软件更加复杂和更难维护,因此不要进行不必要的优化非常重要。
这并不意味着在开发过程中应该忽略性能,只是应该优先进行最低限度的性能考虑,以避免性能问题。不然很容易走得太远并浪费时间,特别是当涉及到如此多变量时:
- 应用程序运行在什么硬件上,
- 除渲染骨架外,应用程序和游戏工具包完成的所有操作,
- 游戏工具包和Spine运行时如何执行渲染,
- 渲染多少骨架,
- 这些骨架是如何配置的,
- 绘制多少像素,
- 等等更多。
在设计Spine动画时,动画师不可能将所有这些都考虑在内并只提供表现良好的资产。而是应该做出合理的努力以避免浪费性能,例如仅使用预期变形所需的网格顶点数量。只有在出现性能问题之后,才做出额外努力来简化骨架。
性能依赖于如此多的变量,以至于无法概括指标视图中的哪些数字太高。如果你打算将性能提升到极限,则需要在各种硬件上使用实际骨架和应用程序的其余部分执行自己的测试,以了解特定环境中的极限。如果没有将CPU或GPU推到极限,那就没必要花时间担心性能或牺牲动画质量。
如果遇到性能问题,第一步是找出对性能影响最大的瓶颈,因为集中精力可以获得最大的收益。渲染Spine骨架时最常见的瓶颈是CPU使用率、填充率和绘制调用。
CPU使用率
当CPU使用率过高时,意味着应用程序使用的CPU太多,以至于渲染低于可接受的帧速率(通常低于每秒60或30帧)。CPU使用的最重要指标是骨骼、时间轴、顶点变换、约束和裁剪。如果过度使用,其中任何一个都可能成为问题。
使用权重可以极大地增加顶点变换的数量,这取决于顶点数以及每个顶点有多少骨骼有权重。使用修剪可以减少顶点变换的数量。
时间轴的数量会增加应用动画所需的处理时间。动画清理可以减少时间轴的数量。
剪裁是代价高昂的,应尽量避免,例如当过绘可使用其他图片进行遮蔽时。当使用剪裁时,它应该是凸面的,使用尽可能少的顶点,剪裁尽可能少的三角形。
除了降低骨架的复杂性之外,可能还有其他选择。如果你有许多骨架,可以在每帧中以循环方式仅更新其中一个子集,这可能是可以接受的。另一种选择是仅设置少量骨架的动画,然后使用这些姿势渲染大量骨架。
填充率
当GPU填充率耗尽时,这意味着你正在尝试绘制的像素超过GPU以可接受的帧速率绘制的像素数。每次绘制一个像素时,它都会计入填充率。即使像素是完全透明的,或者多次绘制相同的像素(称之为“过度绘制”)也是如此,例如附件重叠时。
解决填充率受限的方法总是一样的:少画一些像素。网格可用于避免绘制透明像素,尽管这可能意味着要在CPU上变换更多顶点。完全透明的像素仍会用完填充率,因此应该隐藏附件,而不是将其Alpha设置为零。有时,可以通过将过度绘制最小化的方式来构建图画,例如,使用单个较大的图片代替两个或更多重叠的图片。
绘制调用
请求GPU绘制可能是一项代价高昂的操作,因为在接受新的绘制任务之前,它可能需要完成正在执行的操作。如果请求绘制太多次,GPU将无法以可接受的帧速率完成所有绘制。
大多数游戏工具包都会批量处理尽可能多的几何体,因此请求GPU绘制的次数更少。通常当GPU需要从不同的纹理绘制时,需要刷新一批,所以使用纹理图集可减少纹理切换。对插槽使用混合也可能导致批量刷新。