#最初に
この記事はUnityで使用されているコンパイラについてまとめた記事のうちの、基本的に使われている部分であるBurstについて簡単にまとめた記事です。
Burstとは?
Unity2018以降で新しく追加されたコンパイラです(ただし現在はUnity公式コミュ二ティで配布段階)。IL2CPPが単純にC++に変換してパフォーマンスを確保するのに対し、BurstはECSやC# JobSystemで組んだような限られた前提条件で組まれたILをCPUに合わせてCPU演算向け最適化を行ったアセンブラを吐いてくれます。そのため、劇的なパフォーマンスの改善が期待できます。
Burstでコンパイル後に生成されたアセンブラはプレビューすることも可能です。
IL2CPPはMonoよりも2倍〜3倍高速ですが、UnityのBurstコンパイラは、C++よりもC#のコードを高速にすることができます。ただしBurst自体はまだ登場したばかりなのでこれから更に改良されていくことが期待されています。
Burstの前提条件とは?
- C#前提。C#のポインタは使える。
- 仮想メソッドを持つことはできない。
- GCも使えない。
- 参照型は無し。プリミティブ型と構造体のみ。
- NativeArray構造体である。
- 連続したメモリレイアウト前提。
- データの入出力がはっきりしてること。
- SIMD auto -vectorization
- Preciton control (Low, Med, High)
使い方
IJob系のインターフェースに BurstCompile属性([Unity.Burst.BurstCompile])をつけることで適用できます。
また、Jobs -> Burst Inspector からどのエラーがBurstを妨げているか知ることができます。
現状の標準となっているようなコードの書き方(MonoBehaviour)からECSに変えるには多くの変更点が存在します。このような変更点のために作業コストがかかるのは不本意なので、最終的には改良によって30分程度でプロジェクト内のMonoBehaviourからECSへ変更し、Burstの恩恵を受けられるようにと考えているようです。
最後に
とりあえずここまでで一通りUnityで使われているンパイラに触れることができました。実際の細かい内部構造や使用方法などまでには触れていませんが、イメージやメリットデメリットだけでも伝われば嬉しいと思います。私自身もここまでのパートで最新のUnity周りについて勉強になることが多かったので今後も継続してインプットしていきたいと思います。