跳至内容

مثال على التعليمات البرمجية للاستدعاء المباشر المعجل بـ 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 للتعليمات البرمجية الموجهة، وعدد العمليات المتوازية قليل، لذا يُقترح استخدام Computer Shader للقيام بذلك، حيث يمكنه التعجيل بنسبة إضافية تصل إلى 50%.