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
JobHandleile zincirlenir. ScheduleileCompletearasına zaman koyun; hemenCompleteç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
IJobParallelForTransformkullanı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.
İlgili Unity & C# soruları
- Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?
- GetComponent çağrılarını neden önbelleğe almalısınız?
- Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?
- C# delegate, event ve UnityEvent arasındaki farklar nelerdir?
- Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?
- C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.