2014-09-01 16 views
5

Dünyada, çoğunlukla ölçeklenebilirlik bölümlere ayrılan, çoğunlukla yalıtılmış bölgelerden oluşan bir açık dünya tek oyuncu RPG'si yapıyorum. Dünya birbiriyle etkileşime giren varlıklar içerir. Çoğu varlıklar, muhtemelen başka bölgelerdeki varlıklar dahil olmak üzere başka varlıklara da referans gösterecektir. being için bir sınıf tanımı ElbetteOyun dünyasındaki yüklenmemiş nesneler için referansların saklanması ve alınması

class Being { 
    weak_ptr<Being> target; 
    // other members 
}; 

gibi görünebilir, ben kaydetmek ve ve diskten oyun durumunu yüklemek gerekiyor. Şimdi, tüm varlıkların her zaman yüklü olmasını istemiyorum. Sadece şu anda yüklü olan bölgedeki tüm varlıklara ya da en kötüsü olan varlıklara yüklemek istiyorum. Bunu başarmak için iyi bir strateji nedir? Şimdiye kadar attığım birkaç fikir.

  1. Diskte, varlıklar, başvurulan her varlık için benzersiz bir tanımlayıcıyı saklar. A yüklenirken, B olarak başvuruda bulunulmuşsa, işaretçi basitçe ayarlanır. B boşaldıysa, ayrıca yüklenmelidir. Bunun dezavantajı, bu, doğrudan kullanılamayan çok fazla varlıkları tekrar tekrar yükleyebilmektir. Gerçek işaretçiler içeren varlıklar yerine, tanımlayıcılar içereceklerdir. Daha sonra referans verilen varlıklar kullanıldığında (örneğin, bir varlığın başka bir hedefe zarar vermesi gerekiyorsa), sadece gerektiği gibi yüklenir. Bu, referansları kullanarak karmaşıklaşır ve daha fazla kaydetme/yükleme işlemine neden olma potansiyeline sahiptir, ancak gereksiz verileri yüklemekten kaçınır.

Bu seçeneklere daha iyi alternatifler var mı? Bunun yaygın bir sorun olduğunu düşünüyorum, ancak SO ile ilgili soruları bulamadım.

+0

Sizin yaklaşımınız aslında nesnelerin önbelleğe alınmasıdır. Burada bir göz atın: http://stackoverflow.com/questions/17807805/how-to-cache-1000s-of-large-c-objects Ana soru, yüklenecek nesneleri bulmak için nasıl verimli hale getirileceğidir. Çünkü onların kimliğine değil, konumlarına göre değişir. – Christophe

cevap

1

Bunu yapmanıza yardımcı olması için Flyweight Pattern gibi bir şey kullanabilirsiniz. Sonra her Varlık türü gerçekten sadece bir kez yüklenir (ihtiyaç duyuldukça tembelleştirilebilir) ve her Varlık örneği yalnızca konum, hız, vb. Gibi örneğe özgü değişkenler içerir.

Bu yeterli değilse Bir tasarruf için, bir Varlığa referans sayılan bir işaretçi istemek için bir API'ye sahip bir örnek yöneticisi yazabilirsiniz. Referans nesne, imha edildiğinde örnek yöneticisine bildirir. Bu, referans yöneticinin ihtiyaç duyulduğunda diske ve diskten marşal atmasını kolaylaştırır.

+0

Maalesef, Flyweight Pattern'in bana çok fazla tasarruf sağlayacağını düşünmüyorum çünkü Beings çoğunlukla "extrinsic" veri (uzun bir istatistik listesi, envanter, vb.) Içeriyor. İkinci yaklaşım ilginç geliyor. Bu benim fikrim hayır benzer mi. 2? Eğer değilse, beni bu yaklaşımın bir örneğine bağlayabilir misiniz? Teşekkürler! –