使用Unity JobSystem模拟SplineMesh

发布时间: 2022年05月09日阅读数: 2

概述

  • 在数学学科数值分析中,样条(Spline)是一种特殊的函数,由多项式分段定义。样条的英语单词spline来源于可变形的样条工具,那是一种在造船和工程制图时用来画出光滑形状的工具。
  • 在计算机科学的计算机辅助设计和计算机图形学中,样条通常是指分段定义的多项式参数曲线。由于样条构造简单,使用方便,拟合准确,并能近似曲线拟合和交互式曲线设计中复杂的形状,样条是这些领域中曲线的常用表示方法。

在Github上由Methusalah开发的SplineMesh展现了令人惊叹的效果,具体如下:

这些效果非常不错,但是如果用于移动端Runtime就性能不足了,经过分析发现他的运算集中在Unity的主线程上,对于这种运算密集类型的模拟,就可以使用JobSystem提供多线程的强力支持。

如何将SplineMesh转成JobSystem支持呢?

第一个步骤当然是先分析原算法确定以下一些东西:

  • 有哪些数据,这些数据哪些是初始静态数据,哪里是动态临时数据

    • Spline构成最基本的当然是一串节点,每个节点包括顶点位置和朝向
    • 两个节点构成一个BezierCure
    • 为了使用BezierCurve建模生成对应Mesh,则还需要按给定参数采样Sample
  • 模拟算法的有几个大块步骤,这些步骤里面哪些是需要多线程支持,哪些不需要,不需要多线程的步骤是否就一定不需要转成Job:

      1. 对BezierCurve采样
      1. 根据采样对Mesh进行弯曲操作
      1. 更新Mesh

        以上这些在实际开始写代码之前就需要大体确定

第二个步骤开始写代码,主要按以下三个小步骤来:

1. 构造数据类型
  • NativeSplineNode

    public struct NativeSplineNode
    {
          public Vector3 position;
          public Vector3 direction;
          public Vector3 up;
          public Vector2 scale;
          public float roll;
          public int index;
    }
    
  • NativeBezierCurve

    public struct NativeCubicBezierCurve
    {
          public int stepCount;
          public int startIndexOfSample;
          public float length;
    
          public NativeSplineNode n1, n2;
    }
    
  • NativeCurveSample

    public 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;
    }
    
2. 构造Job逻辑
3. 串联各个Job逻辑

使用JobSystem优化代码总结: