C# 言語のサポート
HPC#
Burst は、HPC# (High Performance C#) と呼ばれる高パフォーマンスの C# をサポートしています。
HPC# でサポートされる C# の機能
HPC# では、C# のほとんどの式とステートメントを使用できます。具体的には以下のとおりです。
サポートされる機能 | メモ |
---|---|
拡張メソッド | |
構造体のインスタンスメソッド | |
アンセーフコードとポインターの操作 | |
静的読み取り専用フィールドからのロード | 詳細については、静的読み取り専用フィールドと静的コンストラクター に関するドキュメントを参照してください。 |
通常の C# コントロールフロー | if else switch case for while break continue |
ref と out パラメーター |
|
fixed ステートメント |
|
一部の IL opcode | cpblk initblk sizeof |
DllImport と内部呼び出し |
詳細については、DllImport と内部呼び出し に関するドキュメントを参照してください。 |
try と finally キーワード。Burst では関連する IDisposable パターン、using 、foreach もサポート。 |
Burst で例外が発生した場合の動作は .NET とは異なります。.NET では、try ブロック内で例外が発生した場合、コントロールフローが finally ブロックに移ります。しかし、Burst では、try ブロック内外で例外が発生した場合、finally ブロックが存在しないかのように例外がスローされます。 |
文字列と ProfilerMarker |
詳細については、Unity プロファイラーのマーカーのサポート に関するドキュメントを参照してください。 |
throw 式 |
Burst でサポートされるのは、throw new ArgumentException("Invalid argument") のようなシンプルな throw パターンだけです。このようなシンプルなパターンを使用した場合、Burst によって静的な文字列の例外メッセージが抽出され、生成コードに含められます。 |
文字列と Debug.Log |
部分的にのみサポートされています。詳細については、文字列のサポートと Debug.Log に関するドキュメントを参照してください。 |
Burst には、HPC# で直接利用できない一部の C# コンストラクションの代替物も用意されています。
- 関数ポインター: HPC# 内で使用するデリゲートの代替物
- SharedStatic: C# と HPC# の両方から静的可変データにアクセスするために使用
例外の式
Burst は、例外処理のために throw
式をサポートしています。エディター でスローされた例外は、マネージコードでキャッチして、コンソールウィンドウに出力できます。プレイヤービルド で例外がスローされた場合は、必ずアプリケーションが強制中断されます。そのため、Burst を使う際は、例外的動作のためにのみ例外を使用することをお勧めします。Burst では、一般的なコントロールフローなどに対する例外でコードの実行が終わらないようにするため、[Conditional("ENABLE_UNITY_COLLECTIONS_CHECKS")]
属性のないメソッド内で throw
試行をするコードに対して、以下のような警告が生成されます。
Burst warning BC1370: An exception was thrown from a function without the correct [Conditional("ENABLE_UNITY_COLLECTIONS_CHECKS")] guard. Exceptions only work in the editor and so should be protected by this guard
(Burst 警告 BC1370: 正しい [Conditional("ENABLE_UNITY_COLLECTIONS_CHECKS")] ガードのない関数から例外がスローされました。例外はエディターでのみ機能するため、このガードで保護する必要があります)
HPC# でサポートされない C# の機能
HPC# は以下の C# 機能をサポートしていません。
try
/catch
内でのcatch
による例外のキャッチ- 静的フィールドの格納 (SharedStatic を使用する場合を除く)
- 文字列メソッドなど、マネージオブジェクトに関連するメソッド