Gameloper'a Hoş Geldiniz!

Gameloper, oyun geliştiriciler için oluşturulmuş bir topluluktur. Unity, Unreal Engine ve Godot gibi oyun motorları hakkında bilgi paylaşabilir, sorular sorabilir ve ücretsiz assetler keşfedebilirsiniz.

Hemen Kayıt Ol!

Unity C# İş Parçacığı Yönetimi: Job System ve Burst Compiler ile Maksimum Performans

  • Konuyu Başlatan Konuyu Başlatan Druid
  • Başlangıç tarihi Başlangıç tarihi

Druid

Administrator
Yönetici
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
Kod:
for
döngüsü ile ana thread üzerinde yapmak FPS düşüşüne neden olacaktır.

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 sonra
Kod:
.Dispose()
metodunu çağırmayı unutmak bellek sızıntısına (Memory Leak) yol açar.

Performans İçin Kritik İpuçları

  1. Blittable Types: Sadece blittable (bellekte aynı gösterime sahip) veri türlerini kullanın (int, float, bool, struct). Managed referanslardan kaçının.
  2. Scheduling: Job'ı
    Kod:
    .Run()
    ile değil,
    Kod:
    .Schedule()
    ile çağırarak işçi thread'lere gönderin.
  3. Dependencies: Bir Job'ın sonucuna bağlı başka bir Job varsa, bağımlılıkları
    Kod:
    JobHandle
    ile yönetin.

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.
 
Geri
Üst