こんにちは、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個のキューブのポジションを更新するサンプルを作りました。
- ジョブ未使用
- ジョブ使用(BurstCompilerなし)
- ジョブ使用(BurstCompilerあり)
この3つの方法でテストします。
結果
検証 | MainThreadのUpdateの時間 | WorkerThreadの時間 |
---|---|---|
ジョブ未使用 | 3.82ms | なし |
ジョブ使用 | 2.30ms | 0.22ms |
ジョブ使用 + Burst | 1.95ms | 0.070ms |
Unityエディタ上での結果ですが、CPUプロファイラはこのようになっています。
今回はPositionをただ渡すだけのシンプルな処理のジョブなので、あまりBurstCompilerの恩恵は受けられていない感じがします。
次の課題として実用的な使い方をUniteやCEDECあたりの資料を漁りつつ検証していこうと思います。
今回のソースコードはこちら
TransformAccessTest.cs · GitHub
この記事が気に入ったらフォローしよう
- Unity2018.2.5.f1