Unity oyun geliştirmede performans, her şeyden önemlidir. Karmaşık oyun dünyalarını ve etkileşimli karakterleri sorunsuz çalıştırmak için, kodumuzun mümkün olduğunca verimli çalışması gerekir. Unity’nin sunduğu Job System, bu konuda geliştiricilere büyük bir avantaj sağlar. Bu sistemde, JobHandle.Schedule() yöntemi, paralel işlemeyi yönetmek ve performansı optimize etmenin temel taşıdır. Bu makalede, JobHandle.Schedule() yöntemini detaylı olarak inceleyeceğiz ve kullanımını örneklerle açıklayacağız.
Job System’e Giriş
Unity’nin Job System’i, oyun içindeki belirli görevleri (işleri) bağımsız olarak, paralel olarak çalıştırmanıza olanak tanır. Bu, özellikle CPU’nun tek çekirdeğini kullanan geleneksel yöntemlere kıyasla, çok çekirdekli işlemcilerin gücünden daha iyi yararlanmanızı sağlar. İşlem yoğun görevleri (fizik hesaplamaları, yapay zeka, büyük veri işlemleri gibi) paralel işleyerek, oyun performansında önemli bir artış elde edebilirsiniz.
JobHandle Nedir?
Bir JobHandle, bir işin (job) durumunu temsil eden bir yapıdır. Bir işi başlattığınızda, JobHandle size bu işin ne zaman tamamlandığını bildirir. Bu sayede, diğer işlemlerinizin bu işin sonucuna bağlı olarak çalışmasını sağlayabilirsiniz. Bir nevi, bir işin tamamlanma sözüdür.
JobHandle.Schedule() Yöntemini Anlamak
JobHandle.Schedule() yöntemi, bir işi (job) çalıştırmak ve bu işin JobHandle’ını almak için kullanılır. Bu yöntem, işin hangi işleyici (thread) üzerinde çalıştırılacağını ve hangi bağımlılıkların olduğunu belirlemenize olanak tanır.
Temel Kullanım
JobHandle jobHandle = myJob.Schedule();
Bu kod, myJob adlı işi çalıştırır ve işin tamamlandığını bildiren bir jobHandle döndürür. myJob, IJobParallelFor, IJob veya Job System’in desteklediği diğer job türlerinden biri olabilir.
Bağımlılıklar (Dependencies)
Birden fazla işiniz varsa ve bazı işlerin diğerlerine bağlı olması gerekiyorsa, JobHandle.Schedule() yönteminin ikinci parametresini kullanarak bağımlılıkları belirleyebilirsiniz. Örneğin:
JobHandle jobHandle1 = job1.Schedule();
JobHandle jobHandle2 = job2.Schedule(jobHandle1); // job2, job1 tamamlandıktan sonra başlar
Bu örnekte, job2, job1 tamamlanmadan önce başlamaz. jobHandle1, job2 için bir bağımlılık olarak kullanılır.
JobHandle ile Senkronizasyon
JobHandle, işlerin senkronizasyonu için de önemlidir. İşinizin sonucunu ana thread’de (main thread) kullanmanız gerekiyorsa, JobHandle’ı kullanarak işin tamamlanmasını beklemelisiniz. Bunun için JobHandle.Complete() yöntemini kullanabilirsiniz.
jobHandle.Complete(); // İş tamamlanana kadar bekler
// Şimdi işin sonucunu kullanabiliriz
Ancak Complete() metodu, tüm işlerin ana thread’de tamamlanmasını beklediği için performans kaybına yol açabilir. Mümkün olduğunca, işleri ana thread’den bağımsız olarak çalıştırmak ve sadece sonuçlara ihtiyaç duyduğunuzda Complete() metodunu kullanmak daha verimlidir.
Örnek Senaryo: Büyük Bir Diziyi İşleme
Şimdi, Job System’i kullanarak büyük bir diziyi işlemenin bir örneğini inceleyelim. Bu örnekte, bir dizideki her elemanı kare alacağız.
using Unity.Jobs;
using Unity.Collections;
using UnityEngine;
public class JobExample : MonoBehaviour
{
public int arraySize = 1000000;
public void Start()
{
NativeArray<float> inputArray = new NativeArray<float>(arraySize, Allocator.TempJob);
NativeArray<float> outputArray = new NativeArray<float>(arraySize, Allocator.TempJob);
// Diziyi başlat
for (int i = 0; i < arraySize; i++)
{
inputArray[i] = i;
}
SquareJob job = new SquareJob { inputArray = inputArray, outputArray = outputArray };
JobHandle jobHandle = job.Schedule(arraySize, 64); // 64 iş parçacığı kullan
jobHandle.Complete();
// Sonucu yazdır (test için)
for (int i = 0; i < 10; i++)
{
Debug.Log(outputArray[i]);
}
inputArray.Dispose();
outputArray.Dispose();
}
}
public struct SquareJob : IJobParallelFor
{
public NativeArray<float> inputArray;
public NativeArray<float> outputArray;
public void Execute(int i)
{
outputArray[i] = inputArray[i] * inputArray[i];
}
}
Bu örnekte, SquareJob, her elemanın karesini alan bir iştir. Schedule(arraySize, 64), işi 64 iş parçacığında çalıştırır. JobHandle.Complete(), işin tamamlanmasını bekler ve daha sonra sonuçlar işlenir. Bu sayede, büyük bir diziyi verimli bir şekilde işleyebiliriz.
Sonuç
JobHandle.Schedule(), Unity Job System’de paralel programlamanın temelini oluşturur. Bu yöntem, işlerin planlanması, bağımlılıkların yönetimi ve işlerin sonuçlarının alınması için kullanılır. Performans kritik uygulamalarınızda, Job System’i ve JobHandle.Schedule() yöntemini kullanarak büyük performans artışları elde edebilirsiniz. [YOUTUBE_VIDEO_BURAYA]




