前回のAdaptive Performance、Audio編が結構自分の中で面白かったので、次の項目に進もうと思います
前提
- Unity 6000.2.14f1
- Windows、Androidのみ
をベースに記載しています
自分が読み返した時に読みやすい文章を目指しているので
人によっては読みづらいかもです。
記載に間違いが有ったらスミマセン。
Burst AOT Settngs
Burst
先ずBurstとは何ぞや?という所から。
自分の中では並列処理を最適化できるコンパイラの認識。
詳しくは下記↓
↑に関連資料のリンクも色々あるので一度見ておきたいですね。
AOT
ではAOTとは何ぞや? ↓下記に記載あり
Ahead-Of-Time の略称であり、対義語としてJIT(Just-In-Time)がある。
違いとしては
- JIT(Just-In-Time) … 実行時コンパイル。エディタ実行時はこちら
- AOT(Ahead-Of-Time) … 事前コンパイル。ビルドした場合はこちら
と考えると良さそう。
その他AOTについては下記。
だけども、Burstの解説を始めると本題から逸れるので、ここからProjectSettingsの項目の記載に進みます。
本題
まぁそんなわけでこのBurst AOT Settingsは パッケージビルド時の事前コンパイルをどのように行うかの設定 、となるわけです。
詳しいマニュアルは↓
では各項目を見ていきます。
Enable Burst Compilation
これはそのまま、Burstコンパイルを行うかどうか。
これは基本チェックしたままで良いですね
Enable Optimizations
最適化を行うかどうか。同じくチェックを外す理由は無いですね
※詳細にデバッグしたい時は外した方が良いかもだけど
Force Debug Information
デバッグ情報を強制的に含めるかどうか。
デバッグをしたい時にチェックを入れる・・・のはそうとして、気になるのがマニュアルに記載のある 「チェックを入れるとリリースビルドでも情報が含まれてしまう」 という点ですね。
公開パッケージをビルドする時には自動的に無効化しておきたいオプションです。
Debug Information Kind
デバッグ情報に「行だけ」を含めるか、「すべて」を含めるかの選択ですね。
ビルド時間が変わりそうなので、これもビルド時のデバッグレベルで切り替えられると良さそうかも。
Target (Arm) 64bit CPU Architecture
ビルド時に使用するアーキテクチャを選択できるようです。プラットフォームによって選択項目は違うようで
| Windows,Mac,Linux | |
|---|---|
| SSE2 | Streaming SIMD Extension 2。浮動小数演算用。細かく追うと長くなるので割愛。64bitCPUでは基本的にサポートされているのでチェックを入れておくべし |
| SSE4 | Streaming SIMD Extension 4。オプション的な機能。CPUがサポートしているならば高速な命令が期待できる |
| AVX | Advanced Vector Extensions。浮動小数演算を早くするための拡張命令セット |
| AVX2 | Advanced Vector Extension2。浮動小数だけじゃなくて整数演算もサポートしたもの |
※そもそもSIMDって何よ?
Single Instruction, Multiple Dataの略。1つの命令で複数のデータを扱う命令セット
| Android | |
|---|---|
| ARMV8A | 64bitに対応したARMのアーキテクチャ。半精度浮動小数未サポート |
| ARMV8A_HALFFP | 半精度浮動小数をサポートする |
| ARMV9A | 2021年に発表されたバージョン。対応CPUはまだ少ない? |
の違いがあるようです。
見る感じ、 全部チェック入れておいた方が良くない?? とも思うのですが、ビルド時間やら、不測の事態を防ぐためには初期状態のままの方が良いのかしら。
よっぽど使いたい拡張命令セットがある!とか半精度浮動小数で高速化…!という必要が出た時に考える事かな。
Optimize For
読んだまま、最適化の指定。項目は下記
| Default | デフォルト設定。内容としてはBalanced |
| Performance | 高速化重視 |
| Size | ビルドサイズ重視 |
| Fast Compilation | コンパイル速度重視 |
| Balanced | バランスの取れたコンパイル。速度を重視しつつも高速化を目指す |
と聞くと、Defaultのままで良さそう。
あとこれ、マニュアルにも記載があるけども属性で個別に指定できるので、基本はDefaultにしておいて一部だけ指定するのでカスタマイズ性としては十分な気もするね
[BurstCompile(OptimizeFor = OptimizeFor.FastCompilation)]
public struct MyJob : IJob
{
// ...
}
Floating Point Mode
これも読んでそのまま、浮動小数の精度設定
| Default | デフォルト設定。内容としてはStrict |
| Strict | 最適化「無し」! |
| Deterministic | 浮動小数の誤差を無くしてくれる?らしい。64bitの時だけなのでdoubleだけが対象 |
| Fast | 高速な代わりに、NaNやら無限大を考慮しなくなるっぽい。それはそれで怖いじゃん? |
これもDefaultかなぁ…。浮動小数は下手にいじるとバグが起きやすいし。
ただ、これも属性での指定が出きるっぽいので「絶対にNaNやら無限大数が出ない確証」のあるJobなら、属性でFastを指定しちゃって良いんじゃないかな。
Disabled Warning
AOTコンパイル時の警告を無視したい場合はここに警告IDをセミコロン区切りで記載する。
これまた属性での指定も可能っぽいので、よっぽどプロジェクト全体で無視したいときだけの記載で良さそう
警告無視に関してのマニュアルは↓
Stack Protector
サポートしているアーキテクチャでだけ表示される項目(Androidは表示される)
スタックプロテクターとは何ぞや?と調べたけども、どうやらバッファオーバーフローのチェックが行えるらしい!
今回の記事でこれを知れたのが一番の収穫かもしれない? ちょうど最近調べたい場面が有ったんだよね。
項目は下記
| Off | スタックプロテクター無し |
| Basic | clang --fstack-protector。バッファを使用する処理のみチェック |
| Strong | clang --fstack-protector-strong。Basicの強力版。その分重いらしい |
| All | clang --fstack-protector-all。バッファの使用/不使用に関わらずチェック |
これも基本はOffで、ビルド時のデバッグレベルに応じて切り替えたい項目だね
Stack Protector Buffer Size
初期値8。
場合によっては値を増やすのかな?と思いきや、AIに聞いてみると「閾値サイズ」なのでサイズを下げる(例えば4Byteとか)ことで、チェック対象の処理が増えるとの事(その分重くなるらしい)
終わりに
という事で、Burst AOT Settingsの項目でした。
個人開発だとあまりBurstを触る機会は無いけど、Burstは何かを大量に処理したい場合にお世話になることがあるので覚えておくと良いですね。
いざ書いてみるとBurst以外のSSE周りの理解も深まったので、書いてみるのに良い機会だったと思います。
次回はEditorページ・・・と言いたいけど、ここから一気に項目が増えるのでキリがなくなりそうでちょっと怖いですね。。
まぁ急がず冬休みにでもやってみるかなぁ(そのころにはUnity6.3が出てそうですが)
