并行处理第 2 部分

之前提到 vex 本质上是并行的,同时在所有点上运行你的代码。这意味着有些棘手情况。假设根据当前点的数据删除另一个点。如果另一个点,或者另外 500 个点,都在并行运行,碰巧都想删除同一个点怎么办?如果 2 分法试图改变三分之一的颜色,哪一个获胜?如果制作 2​​0000 点,同时尝试删除 1000 点,会怎样?

为了确保并行执行可靠且安全地运行,vex 将操作分组在一起并分批运行。geo属性的所有读取是一起完成的,创建新几何体是一起完成的,新几何体的属性设置是一起完成的,几何体的删除是一起完成的。这些运行有一个特定的顺序,但因为我不记得了,所以我尽量不编写期望删除在读取之前完成的 vex,反之亦然。不熟悉此函数批处理的艺术家经常尝试编写 vex,它会在第 1 行创建点,在第 2 行删除其他点,在第 3 行设置属性,在第 4 行读取属性,在第 5 行删除更多几何体等等,当它不起作用时会感到惊讶。

我目前的策略是让 Vex 尽可能简单。我的大部分 Vex 都在 10 行以下,更重要的是倾向于做以下三件事之一;设置属性,创建geo,删除geo。可以在 Vex 中同时执行所有 3 项操作,但如前所述,您必须非常确信执行顺序不会以意想不到的方式影响事情。我没有那么自信,所以更倾向于谨慎行事。:)

这是一个正在进行的工作列表,从简单的 vex 并行性到更复杂的任务。还没有真正想到一个好的方法来解释如何不接近 Vex,继续思考……

  1. 当前点上的属性设置当前点上的属性 (@Cd = @P) 干净且快速。
  2. 当前点上的属性驱动函数设置当前点上的属性 (@Cd = noise(@P)) 干净、快速且功能强大。有很多 Vex 函数可以玩!
  3. 当前点 ( @Cd = point(0,’P’,4) ) 上另一个点设置属性的属性开辟了geo可以对其他geo做出反应的技巧。
  4. 来自另一个点的属性驱动函数在当前点上设置属性(@Cd = noise(point(0,’P’,4) ))),还有更多技巧
  5. 根据位置 (nearpoints()) 或属性 (findattribval​​()) 访问点列表,然后依次查看它们的属性,打开更多有趣的技巧
  6. 使用点云查找从其他点访问属性的过滤结果超出了技巧的深层次
  7. 您可以在开始 Vex 之前通过准备数据来模拟查找附近的点,例如,attribpromote/demote 可用于平均共享基元的点之间的属性
  8. 当您需要从其他事物中查找数据时,从具有不同属性的相同网格中获取数据会很快(请参阅下一节)
  9. 从其他点查找属性以在当前点上设置属性通常更清晰,而不是相反(即,根据当前点在其他点上设置属性)
  10. 同样,创建点并在这些新点上设置属性可能会变得混乱。并非不可能,但通常更容易将其分成两场 Vex;在一次 Vex 中创建新geo,在第二次 Vex 中修改
  11. 有时您会遇到无法清晰地映射到并行工作流中的问题。没关系; 您可以将 Vex 设置为“detail”模式,现在 Vex 只运行一次,而不是在每个点上自动运行。因此,您可以创建一个 for 循环来访问每个点,让您完全控制(与 python/mel 相比仍然可以很快),但它肯定比使用并行处理慢。
  12. 虽然以上所有内容(以及本页的大部分内容)都假设您正在处理点,但请不要忘记您也可以对顶点和图元进行 Vex。