docs.unity3d.com
    目次を表示する/隠す

    C#/.NET 型のサポート

    Burst は、コード (C# のクラス) のマネージオブジェクトや参照型を使用できない .NET のサブセットで動作します。

    以下のセクションで、Burst がサポートしているコンストラクトとその制限事項について詳しく説明します。

    • ビルトイン型
    • 配列型
    • 構造体型
    • ジェネリック型
    • ベクトル型
    • 列挙型
    • ポインター型
    • Span 型

    ビルトイン型

    サポートされているビルトイン型

    Burst は、以下のビルトイン型をサポートしています。

    • bool
    • byte/sbyte
    • double
    • float
    • int/uint
    • long/ulong
    • short/ushort

    サポートされていないビルトイン型

    Burst は、以下のビルトイン型をサポートしていません。

    • char
    • decimal
    • string (マネージ型であるため)

    配列型

    サポートされている配列型

    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.Sequential
    • LayoutKind.Explicit
    • StructLayoutAttribute.Pack
    • StructLayoutAttribute.Size

    Burst は、ポインターを直接表す intrinsic 構造体として System.IntPtr と System.UIntPtr をネイティブにサポートしています。

    ジェネリック型

    Burst では構造体でジェネリック型を使用できます。また、ジェネリックパラメーターを持つ構造体でインターフェースを実装する必要がある場合などには、インターフェース制約を持つジェネリック型に対するジェネリック呼び出しの完全なインスタンス化もサポートされます。

    Note

    ジェネリックジョブ の使用には制限事項があります。

    ベクトル型

    Burst では、以下に示す最適化の第一級サポートを通じて、Unity.Mathematics のベクトル型をネイティブ SIMD ベクトル型に変換できます。

    • bool2/bool3/bool4
    • uint2/uint3/uint4
    • int2/int3/int4
    • float2/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 型がすべての安全性チェック設定を考慮し、安全性チェックが有効な場合にはパフォーマンス負荷の高いチェックのみを実行します。

    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)