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);
}
}
}
}
但是Burst生成向量化的代码限制很多,且并行数量少,建议还是用Computer Shader来做,还可以再加速50%。