Unity Oyun Motorunda ECS (Entity Component System) Mimarisine Geçiş
100.000 Objeyi 60 FPS'te Renderlamak Mümkün mü?
Unity ve Unreal Engine gibi oyun motorlarında yıllarca Nesne Yönelimli Programlama (OOP) ve geleneksel MonoBehaviour yapısı kullanıldı. Bir oyunda bir obje yaratır (Entity), ona sağlık ve pozisyon verisi atar ve Update() metodu içinde her karede (Frame) bunu hesaplardınız. Ekranda 10.000 asker olduğunda, işlemcinin önbelleği (Cache) yetersiz kalır ve FPS 5'lere kadar düşer.
ECS Mimarisi (Data-Oriented Design)
Unity'nin yeni DOTS (Data-Oriented Technology Stack) sisteminin kalbi olan ECS, veriyi ve mantığı birbirinden tamamen koparır.
Entity: Sadece bir kimlik (ID) numarasıdır. İçinde hiçbir kod barındırmaz.
Component: Sadece saf veridir (Struct). Örneğin sadece X, Y, Z pozisyon değişkenlerini barındıran bir PositionComponent.
System: İş mantığıdır (Logic). Ekrandaki tüm PositionComponent'leri alır ve onlara aynı matematiksel işlemi uygular.
CPU Cache Verimliliği
Bu yapının sırrı RAM yerleşimindedir. ECS, birbiriyle ilgili verileri RAM'de arka arkaya, bitişik (Contiguous) bloklar halinde dizer. İşlemci RAM'den veri çekerken tek tek değil, bir blok halinde Cache (L1/L2 önbellek) içine alır. Veriler arka arkaya dizildiği için CPU bekleme yapmaz (Cache Miss yaşanmaz) ve on binlerce işlem eşzamanlı (Multithreading) olarak nanosaniyeler içinde tamamlanır.
Unity ECS mimarisinde dataları bellekte bitişik (contiguous) tutmak CPU Cache Miss oranını sıfıra yaklaştırıyor. Binlerce objeyi render etmek artık çok kolay.
Cevap yazmak için giriş yapmalısınız.
Giriş Yap