Şimdiye kadar kullandığım varlık bileşen sistemleri çoğunlukla Java'nın artemisi gibi çalıştı:
- Bileşenlerdeki tüm veriler
- Yalnızca belirli sistemin ilgilendiği bileşenleri içeren her bir varlık üzerinde yinelenen durum bilgisi olmayan bağımsız sistemler (en azından başlatma sırasında girdi gerektirmedikleri ölçüde) yineleme
- Tüm sistemler varlıklarını bir kene işliyor, sonra her şey yeniden başlıyor.
Şimdi bunu ilk kez bir sıra tabanlı oyuna, oyunun ilerleyebilmesi için birbiri ile ilişkili olarak belirli bir sırada gerçekleşmesi gereken tonlarca olay ve yanıtla uygulamaya çalışıyorum. Bir örnek:
Oyuncu A kılıçtan hasar alır. Buna yanıt olarak A'nın zırhı alınan hasarı devreye sokar ve azaltır. A'nın hareket hızı da zayıflama sonucunda azalır.
- Alınan hasar, tüm etkileşimi belirleyen şeydir
- Zırh, oyuncuya hasar uygulanmadan önce hesaplanmalı ve gelen hasarlara uygulanmalıdır.
- Hareket hızı azaltma, nihai hasar miktarına bağlı olduğundan, hasar gerçekten dağıtılana kadar bir birime uygulanamaz.
Olaylar başka olayları da tetikleyebilir. Zırh kullanarak kılıç hasarının azaltılması, kılıcın parçalanmasına neden olabilir (bu, hasar azaltma tamamlanmadan önce gerçekleşmelidir), bu da buna karşılık olarak ek olaylara neden olabilir, esasen olayların tekrarlanan bir değerlendirmesine neden olabilir.
Sonuçta, bu birkaç soruna yol açıyor gibi görünüyor:
- Birçok boşa harcanan işlem döngüsü: Çoğu sistemde (işleme gibi her zaman çalışan şeyler için tasarruf edin) çalışmak için "sıra" olmadığında yapılması gereken bir şey yoktur ve çoğu zaman oyunun girmesini beklemek için harcar geçerli bir çalışma durumu. Bu, bu tür her sistemi, oyuna daha fazla devlet eklendikçe büyümeye devam eden kontrollerle doldurur.
- Bir sistemin oyunda var olan varlıkları işleyip işleyemeyeceğini öğrenmek için, diğer ilişkisiz varlık / sistem durumlarını izlemenin bir yolunu bulmaları gerekir (hasar vermekten sorumlu olan sistemin zırhın uygulanmış olup olmadığını bilmesi gerekir). Bu, ya birden fazla sorumluluğu olan sistemleri karıştırır ya da her işlem döngüsünden sonra varlık koleksiyonunu taramak ve bir şeyler yapmanın uygun olduğu zaman onlara söyleyerek bir dinleyici kümesiyle iletişim kurmaktan başka bir amacı olmayan ek sistemlere gereksinim yaratır.
Yukarıdaki iki nokta, sistemlerin, bileşenlerindeki bayrakları kullanarak durum değiştiren aynı varlık kümesinde çalıştığını varsayar.
Bunu çözmenin başka bir yolu, oyun durumunu ilerletmek için tek bir sistem çalışması sonucunda bileşenler eklemek / kaldırmak (veya tamamen yeni varlıklar oluşturmak) olacaktır. Bu, bir sistem gerçekten eşleşen bir varlığa sahip olduğunda, onu işlemesine izin verildiğini bilir.
Ancak bu, sistemleri sonraki sistemlerin tetiklenmesinden sorumlu kılar ve tek bir sistem etkileşiminin sonucu olarak hatalar görünmeyeceğinden programların davranışları hakkında akıl yürütmeyi zorlaştırır. Yeni sistemler eklemek de zorlaşıyor, çünkü diğer sistemleri tam olarak nasıl etkilediklerini tam olarak bilmeden uygulanamıyorlar (ve önceki sistemlerin yeni sistemin ilgilendiği durumları tetiklemek için değiştirilmesi gerekebilir), biraz da ayrı sistemlere sahip olma amacını yenmek tek bir görevle.
Bu benim yaşamam gereken bir şey mi? Gördüğüm her ECS örneği gerçek zamanlıydı ve bu gibi durumlarda oyun başına bir yineleme döngüsünün nasıl çalıştığını görmek gerçekten çok kolay. Ve hala renderleme için ihtiyacım var, her şey olduğunda kendisinin birçok yönünü duraklatan sistemler için gerçekten uygun görünmüyor.
Oyun durumunu ileriye taşımak için bunun için uygun olan bir tasarım deseni var mı, yoksa sadece tüm mantığı döngüden çıkarmalı ve bunun yerine sadece gerektiğinde tetiklemeli miyim?