Unity oyun geliştirme sürecinde performans, her zaman en önemli faktörlerden biridir. Özellikle büyük miktarda veriyle çalışırken, doğru veri yapılarını seçmek performansı doğrudan etkiler. Bu yazıda, Unity’nin yüksek performanslı veri yapılarından biri olan NativeHashMap<TKey, TValue>‘ı inceleyeceğiz. NativeHashMap, özellikle oyunlarda sıkça kullanılan anahtar-değer çiftlerini yönetmek için optimize edilmiş bir yapıdır.
NativeHashMap Nedir?
NativeHashMap<TKey, TValue>, Unity’nin yüksek performanslı, yönetilmeyen (unmanaged) bir hash tablosu implementasyonudur. Yönetilmeyen (unmanaged) olması, bu yapının .NET garbage collector’ının (GC) etkilerinden bağımsız olarak çalıştığı anlamına gelir. Bu, GC’nin çalışması sırasında performans düşüşlerinin yaşanmasını önler ve özellikle performans kritik bölgelerde önemli bir avantaj sağlar. TKey, anahtarın veri tipini, TValue ise değerin veri tipini temsil eder.
NativeHashMap ve Dictionary Arasındaki Farklar
NativeHashMap, Unity’de zaten mevcut olan Dictionary<TKey, TValue> sınıfına benzer bir işlevselliğe sahiptir. Ancak, önemli performans farkları vardır:
- Yönetilen (Managed) vs. Yönetilmeyen (Unmanaged):
Dictionaryyönetilen bir yapıdır ve GC’nin etkilerine maruz kalır.NativeHashMapise yönetilmeyendir ve GC’nin performans etkilerinden bağımsızdır. - Bellek Yönetimi:
NativeHashMap, belleği daha verimli yönetir ve daha az bellek ayırma/boşaltma işlemi gerektirir. - Performans: Genellikle,
NativeHashMap, özellikle büyük veri kümeleri için,Dictionary‘den daha hızlıdır.
NativeHashMap Nasıl Kullanılır?
NativeHashMap kullanımı oldukça basittir. Öncelikle, gerekli anahtar ve değer tiplerini belirleyerek bir NativeHashMap örneği oluşturmanız gerekir. Sonrasında, Add metodu ile anahtar-değer çiftleri ekleyebilir, TryGetValue metodu ile bir anahtara karşılık gelen değeri alabilir ve Remove metodu ile anahtar-değer çiftlerini kaldırabilirsiniz.
Örnek: Oyuncu Envanteri
Örneğin, bir oyuncunun envanterini temsil etmek için NativeHashMap kullanabiliriz:
using Unity.Collections;
public class PlayerInventory
{
public NativeHashMap<int, int> itemCounts;
public void Initialize()
{
itemCounts = new NativeHashMap<int, int>(10, Allocator.Persistent);
}
public void AddItem(int itemId, int count)
{
itemCounts[itemId] += count;
}
public int GetItemCount(int itemId)
{
int count;
if (itemCounts.TryGetValue(itemId, out count))
{
return count;
}
return 0;
}
public void Dispose()
{
itemCounts.Dispose();
}
}
Bu örnekte, itemId anahtar olarak, count ise değer olarak kullanılıyor. Allocator.Persistent, belleğin oyunun ömrü boyunca ayrılı kalmasını sağlar. Kullanım bittiğinde, Dispose() metodu ile belleği serbest bırakmak önemlidir.
NativeHashMap’in Avantajları
- Yüksek Performans: Yönetilmeyen yapısı sayesinde, özellikle büyük veri kümeleri için
Dictionary‘den çok daha hızlıdır. - GC Etkilerinden Bağımsız: GC’nin performans etkilerinden etkilenmez.
- Bellek Verimliliği: Belleği daha verimli yönetir.
- Paralel İşlem Uygunluğu: Çoklu iş parçacıklı ortamlarda daha iyi performans sağlar.
NativeHashMap’in Dezavantajları
- Yönetilmeyen Bellek Yönetimi: Belleği manuel olarak yönetmeniz gerekir (
Dispose()metodu). Bellek sızıntılarını önlemek için dikkatli olmak önemlidir. - Daha Karmaşık Kullanım:
Dictionary‘e göre biraz daha karmaşık bir yapıya sahiptir.
Sonuç
NativeHashMap<TKey, TValue>, performansın kritik olduğu Unity projeleri için ideal bir veri yapısıdır. Özellikle büyük veri kümeleri ile çalışırken, Dictionary‘e göre önemli performans artışı sağlar. Ancak, yönetilmeyen belleği doğru bir şekilde yönetmek için dikkatli olmak önemlidir. [YOUTUBE_VIDEO_BURAYA]




