Пример прямого вызова кода с ускорением Unity Burst
Документации и примеров по 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%.