Kaynak Yöneticileri - İyi mi?


20

Kaynak kodunda birçok kez gördüm, bunun gibi şeyler [iyi, bu daha sahte bir C ++ fikrimdir]

typedef shared_ptr<Resource> ResourcePtr;// for ease  
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");  
sound1->Play();  
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");

Sadece böyle bir sınıfın ne kadar yararlı olduğunu merak ediyordum:

  • Yüklenen medya dosyaları
  • Onları hafızada sakladı
  • Bunu bir seviye yükleme ekranının başlangıcında yaptı.
  • Temizledik

Bir sisteme sahip olmak yerine:

  • Kaynaklar yalnızca kuruluşlar tarafından tutulur veya serbest kalır.
  • Belleğe kendi yüklemesinden sorumludur.

Birincisi bu şekilde bir 'yönetici'; Hissettiğim bir şey kullanmanın yanlış olduğunu gösteriyor. Bununla birlikte, yüklenmesi gereken her şeyi bulmak yerine karıştırmak yerine, kaynak isimleri vektörü gibi bir şeyin geçirilmesine izin verir.



1
Tam olarak değil. Bunun geçerli bir soru olduğunu düşünüyorum.
Ricket

Tam olarak değil, benzer alanlar ve benzer artıları / eksileri. Ancak, bir manifesto ile yapmayacağınız yönetici ile yapacağınız şeyler var. Manifestler, farklı kaynakları tek bir endekste bir araya getiren aptal şeylerdir. Bir kaynak yöneticisi çok daha fazla sorumluluğa sahip olabilir ve oyun motoruyla daha iyi arayüz oluşturabilir.
MrCranky

Aynı şeyi sorduğumu sanmıyorum. Bir tür kaynak yükleyici / önbellek türü şey sormak istiyorum, bu tür bir dosya yolu kısaltıcı olup olmadığını soruyor gibi görünüyor. Ancak, ben varlık yerine kaynak kullandığımda bu arama görünmedi düşünüyorum.
Komünist Ördek

2
@Bryan, "varlık yöneticileri iyi bir fikir mi" diye katılmıyorum "varlık yöneticilerini nasıl uygularsınız" dan farklı bir soru. Bazı insanlar ikinci soru için ilk soruyu cevaplamaya çalışıyorlardı ki bu da çok fazla örtüşmeye neden olacaktı.
Tetrad

Yanıtlar:


20

İyi bir kaynak yöneticisi, oyununuzun 'motorunun' ne kadar iyi ve ne kadar esnek olacağının anahtarıdır.

Düşük düzeyli kaynak yönetimi ile ilgili birçok sorunu çözmekle kalmaz, aynı zamanda kaynakların sadece bir kez yüklenmesini ve daha önce yüklenmişse tekrar kullanılmasını sağlar.

Kaynak sistemi iyi bir şekilde soyutlanırsa, temel bilgiler dosya sistemi, physfs depolama, hatta sql arasında dikkatli olabilir ...

Sadece bir kaynak istersiniz ve size verilir.

Kaynak kimlikleri ve bunun gibi şeyler hakkında endişelenmenize gerek yok.

Yinelenen kaynak çakışması yönetimi vb.

Kaynak yöneticisinin bunu çözmesine izin verin.

Nasıl tasarladığınıza bağlı olarak - C ++ varsa, sahipliğin düzgün bir şekilde ele alındığından emin olmak için senaryo sınıflarınızla arkadaş olun.

Kaynak Havuzu ?

Sorun değil.

Kaynakları serbest bırakmayı mı unuttunuz?

Sorun değil.

Nerede olursa olsun kaynaklarla aynı arayüz: bellek, disk, arşiv, ağ.

Sorun değil.

Akış mı yapmak istiyorsunuz?

Threading?

Kaynak yönetimi merkeziniz bununla ilgilensin.

Ayrıca, kaynaklar kullanıma hazır olduğunda sizi bilgilendireceğinden emin olabilirsiniz.

Ogre 3D'nin çok esnek bir kaynak yönetim sistemi var, ama eminim başkaları da var.


1
Bu cevap için sana teşekkür etmeliyim. Bunu okumadan önce özel bir kaynak yöneticisinin faydasına ikna olmadım ve şimdi çok yakında bir tane uygulayacağım.
Jake McArthur

13

Geçenlerde benim durumum için oldukça iyi çalışan bir kaynak yöneticisi yazdım. Ana Özellikler:

  • Kaynaklar dize kimliğiyle istenir, örneğin ResourceManager::instance().getTexture("textures/player.png"). Doku kimliği şu anda doğrudan geliştirme sırasında uygun olan diskteki bir dosyaya eşlenmiştir, ancak bu daha sonra bazı arşivlerde arama ile değiştirilecektir.

  • Kaynak yöneticisi, kaynakların kimlikleri eşlemesine bağlı olduğundan, önceden yüklenmiş bir kaynağı yeniden yüklemez.

  • Yukarıdaki çağrı bir Texturenesneyi değil , bir nesneyi döndürür Resource<Texture>; arayanın Resource<Texture>nesneyi saklaması beklenir , gerçek doku değil. Resource<Texture>Bir akıllı işaretçi gibi davranır Texture; Bunu operator*()döner Texturenesnenin kendisi. Avantajı, gerçek dokunun tüm istemcileri güncellemeye gerek kalmadan yeniden yüklenebilmesi veya kaldırılabilmesidir.

  • Kaynak yöneticisi, diskteki dosyaların değişip değişmediğini düzenli olarak kontrol eder ve gerekirse yeniden yükler. Bu, dokuları veya gölgelendiricileri değiştirmeme ve oyunu yeniden başlatmadan sonucu görmeme izin veriyor.

  • Kaynaklar birbirine bağımlı olabilir. Kaynakların tümü olmasa da çoğu, Fileyüklendikleri dosya olan bir kaynağa bağlıdır . Örneğin, bir model bir dokuya bağlıysa, doku her diskte değiştiğinde model yeniden yüklenir.

  • Bir kaynak bulunamadığında veya yüklenemediğinde, varsayılan bir kaynak sessizce değiştirilir. Bu, henüz çökmediğim kaynakları oyuna çarpmadan kullanmama izin veriyor. (Planlanan özellik: GPGPU gölgelendiricileri gibi, oyunun hiç düzgün bir şekilde çalışamayacağı "temel" kaynakları belirtin.)

  • Referans sayımı ve kullanılmayan kaynakların boşaltılması kolayca eklenebilir. Oyunum oldukça küçük olduğu için henüz buna ihtiyacım olmadı.

Bence bu özellik listesi, kaynak yöneticilerinin iyi olabileceğini gösteriyor!


2

Kaynak yöneticisine sahip olmanın nedenlerinden biri kaynakların paylaşılmasıdır. Örneğin, çağırdığınızda resourceManager.Get("sprite.png"), "sprite.png" zaten yüklüyse, kaynak yöneticisi yeni bir görüntü oluşturmak ve bunu diskten yeniden yüklemek yerine, önceden yüklenmiş hareketli grafik kaynağına bir işaretçi döndürebilir.

Bir kaynak yöneticisi de kaynakları önbelleğe alabilir, böylece bir kaynağa son referans bırakılsa da, kaynak yöneticisi yakın gelecekte yeniden yüklenmesi durumunda onu bellekte tutmayı seçebilir. Kaynak yöneticisi, kaynaklarınızla tüm bellek yönetimini otomatik olarak ele alacak şekilde programlanır.

Son olarak, çok kullanışlı bir özellik, kaynakların oyun içi yeniden yüklenmesi. Kaynak yöneticisi tüm oyun kaynaklarına sahip olduğu için, tüm kaynakların diskten yeniden yüklenmesine ve oyunu gerçek zamanlı olarak güncellemesine neden olan bir işlev oluşturabilirsiniz, bu da oyununuzla çalışan sanatçılar / tasarımcılar için son derece yararlıdır .


1

Bir diğer avantajı, önbellekleme ve referans sayımının yanı sıra bağımlılıkları (model a ihtiyaç dokusu b? Sizin için alacağım!) Ve yükleme sırası sorunlarını (gölgelendiricinin ne gerektirdiğini bilmesi gereken model mi? modeli yüklemeden önce!)

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.