解算器参考

本主题详细说明了解算工具包中的一些自定义解算器设置。若要从技术层面深入了解并行解算以及有关自定义解算器的背景信息,请参见使用并行 Maya

曲线管理器解算器

可以使用曲线管理器解算器在解算图中包含其他节点。这样,您便可以:
  • 使用并行解算和 GPU 变形来操纵其他节点,从而在交互式操纵期间提高响应速度
  • 减少解算图重建,因为静态节点可能已包含在解算图中
为了高效地实现这些优势,曲线管理器解算器执行两个主要任务:
  • 在解算图构建期间,它将从附加节点触发脏传播,以使它们包含在图表构建过程和生成的解算图中
  • 在场景解算期间,它将处理部分附加节点的解算以维持性能,因为它们不需要解算。
为了说明此结果,下面来比较一个场景中的以下三种情况:
  1. 所有控制器只有一个关键帧(即,静态动画曲线)。由于生成的动画曲线是恒定的,因此其被视为静态的,并且不包含在解算图中。播放没有要解算的内容。
  2. 所有控制器具有值不同的关键帧(即,已设置动画的曲线)。因此,它们将包含在解算图中,并且播放将解算所有内容。
  3. 所有控制器只有一个关键帧(即,静态动画曲线),但曲线管理器解算器在解算图中预填充这些静态曲线。

在第三种情况下,我们尝试通过采用一个已设置为在操纵控制器时进行并行解算的解算图来利用曲线管理器解算器。

下表汇总了这些情况之间的差异。
情况 解算图中的节点数 播放 EM 操纵 设置关键帧时重建
静态曲线 + 曲线管理器关闭 最低 最快
已设置动画的曲线 最高 最慢
静态曲线 + 曲线管理器打开 最高 中间

总而言之,通过采用已填充节点的解算图,曲线管理器解算器可从中受益,因此在对交互式操纵进行解算时响应速度高,而对于在播放期间恒定的节点,成本则会尽可能低。可以使用以下命令激活它:

cmds.evaluator(name="curveManager", enable=True) cmds.evaluator(name="curveManager", configuration="forceAnimatedCurves=keyed")

forceAnimatedCurves 的可用值包括:
  • none:在解算图中不强制使用任何曲线。
  • controller:在解算图中将强制使用连接到控制器节点的曲线。这基本上属于广义的控制器概念。
  • keyed:在解算图中将强制使用已设置关键帧的静态曲线(即具有一个或多个同值关键帧的曲线)。
  • all:在解算图中强制使用所有曲线。
可以使用另一个选项 forceAnimatedNodes
  • none:在解算图中不强制使用任何节点。
  • forcedAnimatedAttribute:在解算图中将强制使用以下节点:其强制已设置动画的属性设置为 true。

这样可以添加具有布尔动态属性的标记节点。默认情况下,此属性的名称为 forcedAnimated。如果某个节点上存在此属性且设置为 true,则该节点将添加到图表中。此属性的名称可以使用 forcedAnimatedAttributeName 选项进行控制。

默认情况下,曲线管理器解算器会尝试跳过对图表静态部分的解算。出于调试或性能测量目的,可以禁用此优化:

cmds.evaluator(name="curveManager", configuration="skipStaticEvaluation=disable")

变形器解算器

变形器解算器实现了“GPU 覆盖”(GPU Override)选项。

为了提高场景性能,变形器解算器将变形器节点链的 CPU 解算替换为 GPU 解算。使用 deformerEvaluator 命令可检索有关场景中支持的变形器节点的节点链信息,或者了解特定节点不受支持的原因。使用解算平视显示仪 (HUD) 选项可查看“GPU 覆盖”(GPU Override)支持的顶点数。

限制

  • 每个变形链均必须以没有输出连接的网格节点结尾。这意味着,若要受支持,网格不能具有 pointOnPoly 约束、毛囊或其他任何输出连接。
  • 仅支持 blendShape、skinCluster、簇、softMod 和调整节点以及特定功能。

动力学解算器

动力学解算器用于对动力学相关节点(通常具有复杂的解算要求)正确解算。尽管该解算器支持一些配置选项,但您往往不会与其进行交互,因为默认行为通常是可接受的。

动力学解算器承担以下三项主要职责:
  1. 将簇中要由动力学解算器进行解算的动力学相关节点分组在一起。
  2. 管理此类簇的解算,使其遵循动力学相关节点所需的复杂解算规则。
  3. 在检测到不受支持的设置时禁用并行解算

限制

  • 在某些情况下,使用解算管理器(进而使用动力学解算器)的动力学模拟生成的结果与基于 DG 的解算不同。但是,无论动力学模拟发生在 Maya 视口中还是发生在 Maya 批处理中,这些结果均一致。
  • 动力学解算器不支持旧版动力学(例如,旧版粒子和流体)。如果在场景中找到不受支持的动画节点,则会禁用并行解算。

有关动力学解算和不受支持的功能的详细信息,请参见使用并行 Maya

冻结解算器

冻结解算器可用于从解算中排除解算图的子区域。它适用于冻结属性,允许使用由解算器配置设置的规则将冻结状态传播到相关节点。仅当您熟悉 DAG 和解算图中的连接和传播概念时才使用冻结解算器。否则,请使用更简单的不可见性解算器。

解算管理器不对已将冻结属性设置为 True 的任何节点进行解算。如果启用了冻结解算器,则会根据与已启用选项对应的规则阻止对相关节点解算。

冻结解算器的运行过程分为三个阶段:

  1. 收集标记为不可见的节点和标记要冻结的 displayLayers 选项。
  2. 通过解算图向外传播冻结状态(根据下游上游选项的值)。
  3. 分析冻结节点,以便跳过没有其他解冻输入的下游节点。在下文介绍的限制中,该步骤称为运行时操作。

限制

  • 若要冻结解算器对受影响的节点禁用解算,必须至少将一个冻结属性设置为“True”。实际上,这主要用于显示层,以便将节点作为一个整体冻结。
  • 如果冻结属性或任何用于定义相关隐式节点以便冻结(例如,不可见性)的属性已设置动画,则该解算器不会将其从解算中移除。这些属性仍会进行调度,但是只有运行时选项才有助于避免进行不必要的解算。
    注: 运行时选项不会修改解算器操作,而是修改节点的解算调度。您在解算器信息中将看不到受此选项影响的节点,例如,cmds.evaluator( query=True, clusters=True, name='frozen' ) 的输出。
  • 除非循环的所有输入均已冻结,否则该解算器不会冻结循环成员。这是因为循环作为一个整体进行解算,冻结循环的单个成员毫无意义。

有关更详细的分析,请参见使用并行 Maya

不可见性解算器

不可见性解算器通过标识所有为了对视口进行建模而被视为不可见的 DAG 节点,防止对不来自可见 DAG 节点上游的任何节点进行解算。若要确定要渲染的节点中有哪些不可见,该解算器将考虑以下任意情况:
  1. 一个节点的“可见性”(Visibility)属性设置为 false。
  2. 一个节点的“绘制覆盖可见性”(Draw Override Visibility)属性设置为 false,“启用绘制覆盖”(Draw Override Enabled)属性设置为 true。
  3. 显示层中有一个节点导致选项 2(参见上文)为 true。
  4. 一个节点的“IsIntermediateObject”属性设置为 true。
  5. 一个节点中每条上升到根的路径至少遇到一个至少符合上述一种情况的节点。(在这种情况下,就实例化而言,每条路径都很重要。必须渲染节点的每条实例路径,使其对上方的节点之一不可见。)

任何仅驱动不可见节点的节点均已冻结,不会进行解算。(可见的 DAG 节点被视为驱动本身,因此始终会进行解算。)

在大多数情况下,启用不可见性解算器最终将导致更改在场景中不可见,并适度或显著提高播放速度(具体取决于不可见的对象)。

不可见性解算器不适用的情况

不可见性解算器仅仅根据节点的可见性状态定义“可见”,因此如果 UI 或插件代码要求对不可见节点解算,请勿使用不可见性解算器。

限制

  • 不可见性解算器仅考虑静态可见性。按照上述定义,设置了可见性动画(即,选中的所有属性均已设置动画)的任何节点都视为始终可见。
  • 如果存在循环,则循环中的一切均必须处于不可见状态,否则循环不会冻结。
  • 如果节点已实例化且至少有一条可见路径向上,则将对所有向上的路径解算(即,使两个实例之一不可见无效果)。