跳至内容

Unity Burst-Beschleunigung: Beispielcode für direkten Aufruf

Es gibt nur wenige Burst-Dokumentationen und Beispiele. Neben der Job-basierten Aufrufmethode kann Burst auch direkt aufgerufen werden.

Hier ist ein Beispielcode, der UV-Koordinaten für alle Vertices einer Kugel generiert. Die Verwendung von Burst beschleunigt dies um etwa 50%.

using System.Runtime.CompilerServices;
using Unity.Burst;
using Unity.Mathematics;

[BurstCompile]
public static class ParallelMethods
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    [BurstCompile]
    public static unsafe void GenUVs([NoAlias] in float3* vertices, [NoAlias] float2* uvs,
        int count)
    {
        for (var i = 0; i < count; i += 1)
        {
            // Unity.Burst.CompilerServices.Loop.ExpectVectorized(); Ungültig

            var p = vertices[i];
            var longitude = math.atan2(p.z, p.x);
            var latitude = math.asin(p.y);
            uvs[i].x = longitude / math.PI2 + 0.5f;
            uvs[i].y = latitude / math.PI + 0.5f;
        }
    }

Die direkte Aufrufmethode ist wie folgt:

void Update()
{
    UVs = new Vector2[vertices.Length];
    unsafe
    {
        fixed (Vector3* vts = vertices)
        {
            fixed (Vector2* uvs = UVs)
            {
                ParallelMethods.GenUVs((float3*)vts, (float2*)uvs, vertices.Length);
            }
        }
    }
}

Das [NoAlias] Attribut teilt Burst mit, dass dieser Zeiger keinen Überlapp mit anderen Zeigern hat und daher sicher vektorisiert werden kann. Bei Verwendung von NativeArray wird dies automatisch erkannt und ist nicht nötig. Da hier eigene Zeiger verwendet werden, ist es ratsam, es hinzuzufügen.

Die Generierung vektorisierter Codes durch Burst unterliegt vielen Einschränkungen und die Parallelisierungsmenge ist gering. Es wird empfohlen, stattdessen Compute Shader zu verwenden, was eine weitere Beschleunigung um 50% ermöglichen kann.