anasayfa / blog / performans
Yayın: 2 Mayıs 2026 11 dk okuma performans
DOTS/ECS geçişinden sonra öğrendiklerim

DOTS/ECS geçişinden sonra öğrendiklerim

Bir üretim projesini kısmen ECS'e taşıdık ve frame süresi %34 düştü. Ama kazanç sandığımız yerden gelmedi.

Neden taşıdık

Sahnede eş zamanlı 3.000'e yakın hareketli varlık vardı ve profiler'ın tepesinde sürekli aynı şey duruyordu: MonoBehaviour.Update çağrılarının toplamı ve bunların yol açtığı önbellek ıskaları.

Amacımız her şeyi ECS'e taşımak değildi. Sadece kalabalık, tekdüze ve çok sayıda olan şeyleri taşıdık: mermiler, sürü birimleri, parçacık mantığı.

Asıl kazanç bellek düzeninde

Herkes Burst'ün SIMD kazancından bahsediyor. Ölçümlerimizde asıl fark oradan gelmedi; verinin bellekte bitişik durmasından geldi.

3.000 nesneyi ayrı ayrı heap'ten okumakla, 3.000 pozisyonu tek bir dizide sırayla okumak arasındaki fark, aynı matematik için 8 kata varan bir zaman farkı yarattı.

Karma mimarinin bedeli

Projeyi tamamen ECS yapmadığımız için iki dünya arasında köprü kurmak zorunda kaldık. Bu köprü, beklediğimizden çok daha fazla iş çıkardı.

Tavsiyem: sınırı baştan net çizin. Hangi sistemler ECS tarafında, hangileri klasik tarafta ve aralarındaki veri akışı tek yönlü mü — bunlara kod yazmadan önce karar verin.

MoveSystem.cs
[BurstCompile] public partial struct MoveSystem : ISystem { [BurstCompile] public void OnUpdate(ref SystemState state) { float dt = SystemAPI.Time.DeltaTime; foreach (var (xf, vel) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<Velocity>>()) { xf.ValueRW.Position += vel.ValueRO.Value * dt; } } }
csharpMoveSystem.cs

Ne zaman değmez

Varlık sayınız birkaç yüzü geçmiyorsa ECS'in getirdiği karmaşıklık kazancından büyüktür. Ekip ECS'i bilmiyorsa öğrenme maliyetini de hesaba katın.

Karar için basit bir eşik kullanıyorum: aynı davranışı yapan 500'den fazla nesne varsa ve bunlar her frame güncelleniyorsa, taşımaya değer.

← Tüm yazılar