Bir oyun motorundaki varlıkları belirleme?


12

Yüklenen varlıklarımı tanımlamak istiyorum, ancak hangisini seçmem gerektiğini bilmiyorum. 2 seçenek vardır:

  • İsim (dize)

    • Bu, unordered_map (O (1)) ile en kolay ve hızlıdır, ancak tamsayıları kullanmaktan çok daha yavaştır.
    • Kodda kolayca anlaşılabilir.
  • tamsayılar

    • En hızlı.
    • Kodda anlaşılır değil.

Dizelerin çok güvenli veya hızlı olmadığını biliyorum, ama o kadar kötü mü, yoksa sadece bir AAA başlığında kötü sayılıyor mu? Tamsayı kullanmak için numaralandırma yapabilir, ancak çalışma zamanında bir dosyadan sahne, varlıklar vb. Çalışma zamanında oluşturulursa bu tam sayıları okunabilir yapmanın bir yolu var mı?

Bu konunun internette birkaç konu olduğunu biliyorum, ama bu hangi durumlarda bu kadar önemli olduğunu bulamadım.


10
Neden her ikisinin bir uygulaması değil? Dize sürümü bir Dictionary <string, int> bağlanır ve bu da bir Dictionary <int, Asset> çağırır. Dize tabanlı katmanı kodda atlayabilir, ancak kullanıcı etkileşimi için dize tabanlı katmanı kullanabilirsiniz.
Krythic

2
Krythic'in görüşüne göre ikinci olurdum. Kodunuz hız için tamsayıları seviyorsa, kodunuzun tamsayılar kullanmasına izin verin. Kullanıcılarınız okunabilirlik için dizelerden hoşlanıyorsa kullanıcılarınızın dizeleri kullanmasına izin verin. İkisi oldukça mutlu bir şekilde bir arada var olabilir (ve ek yükü tamamen serbest bırakmak istiyorsanız, dize sürümünü yalnızca geliştirme yapılarına seçici olarak derleyebilirsiniz)
DMGregory

Biraz farklı bir bağlamda aynı problem: Farklı madde uygulama yöntemleri - farklar nelerdir?
Philipp

Yanıtlar:


19

Her ikisini de destekleyebilirsiniz.

Çalışma zamanında varlıklara bir tamsayı veya karşılaştırması hızlı bir anahtarla başvurmak genellikle daha verimli olsa da, tasarım zamanında onları isimle referanslamak genellikle daha etkilidir, çünkü insanlar gibi isimlerle çalışma konusunda çok daha enemy_bullet_casing_soundiyidir 72910613.

Kaynakları doğrudan aramak için bir tamsayı anahtarı kullanın ve bu tamsayıyı mümkün olan her yerde kodda kullanın (burada bir tamsayı gerçek değerini bir değişkene koyabilir ve böylece onunla daha kolay çalışabilirsiniz). Adından bir eşleme sağlayın için (daha doğrusu doğrudan kaynağa göre) o tamsayı tuşu ve gerçek tamsayı anahtarını çözmek ve varlık bulmak Eğer varlıklara adlandırılmış başvurular karşılaştığınızda bu eşleştirmeyi kullanın.

Ad tabanlı aramayı kullanmak, veri dosyalarınızla çalışmayı çok daha kolay hale getirir ve adı daha hızlı bir anahtarla eşleştirmek, gereken her yerde daha hızlı, tamsayı tipi bir anahtarın tüm önemli avantajlarını korur.


Benim durumum: Bir Nesnenin materyalini değiştirmek istiyorum, bu yüzden yeni materyalin adıyla bir istek gönderiyorum. (dize) Sonra grafik sisteminde bir <string, pointer> sınırsız haritada arama yapılır ve nesnenin malzemesinin pointer yeni işaretçisiyle değiştirilir. Yani benim durumumda, bunu bir tamsayıya dönüştürmem gerekmiyor mu? (çünkü işaretçiyi dönüştürdüğümden ve işaretçiler kullandığım sık kullanılan algoritmalarda, yalnızca ara sıra şeyler için dizeler kullanıyorum.)
Tudvari

Yoksa mümkün olan her yerde işaretçiler yerine tamsayı kimlikleri mi kullanmalıyım? (Yani, örneğin malzemenin başlık dosyasını dahil etmek zorunda değilim.) Örneğin, oluşturucu bileşen kullanılan grafikte doğrudan grafik motoru tarafından kullanılabilen işaretçiyi saklar, ancak Material.h . Ancak yalnızca tamsayı renderer bileşeninde sakladığımda, Material.h eklemem gerekmiyor, ancak işaretçiler dizisinde tamsayı tabanlı bir arama yapmak zorundayım. Sanırım ikincisi daha iyi. Bu mu? Bunu tekrar gözden geçirmeli miyim?
Tudvari

1

Projemde, benzersiz (keşke!) Sayılarda derleme sırasında dönüştürülmüş karma dizeleri kullanıyorum. Yani, bir kaynağa ihtiyacım olduğunda, örneğin bir dokuya

MngTexture->get(hash("my_texture"))

Ve basit bir varlık sistemi çerçevesi oluşturduğumdan ve dosyalardan bileşen verilerini yüklemem gerektiğinden, veri depolamak için json gibi basit bir dil oluşturdum, ancak derlenebilir (kelimeleri ve karakterleri rakamlardan sayıya ve dizelerden karma değerlere dönüştürmek) . Bu nedenle, örneğin, veri dosyamdaki dokuyu ID karma ("my_texture") ile "ball.PNG" ye bağlamak istersem,

|my_texture| = "ball.PNG"

Nerede || derleyiciye içerideki sözcüğü toplamasını söyleyen bir operatördür.

Yani temelde hem gerçek kodda hem de bileşenleri yüklemek için akış olan dosyalarda derleme zamanında ints ile eşlenen dizeleri kullanıyorum (böylece herhangi bir ek yükü yok). Karma bir derleme zamanı hesaplamak için sadece google, 5-10 satır kod basit bir işlevi.

Elbette dizeyi dosyalarınızdan yükleyebilir ve çalışma zamanında hashes, bu durumda sözlüğü kendi başınıza yazmak zorunda değilsiniz, çünkü algoritma sizin için yapacak (dizelerden tamsayılar oluşturma) ve ben bellek konumundan ötürü en azından bir haritada arama yapmak kadar hızlı olduğunu düşünün (sadece birkaç bayt uzunluğunda bir dize üzerinden geçiyorsunuz).

Umarım bu yardımcı olabilir.


0

Nesneyi dizelerle tanımlamak uygun değildir, ints çok daha verimlidir. Kolaylık sağlamak için, tasarım zamanında ve hata ayıklama sırasında yardımcı olması için dizelerden oluşan bir dize tablosunu (veya sözlüğünü) koruyabilirsiniz.

Bununla birlikte, temel oyun kodunuzda yalnızca tamsayı kimliğiyle (veya okunabilirlik için bir numaralandırma) nesnelere başvurduğunuzu savunurum. Bunu yapmak, dize tablosunu ayrı bir varlık olarak bölmeyi kolaylaştırır. Çekirdek oyun kodunuz bu dize tablosuna bağlı değilse, potansiyel olarak önemli miktarda bellek tasarrufu sağlayan serbest bırakılan oyundan düşürebilirsiniz - bir mobil oyun üzerinde çalışıyorsanız ve indirme boyutlarını küçük tutmak istiyorsanız mümkün.

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.