ECS? Aslında, tasarımın veri odaklı tarafına çok fazla düşünmenin ve farklı temsilcileri karşılaştırmanın erken olacağını düşünmeyeceğim çünkü arayüz tasarımlarınızı etkileyebilir ve ikincisi geç saatlerde değişmek çok maliyetli oyun. Ayrıca ECS sadece çok fazla çalışma gerektiriyor ve açık bir şekilde düşünüyor ve sanırım, kalbinizin altında nasıl olacağı göz önüne alındığında, size tasarım düzeyinde performans kederini daha fazla vermeyeceğinden emin olmak için o zamanın bir kısmını kullanmaya değer. tüm ucube motoru. Bu bölüm bana dik dik bakıyor:
unordered_map<string,[yada]>
Küçük dize optimizasyonlarında bile, başka bir değişken boyutlu kabın (unordered_maps) içinde değişken boyutlu bir kabınız (dizeler) vardır. Masanız çok seyrek ise küçük dize optimizasyon karma tablonun her kullanılmayan endeks hala (SS optimizasyonu için daha fazla bellek kullanacağını ima olacağından Aslında, küçük dize optimizasyonlar aslında bu durumda yardımcı gibi zararlı olarak olabilir sizeof(string)
olurdu karma tablonuzun toplam bellek yükünün, içine depoladığınız her şeyden daha pahalı olabileceği noktaya, özellikle de bir konum bileşeni gibi basit bir bileşense, büyük adımda daha fazla önbellek özlemi oluşmasına ek olarak karma tablosundaki bir girişten diğerine geçmek için.
Dize bir bileşen kimliği gibi bir tür anahtar varsayalım. Öyleyse, bu zaten işleri önemli ölçüde daha ucuz hale getiriyor:
unordered_map<int,[yada]>
... komut dosyalarının kullanabileceği kullanıcı dostu adlara sahip olmanın avantajlarını istiyorsanız, örneğin, o zaman stajyer dizeler size her iki dünyanın en iyisini verebilir.
Bununla birlikte, dizeyi oldukça düşük yoğunlukta kullanılan endekslerle eşleyebiliyorsanız, bunu yapabilirsiniz:
vector<[yada]> // the index and key become one and the same
Bu prematüre düşünmememin nedeni, yine, arayüz tasarımlarınızı etkileyebileceğidir. DOD'un amacı, bir seferde IMO'da (genellikle gerektiği gibi yinelemeli olarak başarılması gerekir) akla gelebilecek en verimli veri temsillerini bulmaya çalışmak değil, bununla çalışmak için üstte arayüzler tasarlayacak kadar düşünmek olmalıdır. basamaklı tasarım değişiklikleri yapmadan profil oluşturmak ve optimize etmek için yeterli nefes alanınızı bırakan veriler.
Naif bir örnek olarak, tüm kodlarını buna karşı birleştiren bir video işleme yazılımı:
// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels,
// 16-bit channels, 32-bit channels, grayscale, monochrome,
// etc. pixels.
class IPixel
{
public:
virtual ~IPixel() {}
...
};
Potansiyel olarak destansı bir yeniden yazma olmadan çok uzağa gitmeyecek, çünkü tek piksel seviyesinde soyutlama fikri vptr
, görüntü düzeyinde soyutlamaya kıyasla zaten oldukça verimsiz ( kendisi genellikle tüm pikselden daha fazla belleğe mal olacak). genellikle milyonlarca pikseli temsil eder). Bu nedenle, böyle bir kabus senaryosuyla yüzleşmek zorunda kalmamanız ve ideal olarak artık veri temsillerinize yeterince düşünün, ancak burada bir şey oluşturmak istemediğiniz için bu şeyleri düşünmeye değer olduğunu düşünüyorum. ECS'nizin etrafındaki karmaşık motoru ve ECS'nin kendisinin tasarım düzeyinde bir şeyleri değiştirmenizi gerektiren şekillerde darboğaz olduğunu bulun.
ECS önbellek hatalarına gelince, bence geliştiriciler genellikle ECS'yi önbellek dostu yapmak için çok uğraşıyorlar. Paranın tüm bileşenlerinize mükemmel bir şekilde bitişik bir şekilde erişmeye çalışması için çok az patlama vermeye başlar ve çoğu zaman verilerin her yerde kopyalanması ve karıştırılması anlamına gelir. Genellikle, bileşen dizinlerini erişmeden önce sıralamak için sadece yeterince iyidir, böylece en azından bir bellek bölgesini önbellek hattına yüklemeyeceğiniz bir şekilde erişirsiniz, yalnızca onu çıkarmak ve sonra yüklemek için aynı önbellek satırının farklı bir bölümüne erişmek için aynı döngü içinde tekrar tekrar. Ve bir ECS'nin tüm dünyada inanılmaz bir verimlilik sağlaması gerekmez. Bir giriş sisteminin bir fizik veya render sistemi kadar fayda sağladığı gibi değil, bu yüzden "iyi" verimlilik yönetim kurulu ve sadece gerçekten ihtiyacınız olan yerlerde "mükemmel". Yani, kullanımıunordered_map
ve string
burada kaçınmak için yeterince kolay.