Manajer Sumber Daya - Apakah mereka ada gunanya?

20

Saya telah melihat banyak waktu dalam kode sumber, hal-hal seperti ini [well, ini lebih merupakan ide C ++ palsu saya]

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

Saya hanya ingin tahu seberapa berguna kelas seperti ini, sesuatu yang:

  • File media yang dimuat
  • Menyimpannya dalam memori
  • Apakah ini pada awal layar pemuatan level.
  • Dibersihkan

Alih-alih memiliki sistem:

  • Sumber daya dipegang oleh entitas saja, atau longgar.
  • Bertanggung jawab untuk memuat sendiri ke dalam memori.

Yang pertama adalah 'manajer'; sesuatu yang saya rasakan menunjukkan itu salah untuk digunakan. Namun, ini memungkinkan untuk sesuatu seperti vektor nama sumber daya untuk dilewatkan, daripada harus berebut menemukan segala yang perlu dimuat.

Bebek Komunis
sumber
1
Tidak persis. Saya pikir ini adalah pertanyaan yang valid.
Ricket
Tidak cukup, tetapi bidang serupa, dan pro / kontra serupa. Tetapi ada beberapa hal yang akan Anda lakukan dengan manajer yang tidak akan Anda lakukan dengan manifes. Manifes adalah hal-hal bodoh yang hanya mengumpulkan bersama sumber daya yang berbeda menjadi satu indeks. Seorang manajer sumber daya dapat memiliki lebih banyak tanggung jawab, dan berinteraksi lebih baik dengan mesin permainan.
MrCranky
Saya tidak berpikir saya menanyakan hal yang sama. Yang tampaknya bertanya apakah Anda harus memiliki semacam penyingkat path file, sedangkan saya bertanya tentang semacam jenis sumber daya loader / cache. Namun, saya pikir itu tidak muncul dalam pencarian karena saya menggunakan sumber daya daripada aset.
Bebek Komunis
2
@Bryan, saya tidak setuju, "manajer aset adalah ide yang bagus" adalah pertanyaan yang berbeda dari "bagaimana Anda menerapkan manajer aset". Memang, beberapa orang mencoba menjawab pertanyaan pertama untuk pertanyaan kedua, yang akan menyebabkan banyak jawaban tumpang tindih.
Tetrad

Jawaban:

20

Manajer sumber daya yang baik adalah kunci untuk seberapa baik - dan seberapa fleksibel - 'mesin' permainan Anda nantinya.

Tidak hanya memecahkan banyak masalah dengan manajemen sumber daya tingkat rendah, tetapi juga membantu memastikan bahwa sumber daya dimuat hanya sekali, dan kemudian digunakan kembali jika sudah dimuat.

Jika sistem sumber daya diabstraksi dengan baik, detail yang mendasarinya dapat waspada antara sistem file, penyimpanan physfs, ...

Anda hanya meminta sumber daya, dan itu diberikan kepada Anda.

Tidak perlu khawatir tentang ID sumber daya dan hal-hal seperti itu.

Penanganan konflik sumber daya rangkap, dll.

Biarkan manajer sumber daya mengatasinya.

Bergantung pada bagaimana Anda mendesainnya - jika C ++ maka bertemanlah dengan kelas scenemanaging Anda untuk memastikan bahwa kepemilikan ditangani dengan benar.

Kolam sumberdaya ?

Tidak masalah.

Lupa melepaskan sumber daya?

Tidak masalah.

Antarmuka yang sama dengan sumber daya di mana pun mereka berada: memori, disk, arsip, jaringan.

Tidak masalah.

Apakah Anda ingin streaming?

Threading?

Biarkan hub manajemen sumber daya Anda menanganinya.

Dan Anda dapat yakin bahwa itu akan memberi tahu Anda ketika sumber daya siap digunakan.

Ogre 3D memiliki sistem manajemen sumber daya yang sangat fleksibel, tetapi saya yakin ada yang lain 'di luar sana'.

Jacobs
sumber
1
Saya harus berterima kasih atas jawaban ini. Saya tidak yakin dengan utilitas manajer sumber daya yang berdedikasi sebelum saya membaca ini, dan sekarang saya akan segera menerapkannya.
Jake McArthur
13

Baru-baru ini saya menulis manajer sumber daya yang bekerja cukup baik untuk kasus saya. Fitur utama:

  • Sumber daya diminta oleh ID string, misalnya ResourceManager::instance().getTexture("textures/player.png"),. ID tekstur saat ini dipetakan langsung ke file pada disk, yang nyaman selama pengembangan, tetapi ini nantinya akan diganti dengan pencarian di beberapa arsip.

  • Manajer sumber daya memegang peta ID untuk sumber daya, sehingga tidak akan memuat ulang sumber daya yang telah dimuat.

  • Panggilan di atas tidak mengembalikan Textureobjek, melainkan Resource<Texture>objek; penelepon diharapkan untuk menyimpan Resource<Texture>objek dan bukan tekstur yang sebenarnya. The Resource<Texture>bertindak seperti pointer pintar untuk Texture; nya operator*()kembali pada Textureobyek itu sendiri. Keuntungannya adalah bahwa tekstur yang sebenarnya dapat dimuat ulang, atau dibongkar, tanpa perlu memperbarui semua klien.

  • Manajer sumber daya memeriksa secara berkala apakah file pada disk telah berubah, dan memuatnya kembali jika perlu. Ini memungkinkan saya untuk memodifikasi tekstur atau bayangan dan melihat hasilnya tanpa memulai kembali gim.

  • Sumber daya dapat saling bergantung. Sebagian besar, jika tidak semua, sumber daya bergantung pada Filesumber daya, yang merupakan asal file tersebut. Jika, misalnya, model tergantung pada tekstur, model akan dimuat ulang setiap kali file tekstur berubah pada disk.

  • Ketika sumber daya tidak dapat ditemukan, atau gagal dimuat, sumber daya default diganti secara diam-diam. Ini memungkinkan saya untuk menggunakan sumber daya yang belum saya buat, tanpa membuat game mogok. (Fitur yang direncanakan: menunjukkan sumber daya "penting" seperti shader GPGPU, yang tanpanya game tidak dapat berjalan dengan baik sama sekali.)

  • Penghitungan referensi, dan pembongkaran sumber daya yang tidak digunakan, dapat ditambahkan dengan mudah. Karena permainan saya cukup kecil, saya belum memiliki kebutuhan untuk ini.

Saya pikir daftar fitur ini menunjukkan bahwa, ya, manajer sumber daya bisa baik!

Thomas
sumber
2

Salah satu alasan memiliki manajer sumber daya adalah berbagi sumber daya. Misalnya, ketika Anda menelepon resourceManager.Get("sprite.png"), jika "sprite.png" sudah dimuat, manajer sumber daya dapat dengan mudah mengembalikan pointer ke sumber daya sprite yang sudah dimuat alih-alih membuat gambar baru dan memuatnya kembali dari disk.

Manajer sumber daya juga dapat menyimpan sumber daya, sehingga meskipun referensi terakhir ke sumber daya telah dihapus, manajer sumber daya dapat memilih untuk menyimpannya dalam memori jika itu dimuat lagi dalam waktu dekat. Manajer sumber daya akan diprogram untuk secara otomatis menangani semua manajemen memori dengan sumber daya Anda.

Akhirnya, saya pikir fitur yang sangat berguna adalah reload sumber daya dalam game. Karena manajer sumber daya memegang semua sumber daya gim, Anda dapat membangun fungsi yang menyebabkan semua sumber daya dimuat ulang dari disk dan memperbarui gim secara real-time, yang sangat berguna bagi seniman / desainer yang bekerja dengan gim Anda. .

5 tepat
sumber
1

Manfaat lain adalah, selain caching dan penghitungan referensi, ia dapat menangani dependensi (memodelkan tekstur kebutuhan b? Saya akan mendapatkannya untuk ya!) Dan memuat masalah pesanan (memodelkan kebutuhan untuk mengetahui apa yang dibutuhkan b shader? Biarkan saya memuat shader b sebelum memuat model!)

Kaj
sumber