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.
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.