使用Unity JobSystem模拟SplineMesh
概述
- 在数学学科数值分析中,样条(Spline)是一种特殊的函数,由多项式分段定义。样条的英语单词spline来源于可变形的样条工具,那是一种在造船和工程制图时用来画出光滑形状的工具。
- 在计算机科学的计算机辅助设计和计算机图形学中,样条通常是指分段定义的多项式参数曲线。由于样条构造简单,使用方便,拟合准确,并能近似曲线拟合和交互式曲线设计中复杂的形状,样条是这些领域中曲线的常用表示方法。
在Github上由Methusalah开发的SplineMesh展现了令人惊叹的效果,具体如下:
这些效果非常不错,但是如果用于移动端Runtime就性能不足了,经过分析发现他的运算集中在Unity的主线程上,对于这种运算密集类型的模拟,就可以使用JobSystem提供多线程的强力支持。
如何将SplineMesh转成JobSystem支持呢?
第一个步骤当然是先分析原算法确定以下一些东西:
有哪些数据,这些数据哪些是初始静态数据,哪里是动态临时数据
- Spline构成最基本的当然是一串节点,每个节点包括顶点位置和朝向
- 两个节点构成一个BezierCure
- 为了使用BezierCurve建模生成对应Mesh,则还需要按给定参数采样
Sample
模拟算法的有几个大块步骤,这些步骤里面哪些是需要多线程支持,哪些不需要,不需要多线程的步骤是否就一定不需要转成Job:
-
- 对BezierCurve采样
-
- 根据采样对Mesh进行弯曲操作
-
- 更新Mesh

以上这些在实际开始写代码之前就需要大体确定
- 更新Mesh
-
第二个步骤开始写代码,主要按以下三个小步骤来:
1. 构造数据类型
NativeSplineNodepublic struct NativeSplineNode { public Vector3 position; public Vector3 direction; public Vector3 up; public Vector2 scale; public float roll; public int index; }NativeBezierCurvepublic struct NativeCubicBezierCurve { public int stepCount; public int startIndexOfSample; public float length; public NativeSplineNode n1, n2; }NativeCurveSamplepublic struct NativeCurveSample { public Vector3 location; public Vector3 tangent; public Vector3 up; public Vector2 scale; public float roll; public float distanceInCurve; public float timeInCurve; public Quaternion rotation; }