Перейти к содержимому
Пример прямого вызова кода с ускорением Unity Burst

Пример прямого вызова кода с ускорением Unity Burst

2024-11-05 06:20

Документации и примеров по Burst немного. Помимо вызова через Job, его также можно вызывать напрямую.

Ниже приведен пример кода для генерации UV-координат для всех вершин сферы. Использование Burst дает ускорение примерно на 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(); не работает

            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;
        }
    }

Метод прямого вызова выглядит следующим образом:

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

Атрибут [NoAlias] используется, чтобы сообщить Burst, что этот указатель не пересекается с другими указателями, и можно безопасно векторизовать код. При использовании NativeArray это определяется автоматически и не требуется. Здесь, поскольку используются собственные указатели, лучше добавить этот атрибут.

Генерация векторизованного кода в Burst имеет множество ограничений, а степень параллелизма невысока. Рекомендуется использовать Compute Shader, что может дать дополнительное ускорение на 50%.

Последнее изменение
hugo-builder
hugo-builder · · 自动翻译 about.md 2... · 248520b
Другие участники
...