Varlık Bileşen Sistemi - Bir nesnenin Dönüşümü nasıl uygulanır?


11

Motorum için bir varlık bileşeni sistemi tasarlarken, belirli bir bileşen türünü depolama ve alma yolunda küçük bir engelle karşılaştım.

İlk olarak, bu soruda kullanacağım terminolojiyi biraz açıklayayım:

  • " Bileşen " i belirli bir sistem için ilgili verileri depolayan bir veri yapısı olarak adlandırıyorum.
  • Kullanıcıya oyun durumunu / arayüzünü güncellemek için Bileşenleri kullanan yöntemlerin ve veri yapılarının toplanmasını " Sistem " olarak adlandırıyorum .
  • " Varlık " temel olarak sadece belirli bileşenleri almak ve oyun mantığındaki verilerini değiştirmek için kullanılan bir kimliktir.

Her sistem, veri üzerinde verimli bir şekilde tekrarlayabilmesi için kendi Bileşen tipinde (örneğin, Fizik-> Fizik Bileşeni, AI-> AIComponent, Rendering-> RenderingComponent) bir (ID-mapped) dizisine sahiptir.

Bununla birlikte, tüm bileşenlerin özel olarak bir sisteme ait olması gerekmez. Örneğin, bir Transform bileşeni bir nesnenin konumunu, dönüşünü ve ölçeğini saklar. Fiziksel, Yapay Zeka, İşleme gibi birçok sistem tarafından kullanıldığı için, bir varlığın en önemli kısımlarından biridir (Birlik onu zorunlu kılar).

Karşılaştığım sorun bu. Transform birçok başka sistem tarafından kullanıldığından, her bir Bileşen için kullanmak üzere bir tane almaya nasıl başlamalıyım? Gördüğüm olası bir çözüm, her bir Bileşenin kendi Varlık Kimliğini depolamasını sağlamaktır. Bunun gibi herhangi bir bileşeni almak kolay olurdu, ancak bu kadar verimli olmayacaktı ve aynı zamanda, başka hiçbir şeyin farkında olmayan, izole edilmiş ve bağımsız bir veri paketi olarak bir Bileşen kavramına karşı çıkacaktı.

Bu sorunu çözmenin uygun bir yolu var mı? Dönüşüm bile bir bileşen olmalı mı?


3
+1 için "İlk olarak, bu soruda kullanacağım terminolojiyi biraz açıklığa kavuşturayım:"
Vaillancourt

Bu tür soruları bu sitede daha fazla görmek isterim. +1
S. Tarık Çetin

Tüm bileşenleri global değişkenler olarak saklayın
Miles Rout

Yanıtlar:


2

Bu oldukça geniş bir sorudur, cevabı kesinlikle mimarinize bağlıdır. Ancak, size genel bir cevap vermeye çalışacağım.

Fizik ve render sistemleriniz kesinlikle dönüşümü gerektirecek, ancak AI sistemi gerektirmeyecek. Bu nedenle, dönüşümü kendi bileşen sınıfına kapsüllemek mantıklıdır. Bu tür ilgili tüm sistemler aynı verileri kullanır, bu nedenle varlığın dönüşüm nesnesine bir işaretçi veya başka bir yerde saklanan bir dönüşüm nesnesinin kimliğine sahip olması mantıklıdır.

İkinci çözümü seçerseniz, dönüştürmeyle ilgilenen her sistem, dönüştürme nesnesinin depolandığı yere erişim gerektirir.

Birincisini seçerseniz, her sistemin yapması gereken tek şey varlığın kendisine erişmek ve dönüşümü istemektir.

Önceki durumda, sorun, bu tür şeyleri önemsiyorsanız, OOP kurallarını ihlal etmeden, her sisteme dönüşüm için depolamaya nasıl erişim verileceği haline gelir.

İkinci durumda böyle bir sorun yoktur, ancak bileşen nesnelerinin kimlikleri yerine nesnelere işaretçiler depolamak için varlık nesnesi tasarımınızı değiştirmenizi gerektirir.

Kişisel tercihim, varlık tasarımını birçok tasarım sorununu basitleştirdiği için bileşen nesnelerine işaretçiler depolayacak şekilde tasarlamaktır. Bu şekilde, dönüşüm gerektiren her sistem onu ​​varlıktan talep edebilir ve istemiyorsa yok sayabilir. Bununla birlikte, bu, işaretçilerin doğasında olan, önbellek maliyetinin kaçırdığı bir hesaplama yükü taşır.

Bununla ilgili daha fazla bilgi için bu ECS'ye Genel Bakış'a göz atın .

Günün sonunda, hangisinin sizin için daha önemli olduğuna karar vermek size kalmıştır: gelişme kolaylığı veya performans.

Son olarak, sorunuzun ECS taraftarlarının düşündüğü tasarım sorularının mükemmel bir örneği olduğunu ve kesin gümüş kurşun çözümünün olmadığını belirtmek isterim.


Önerileriniz için teşekkürler. Yine de bir sorum var: AI sisteminin neden bir nesnenin konumuna ihtiyacı olmasın?
CRefice

Bir Çeviri ile pozisyonu karıştırırsınız (3 float vektörü) (bir pozisyon vektörünün oluşturduğu dönüşüm matrisi). Transformasyon matrisi, çeviri, döndürme ve ölçek dönüşümlerinden oluşturulur. Bu, bir AI sisteminin ihtiyaç duyduğundan çok daha fazla bilgidir, ancak kesinlikle konum vektörünü buradan çıkarabilirsiniz. Şahsen, pozisyon, yönlendirme ve boyutları kendi bileşenlerine ayırırım ve Dönüştürme'yi oluşturmak ve güncellemek için bunları kullanırdım.
Ian Young

@IanYoung Bunları ayırmak, konum ve yönelimi ayrı ayrı konumlandırdığınızdan veya yönlendirmenizden daha sık birlikte bulmanız gerektiğinde bulursanız, yarardan daha fazla zarar verebilir. Bu durumda, konum ve yönlendirme veri özniteliklerini tek bir bileşene yerleştirmek önbellek performansını artırabilir.
Naros

1
Benim tercihim, üçü, konumu, yönü ve ölçeği tek bir bileşende birleştirmek ve belirli bir alt sistemin sadece bir konuma veya yönlendirmeye ihtiyaç duyması durumunda, verileri çoğaltmayı ve oyun döngüsünde açıkça tanımlanmış noktalarda senkronize etmeyi savunurdum .
Naros

@Naros evet demek istediğim budur: Konum, hız, yön ve açısal hızı içeren İki Bileşen, Dönüştürme ve (benim çerçevemde) SpatialData. Konum ve yönlendirme, Dönüşümü oluşturmak ve güncellemek için kullanılır.
Ian Young
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.