Ejemplo de código de llamada directa acelerada con Unity Burst
Hay poca documentación y ejemplos sobre Burst. Además de llamarlo a través de Jobs, también se puede llamar directamente.
El siguiente es un código de ejemplo para generar UVs para todos los vértices de una esfera. Usando Burst se acelera aproximadamente un 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(); No funciona
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;
}
}El método de llamada directa es el siguiente:
void Update()
{
UVs = new Vector2[vertices.Length];
unsafe
{
fixed (Vector3* vts = vertices)
{
fixed (Vector2* uvs = UVs)
{
ParallelMethods.GenUVs((float3*)vts, (float2*)uvs, vertices.Length);
}
}
}
}El atributo [NoAlias] es para informar a Burst que este puntero no se superpone con otros punteros, permitiendo la vectorización con confianza. Si se usa NativeArray, esto se determina automáticamente y no es necesario. Aquí, como se usan punteros propios, es mejor añadirlo.
Burst tiene muchas limitaciones para generar código vectorizado y un bajo nivel de paralelización. Se recomienda usar Compute Shader para esto, lo que puede acelerar el proceso otro 50%.