渋谷ほととぎす通信

「Unityをわかりやすく」初心者のためのゲーム作りブログ

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

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

こんにちは、Unityエンジニアのオオバです。

前回前々回

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

Unity - Scripting API: IJobParallelForTransform

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

IJobParallelForTransformとは

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

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

struct TestJob : IJobParallelForTransform  
{
    public NativeArray 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個のキューブのポジションを更新するサンプルを作りました。

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

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

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

結果

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

検証MainThreadのUpdateの時間WorkerThreadの時間
ジョブ未使用3.82msなし
ジョブ使用2.30ms0.22ms
ジョブ使用 + Burst1.95ms0.070ms

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

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

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

今回のソースコードはこちら
TransformAccessTest.cs · GitHub

オススメ記事
検証環境
  • Unity2018.2.5.f1