渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

IJobParallelForTransformを使ってTransformを並列処理させる


f:id:esakun:20180911130926p:plain:w500

前回前々回とIJob、IJobParallelForを使ったJobSystemについて触れてきました。
今回は僕的には

一番使ってみたいIJobParallelForTransformを検証してみたいと思います。

Unity - Scripting API: IJobParallelForTransform

IJobParallelForTransformとは

ジョブ実行中にTransformを並列に処理できるインターフェースです。
と入っても、Transformクラスが扱えるわけではなく、TransformAccessという型でジョブには渡ってきます。

とりあえずジョブのコードを見てます。

struct TestJob : IJobParallelForTransform
{
    public NativeArray<Vector3> positions;
    public void Execute(int index, TransformAccess transform)
    {
        var pos = positions[index];
        transform.localPosition = pos;
    }
}

Executeには参照要素番号と、TransformAccess型が渡ってきていますので、素直にそれらを使ってゴニョゴニョするという感じです。

TransformAccess型

Unity - Scripting API: TransformAccess

  • localPosition
  • localRotation
  • localScale
  • position
  • rotation

これら5つのプロパティを操作することができます。もちろんGetComponentなどは不可です。
ジョブで扱うデータなので、TransformAccess型はクラスではなく構造体で定義されています。

サンプル

10000個のキューブのポジションを更新するサンプルを作りました。

f:id:esakun:20180911130505g:plain

  1. ジョブ未使用
  2. ジョブ使用(BurstCompilerなし)
  3. ジョブ使用(BurstCompilerあり)

この3つの方法でテストします。

結果

f:id:esakun:20180911104940p:plain:w500

検証 MainThreadのUpdateの時間 WorkerThreadの時間
ジョブ未使用 3.82ms なし
ジョブ使用 2.30ms 0.22ms
ジョブ使用 + Burst 1.95ms 0.070ms

UnityEditor上での結果ですが、CPUプロファイラはこのようになっています。

今回はPositionをただ渡すだけのシンプルな処理のジョブなので、あまりBurstCompilerの恩恵は受けられていない感じがします。

次の課題として実用的な使い方をUniteやCEDECあたりの資料を漁りつつ検証していこうと思います。

今回のソースコードはこちら