Pattern and helpers for writing Unity Burst jobs as generic Functions/Actions.
Write burst compiled jobs with easy arguments and return values.
[BurstCompile] public struct AddIntegersFuncX2 : IBurstFunction<int, int, int> { public int Execute(int a, int b) { return a + b; } public static int Invoke(int a, int b) { return BurstFunction<AddIntegersFuncX2, int, int, int>.Run(Instance, a, b); } private static readonly AddIntegersFuncX2 Instance = new AddIntegersFuncX2(); }
then call it like a normal function.
var intResult3 = MyFunctions.AddIntegersFuncX2.Invoke(5, 7);
[BurstCompile] public struct ArrayTestFunc : IBurstFunction<NativeArray<int>, NativeArray<int>, NativeArray<int>> { public NativeArray<int> Execute(NativeArray<int> arg1, NativeArray<int> arg2) { for (int i = 0; i < 100000; i++) { arg1[i] = i; } for (int i = 0; i < 100000; i++) { arg2[i] = arg1[i]; } return arg2; } public static NativeArray<int> Invoke(NativeArray<int> a, NativeArray<int> b) { return BurstFunction<ArrayTestFunc, NativeArray<int>, NativeArray<int>, NativeArray<int>>.Run(Instance, a, b); } public static ArrayTestFunc Instance { get; } = new ArrayTestFunc(); }
Interface:
public interface IBurstRefAction<T1, T2, T3, T4, T5> : IBurstOperation { void Execute(ref T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); }
Implementation:
[BurstCompile] public struct TryGetContact : IBurstRefAction<NativeManifold, RigidTransform, NativeHull, RigidTransform, NativeHull> { public void Execute(ref NativeManifold manifold, RigidTransform t1, NativeHull hull1, RigidTransform t2, NativeHull hull2) { HullIntersection.NativeHullHullContact(ref manifold, t1, hull1, t2, hull2); } public static bool Invoke(out NativeManifold result, RigidTransform t1, NativeHull hull1, RigidTransform t2, NativeHull hull2) { // Can only allocate as 'temp' within Burst Jobs result = new NativeManifold(Allocator.Persistent); BurstRefAction<TryGetContact, NativeManifold, RigidTransform, NativeHull, RigidTransform, NativeHull>.Run(Instance, ref result, t1, hull1, t2, hull2); return result.Length > 0; } public static TryGetContact Instance { get; } = new TryGetContact(); }
Calling Example:
var burstResult = HullOperations.TryGetContact.Invoke(out NativeManifold manifold, t1, hull1, t2, hull2);