Bir varlık kimliği sistemi kullanmanın faydaları nelerdir?


12

Şu anda Örnek Programlama Oyunu AI kitabını okuyorum.

Kitap, oyundaki her bir varlığa benzersiz kimlik numaraları atamasından bahsediyor. Genellikle işletme zaman bir kontakt işletme için ihtiyaç B , A bir referans alır B göndererek B bir üzere ID'niz EntityDatabase sınıfı. Bu sınıf kimlik numaralarını alır ve varlıklara referanslar döndürür.

Bazı varlıkların kimlik numaraları, bazı varlıkların (ana oyun karakterleri) kimliklerini içeren bir dosyadan da getirilebilir.

Sorum şu: Bunu neden yapayım? Neden doğrudan referanslarla çalışamıyorum? Doğrudan referans almak bazen zor olabilir mi? Kimlik sistemi kullanmak ortak bir yaklaşım mıdır? Kimlik kullanmayan oyunlar var mı?

Oyun geliştirmede yeniyim. Lütfen bir varlık kimliği sistemiyle çalışmanın faydalarını açıklayın. Avantaj ve dezavantajlar. Somut örnekler çok iyi olurdu. Teşekkürler

Yanıtlar:


18

Referanslar birçok durumda iyi sonuç verir. Ancak, referansların iyi çalışmadığı üç önemli durum vardır:

  • Ağ oluşturma . Varlıkların durumunu ağ üzerinden senkronize etme hakkında bilgi gönderirken referanslar kullanılamaz. Uzak makineler kimin hakkında konuştuğunuzu bilmesi için varlığı bir şekilde tanımlamanız gerekir.
  • Kaydetme / yükleme . Oyununuzun durumunu diske kaydederken, nesne referansları onunla devam edemez. Yani durumu yüklerken, Referans tarafından hedeflenen B Varlığı olan A Varlığı artık kimi hedefleyeceğini bilemez. Bellek konumları farklı, nesneler farklı.

  • Bellek yönetimi . Referansları depolamak için merkezi bir yere sahip olmak, bir varlığı silerken, belleğin temizlenmesi için tüm varlıklarınızı gözden geçirmeniz ve referansları kaldırmanız gerekmediği anlamına gelir. Referanslar sadece gerektiğinde kullanılmalı, daha sonra başka bir kuruluşta kaldırılmalıdır. Referans sayılarını azaltmak, yalnızca etkileşimde bulundukları son şey veya başka bir varlık tarafından başvurulan zombi varlıklarına sahip olmamanızı sağlar. Bu aynı zamanda, eğer bir varlık hala mevcutsa, standart bir test yöntemi ile null referansları önlemeye yardımcı olur.


2
son paragraf kendi mermi noktası olmalıdır (bellek yönetimi). Bir sınıfın bir süre için başka bir varlığa referans vermesi gereken durumlar vardır, ancak varlık referansı geçersiz hale gelebilir (yani mermi hedef varlığı öldü). Bir varlık kimliğiyle istekte bulunurken NULL döndürerek, her sınıf varlık başvurusu geçersiz olduğunda doğru olanı (çökmek yerine) yapma sorumluluğunu üstlenir.
LearnCocos2D

Cevabın için teşekkür ederim. Açıklığa kavuşturulması gereken bir soru. Genel olarak: A işletmesinin B işletmesine bir referans alması gerektiği durumlarda (ona saldırmak için, ona bir mesaj gönderin, onunla çarpışmayı kontrol edin veya başka bir nedenle) - Kimlik sistemini kullanmak için kullanmalı mıyım? Anlayın, ya da referansı doğrudan almak bazen uygun olabilir mi? Anlamı: A işletmesi her zaman EntityManager'dan referansı ona B varlığının kimliğini (varlık referanslarını ve kimlik numaralarını çapraz referanslar) göndererek almalı ve ancak o zaman EntityManager referansını kullanarak B varlığına başvurmalı mıdır? Her zaman kimlik sistemini kullanmalı mıyım?
Aviv Cohn

Veya referansı doğrudan almak bazen uygun olabilir mi? Başka bir deyişle, A varlığı ne zaman içinde saklanan referansı elde etmek için EntityManager'ı kullanmalı ve A varlığı ne zaman olursa olsun B'ye bir başvuru getirebilir mi?
Aviv Cohn

Buna gerçek bir doğru cevap yok. Şahsen, varlık sistemini oyun mantığından bağımsız olacak şekilde tasarlardım. Bu, oyun mantığının doğrudan varlık referanslarına erişimi olmadığı anlamına gelir. Esasen, bir varlığa mevcut yöntemin yerel kapsamının ötesinde herhangi bir referans sağlamaktan kaçınırım. Bu, bir varlığın bileşenleri üzerinde her çalıştırmadan önce EntityManager'ı kullanmak anlamına gelir.
MichaelHouse

Anlıyorum. Ne demek istediğini anlayıp anlamadığımı görmek için bir örnek kullanayım. Diyelim ki çarpışma tespiti için tek tip bir ızgara kullanıyorum. Izgara 2d dizisidir. Her varlığın yalnızca ızgaradaki aynı 'hücrede' varlıklar ile çarpışma olup olmadığı kontrol edilir. "Normal" yaklaşımını kullanarak, her hücre temsil ettiği alandaki GameEntity nesnelerine referanslar tutacaktır. "Kimlik sistemi" yaklaşımını kullanarak, her hücre varlıkların kimlik numaralarını tutacaktır. Bu numaralar çarpışma algılaması için somut referansları almak üzere EntityManager'a gönderilir. Bu iyi bir anlayış mı?
Aviv Cohn

2

Son bir şey, Nesne Havuzu desenini kullanıyorsanız ve varlık öldüğü (örneğin) ve başka bir yerde yeniden doğduğu için bir varlık sıfırlanırsa, bir referans yine de aynı varlığı (hata) gösterecek ve bir kimlik artık kalmayacak geçerli.

ID 5067, 0x8765 yaratık adresini işaret eder ve başka bir yaratık kimliği yaratılır 7073 olarak sıfırlanır Birisi ID 5067'yi kontrol eder, 0x8765'i işaret eder, ancak bu yaratık şimdi ID 7073'e kaydedilir ve böylece varlık kimliği veritabanı eski bir kimlik kullandığınızı bilir ve sizi bilgilendirir, ulaşmaya çalıştığınız canlı artık aktif değildir.

Byte56'nın bahsettiği tüm harika nedenler, referansları doğrudan kullanmaktan kaçınmanın neden iyi bir tasarım olduğudur.

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.