Unity'de C# Job System ve Burst Compiler nedir? Bir job nasıl yazılır?

Cevap

C# Job System, işi Unity'nin worker thread'lerine güvenli şekilde dağıtmayı sağlar. Burst Compiler ise job'lardaki C# kodunun bir alt kümesini (HPC#) LLVM ile SIMD'li, yüksek optimize native koda derler. Birlikte kullanıldığında ana thread'de yapılan sayısal işlerin çok daha hızlı hale gelmesi sık görülür.

Kısıtlar: Job içinde managed referans tipleri (class, normal array, string) kullanılamaz; veri NativeArray<T> gibi native container'larla ve blittable struct'larla taşınır.

using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using Unity.Mathematics;
using UnityEngine;

[BurstCompile]
struct MoveJob : IJobParallelFor
{
    public NativeArray<float3> positions;
    [ReadOnly] public NativeArray<float3> velocities;
    public float dt;

    public void Execute(int i) => positions[i] += velocities[i] * dt;
}

public class Swarm : MonoBehaviour
{
    NativeArray<float3> pos, vel;
    JobHandle handle;

    void Awake()
    {
        pos = new NativeArray<float3>(10000, Allocator.Persistent);
        vel = new NativeArray<float3>(10000, Allocator.Persistent);
    }

    void Update()
    {
        var job = new MoveJob { positions = pos, velocities = vel, dt = Time.deltaTime };
        handle = job.Schedule(pos.Length, 64);   // 64'lük batch'ler
    }

    void LateUpdate() => handle.Complete();      // sonucu kullanmadan önce bekle

    void OnDestroy() { handle.Complete(); pos.Dispose(); vel.Dispose(); }
}

Önemli noktalar:

  • Safety system editörde race condition'ları yakalar; aynı NativeArray'e iki job aynı anda yazarsa hata verir. Bağımlılıklar JobHandle ile zincirlenir.
  • Schedule ile Complete arasına zaman koyun; hemen Complete çağırmak paralellik kazancını yok eder.
  • Native container'lar elle Dispose edilmelidir; aksi halde leak uyarısı alırsınız.
  • Transform'lara job içinden erişim için IJobParallelForTransform kullanılır.
  • Unity.Mathematics (float3, math.*) Burst için optimize edilmiştir.

Bu yapı, Unity DOTS/ECS'in temelini oluşturur; ECS olmadan da klasik MonoBehaviour projelerinde kullanılabilir.

  1. Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?KolayUnity & C#Game Dev
  2. GetComponent çağrılarını neden önbelleğe almalısınız?KolayUnity & C#Game Dev
  3. Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?OrtaUnity & C#Game Dev
  4. C# delegate, event ve UnityEvent arasındaki farklar nelerdir?OrtaUnity & C#Game Dev
  5. Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?ZorUnity & C#Game Dev
  6. C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?OrtaUnity & C#Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle