Burst Compilerざっくりまとめ
前書き
DOTS の1つである Burst Compiler について軽くまとめました。
詳しく書いてるわけではないですが、要点は抑えているつもりです。
ざっくりとした説明なので詳しい情報は調べてみてください。
注意点
2019/12/01 時点で調べた内容です。
恩恵
処理を早くできる。
バイナリを作るまでの流れ
- 通常
- IL2CPP
- Burst Compiler
なぜBurst Compilerを使うと早いのか?
- LLVMの最適化が聞く
- SIMDを使う
- SIMD(Single Instruction Multiple Data)の略。1つの命令で複数の計算を行う仕組み。
連続したデータ(ベクトル化)に対して1度で計算を終わらせる。
- SIMD(Single Instruction Multiple Data)の略。1つの命令で複数の計算を行う仕組み。
- メモリエイリアスを考慮
- ようわからん。
制約
- 基本 C# Job System でしか使えない
- ジョブ以外の任意の関数を最適化する方法はある
- クラスが使えない
- マネージドヒープを使う参照型は使えない(GCを避けるため)
- クラス -> 構造体
- 配列 -> NativeArray
- 文字列 -> NativeString
- マネージドヒープを使う参照型は使えない(GCを避けるため)
- 例外処理ができない
- できない
- try
- catch
- finally
- できる
- throw
- できない
使い方
ジョブに[BurstCompile]
を付けるだけ。
using Unity.Burst; public class SampleClass : MonoBehaviour { [BurstCompile] // ←この属性を付けるだけ struct SampleStruct : IJob { public NativeArray<int> a; public NativeArray<int> b; public void Execute() { for(int i = 0; i < a.Length; ++i) { a[i] = b[i] * 10; } } } ... ... }
最後に
Burstコンパイラへの対応は思った以上に簡単ぽいです。
簡単にですが、これで DOTS の1つを攻略しました。