- Katılım
- 11 Mar 2026
- Mesajlar
- 52
- Tepkime puanı
- 5
- Puan
- 8
Unity C# İş Parçacığı Yönetimi: Job System ve Burst Compiler ile Maksimum Performans
Modern oyun geliştirmede, işlemci gücünü verimli kullanmak artık bir seçenek değil, zorunluluktur. Unity'nin geleneksel Single-Threaded (tek kanallı) çalışma yapısı, karmaşık yapay zeka hesaplamaları veya yoğun fizik simülasyonları altında darboğaz oluşmasına neden olur. Bu rehberde, Unity'nin Data-Oriented Technology Stack (DOTS) bileşenlerinden olan C# Job System ve Burst Compiler kullanarak performansı nasıl maksimize edeceğimizi teknik detaylarıyla inceleyeceğiz.
C# Job System Nedir ve Neden Kullanılmalıdır?
Varsayılan olarak Unity, ana döngüsünü (Update, FixedUpdate vb.) tek bir işlemci çekirdeğinde çalıştırır. C# Job System, bu işlemleri güvenli bir şekilde çok çekirdekli (Multi-core) yapıya dağıtmanıza olanak tanır. Sistemin en büyük avantajı, Race Condition (yarış durumu) gibi multithread programlama hatalarını Unity'nin kendi güvenlik katmanıyla engellemesidir.
Burst Compiler: Makine Koduna Derleme
Burst Compiler, LLVM tabanlı bir derleyici teknolojisidir. C# kodunuzu alır ve hedef platformun işlemci mimarisine (SSE2, AVX2 vb.) göre optimize edilmiş oldukça hızlı makine koduna dönüştürür. Özellikle matematiksel hesaplamaların yoğun olduğu bölümlerde %10 ila %100 arasında performans artışı sağlayabilir.
Teknik Uygulama: IJobParallelFor Kullanımı
Diyelim ki 100.000 adet objenin pozisyonunu karmaşık bir matematiksel formüle göre güncellememiz gerekiyor. Bunu standart bir
döngüsü ile ana thread üzerinde yapmak FPS düşüşüne neden olacaktır.
Native Konteynerler ve Bellek Yönetimi
Job System içerisinde standart sınıflar (Class) veya yönetilen diziler (Managed Arrays) kullanamazsınız. Veriler NativeContainer türünde olmalıdır.
Performans İçin Kritik İpuçları
Sonuç olarak, Unity Job System ve Burst Compiler ikilisi, modern işlemci mimarilerini sonuna kadar zorlamanıza imkan tanır. Özellikle büyük ölçekli simülasyonlar ve CPU limitli projelerde bu mimariyi kullanmak projenizin kalitesini belirleyen ana unsur olacaktır.
Modern oyun geliştirmede, işlemci gücünü verimli kullanmak artık bir seçenek değil, zorunluluktur. Unity'nin geleneksel Single-Threaded (tek kanallı) çalışma yapısı, karmaşık yapay zeka hesaplamaları veya yoğun fizik simülasyonları altında darboğaz oluşmasına neden olur. Bu rehberde, Unity'nin Data-Oriented Technology Stack (DOTS) bileşenlerinden olan C# Job System ve Burst Compiler kullanarak performansı nasıl maksimize edeceğimizi teknik detaylarıyla inceleyeceğiz.
C# Job System Nedir ve Neden Kullanılmalıdır?
Varsayılan olarak Unity, ana döngüsünü (Update, FixedUpdate vb.) tek bir işlemci çekirdeğinde çalıştırır. C# Job System, bu işlemleri güvenli bir şekilde çok çekirdekli (Multi-core) yapıya dağıtmanıza olanak tanır. Sistemin en büyük avantajı, Race Condition (yarış durumu) gibi multithread programlama hatalarını Unity'nin kendi güvenlik katmanıyla engellemesidir.
Burst Compiler: Makine Koduna Derleme
Burst Compiler, LLVM tabanlı bir derleyici teknolojisidir. C# kodunuzu alır ve hedef platformun işlemci mimarisine (SSE2, AVX2 vb.) göre optimize edilmiş oldukça hızlı makine koduna dönüştürür. Özellikle matematiksel hesaplamaların yoğun olduğu bölümlerde %10 ila %100 arasında performans artışı sağlayabilir.
Teknik Uygulama: IJobParallelFor Kullanımı
Diyelim ki 100.000 adet objenin pozisyonunu karmaşık bir matematiksel formüle göre güncellememiz gerekiyor. Bunu standart bir
Kod:
for
Kod:
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
using Unity.Mathematics;
[BurstCompile] // Kodun makine diline optimize edilmesini sağlar
public struct PositionUpdateJob : IJobParallelFor
{
public NativeArray<float3> Positions;
[ReadOnly] public float DeltaTime;
public void Execute(int index)
{
// İşlemci yoğunluklu matematiksel hesaplama
Positions[index] += new float3(0, math.sin(DeltaTime + index) * 0.1f, 0);
}
}
Native Konteynerler ve Bellek Yönetimi
Job System içerisinde standart sınıflar (Class) veya yönetilen diziler (Managed Arrays) kullanamazsınız. Veriler NativeContainer türünde olmalıdır.
- NativeArray: En yaygın kullanılan veri yapısıdır.
- Allocator.Temp: Bir kare (frame) ömrü olan çok hızlı tahsisat.
- Allocator.Persistent: Oyun boyunca yaşayan kalıcı veri yapısı.
- Allocator.TempJob: 4 kare ömrü olan, kısa süreli işler için ideal yapı.
Uyarı: NativeContainer kullandıktan sonrametodunu çağırmayı unutmak bellek sızıntısına (Memory Leak) yol açar.Kod:.Dispose()
Performans İçin Kritik İpuçları
- Blittable Types: Sadece blittable (bellekte aynı gösterime sahip) veri türlerini kullanın (int, float, bool, struct). Managed referanslardan kaçının.
- Scheduling: Job'ı
ile değil,Kod:
.Run()ile çağırarak işçi thread'lere gönderin.Kod:.Schedule() - Dependencies: Bir Job'ın sonucuna bağlı başka bir Job varsa, bağımlılıkları
ile yönetin.Kod:
JobHandle
Kod:
void Update()
{
NativeArray<float3> positions = new NativeArray<float3>(1000, Allocator.TempJob);
PositionUpdateJob jobData = new PositionUpdateJob
{
Positions = positions,
DeltaTime = Time.time
};
// İş parçacıklarına dağıt
JobHandle handle = jobData.Schedule(positions.Length, 64);
// Ana thread üzerinde diğer işlemleri yaparken bekle
handle.Complete();
positions.Dispose();
}
Sonuç olarak, Unity Job System ve Burst Compiler ikilisi, modern işlemci mimarilerini sonuna kadar zorlamanıza imkan tanır. Özellikle büyük ölçekli simülasyonlar ve CPU limitli projelerde bu mimariyi kullanmak projenizin kalitesini belirleyen ana unsur olacaktır.