C#/.NET 型のサポート
Burst は、コード (C# のクラス) のマネージオブジェクトや参照型を使用できない .NET のサブセットで動作します。
以下のセクションで、Burst がサポートしているコンストラクトとその制限事項について詳しく説明します。
ビルトイン型
サポートされているビルトイン型
Burst は、以下のビルトイン型をサポートしています。
boolbyte/sbytedoublefloatint/uintlong/ulongshort/ushort
サポートされていないビルトイン型
Burst は、以下のビルトイン型をサポートしていません。
chardecimalstring(マネージ型であるため)
配列型
サポートされている配列型
Burst は、以下に示すように、静的読み取り専用フィールドからロードする読み取り専用マネージ配列をサポートしています。
[BurstCompile]
public struct MyJob : IJob {
private static readonly int[] _preComputeTable = new int[] { 1, 2, 3, 4 };
public int Index { get; set; }
public void Execute()
{
int x = _preComputeTable[0];
int z = _preComputeTable[Index];
}
}
ただし、静的読み取り専用マネージ配列へのアクセスには、以下の制限事項があります。
- 静的読み取り専用マネージ配列は直接使用することしかできません。そのため、メソッド引数などとして渡すことはできません。
- ジョブを使用しない C# コードで、静的読み取り専用配列の要素を変更してはいけません。その理由は、Burst コンパイラーによって、コンパイル時にデータの読み取り専用コピーが作成されるからです。
- 多次元配列はサポートされていません。
サポートされていない静的コンストラクターを使用した場合、Burst でエラー BC1361 が発生します。
Burst で配列を初期化する方法の詳細については、静的読み取り専用フィールドと静的コンストラクター を参照してください。
サポートされていない配列型
Burst は、マネージ配列をサポートしていません。代わりに、NativeArray
構造体型
サポートされている構造体
Burst は、以下の構造体をサポートしています。
- サポートされている型のフィールドを持つ標準的な構造体
- 固定配列フィールドを持つ構造体
Note
明示的なレイアウトを持つ構造体からは、最適ではないネイティブコードが生成される可能性があります。
サポートされている構造体レイアウト
Burst は、以下の構造体レイアウトをサポートしています。
LayoutKind.SequentialLayoutKind.ExplicitStructLayoutAttribute.PackStructLayoutAttribute.Size
Burst は、ポインターを直接表す intrinsic 構造体として System.IntPtr と System.UIntPtr をネイティブにサポートしています。
ジェネリック型
Burst では構造体でジェネリック型を使用できます。また、ジェネリックパラメーターを持つ構造体でインターフェースを実装する必要がある場合などには、インターフェース制約を持つジェネリック型に対するジェネリック呼び出しの完全なインスタンス化もサポートされます。
Note
ジェネリックジョブ の使用には制限事項があります。
ベクトル型
Burst では、以下に示す最適化の第一級サポートを通じて、Unity.Mathematics のベクトル型をネイティブ SIMD ベクトル型に変換できます。
bool2/bool3/bool4uint2/uint3/uint4int2/int3/int4float2/float3/float4
Tip
パフォーマンス上の理由から、4 つのワイド型 (bool4、uint4、float4、int4) を他の型よりも優先して使用してください。
列挙型
サポートされている列挙型
Burst は、特定のストレージ型 (public enum MyEnum : short など) を持つ列挙型を含む、すべての列挙型をサポートしています。
サポートされていない列挙型
Burst は、Enum メソッド (Enum.HasFlag など) をサポートしていません。
ポインター型
Burst は、Burst でサポートされている型を指すポインター型をサポートしています。
Span 型
Span<T> 型と ReadOnlySpan<T> 型がサポートされる Unity エディターにおいて、Burst ではこれらの型をサポートしています。
Span 型は Burst ジョブと関数ポインターでのみ使用でき、それらへのインターフェースでは使用できません。その理由は、C# のSpan 型の実装では、Span を格納できるのはマネージデータ型 (マネージ配列など) だけだからです。例えば、以下のコードは無効です。
[BurstCompile]
public static void SomeFunctionPointer(Span<int> span) {}
このコードが無効である理由は、Span がマネージと Burst の境界にまたがって使用されているからです。Burst では、Span 型がすべての安全性チェック設定を考慮し、安全性チェックが有効な場合にはパフォーマンス負荷の高いチェックのみを実行します。