Mengapa menggunakan file manifes aset?


11

Terkadang Anda akan melihat orang merekomendasikan itu daripada menggunakan file grafik / suara / dll. seperti ini...

// Game code
Image myImage = new Image("path/to/image.png");

... Anda harus menggunakan file manifes sebagai tingkat tipuan sebagai gantinya:

// Manifest file
MY_IMAGE: path/to/image.png

// Game code
Manifest myManifest = new Manifest("path/to/manifest");
Image myImage = myManifest.getImage("MY_IMAGE");

Alasan apa yang akan saya miliki untuk mengambil pendekatan semacam ini? Jika saya tidak menggunakan bahasa yang dikompilasi, apakah masih ada alasan untuk melakukan ini?

Jawaban:


8

Sebagian besar file manifes waktu dikaitkan dengan semacam format file arsip. Misalnya, file JAR di java hanyalah file zip dengan file manifes yang mencantumkan aset dalam file zip, dan di mana menemukannya. Dalam hal itu "path / ke / image.png" bukan path sistem file nyata tetapi informasi tentang cara menemukan objek di dalam arsip terkompresi. Selain keuntungan ruang disk kompresi, menggunakan arsip file dapat meningkatkan kinerja karena windows memiliki waktu yang sangat sulit berurusan dengan puluhan ribu file individu dalam sejumlah kecil direktori.

Dengan menggunakan file manifes dari jenis ini, Anda dapat sepenuhnya abstrak dari mana sebagian besar data berasal. Mungkin file Anda ada di DVD, atau dialirkan dari internet, atau di dalam file zip. Anda harus menulis beberapa kode tambahan untuk menangani kasus-kasus ini, tetapi dengan menggunakan file manifes, logika permainan Anda tidak perlu peduli sama sekali dari mana sesuatu diambil.

Sekarang, jika Anda menggunakan bahasa yang tidak dikompilasi, file manifes ini tentu saja bisa menjadi file sumber C #, tapi alangkah baiknya jika Anda dapat dengan mudah memodifikasi file manifes apa yang Anda gunakan pada waktu eksekusi klien berdasarkan pengaturan registri atau yang serupa. Misalnya, Anda dapat memeriksa selama eksekusi untuk melihat apakah ada cache pada hard drive, atau apakah hanya DVD yang tersedia. Anda kemudian dapat beralih manifes mana yang akan digunakan tergantung pada pengaturan yang tersedia.


Saya dapat melihat perlunya mengabstraksi lokasi file dalam skenario kompleks, tetapi hanya mengambil file dari arsip zip seharusnya tidak memerlukan manifes karena nama file dan jalur disimpan dalam arsip.
Alex Jasmin

4

Salah satu alasan: pemrograman berbasis data.

Kode Anda mungkin hanya ingin tahu bahwa itu membutuhkan tekstur "LightWood" dan biarkan pengelola sumber daya menggunakan kunci ini untuk menemukan jalur yang benar ke file. Lebih jauh lagi, dalam skrip, orang tidak ingin mengingat jalur file. Mereka berantakan, mereka bisa salah. Biarkan manifes menentukan di mana file tersebut berada, dan biarkan manusia mencari tahu materi apa yang mereka butuhkan dengan nama itu, bukan nama file.

<material name="wood">
  <diffuse color="1,1,1,1">environment.zip/wood_diffuse.jpg</diffuse>
  <normals>environment.zip/wood_normals.jpg</normals>
  <shader>environment.zip/wood.fx</shader>
  <specular color="1,1,1,1" power="0.5" flat="yes" />
</material>

2

Sebagai pola desain umum, manifes berguna ketika Anda ingin mengumpulkan semua informasi tentang sekumpulan objek yang berbeda menjadi satu tempat. Itu tidak harus tentang arsip / file yang dikemas, atau tentang tipuan untuk memungkinkan hal-hal untuk dipindahkan tanpa mengkompilasi ulang / memperbarui referensi asli. Memang yang terakhir dapat menimbulkan lebih banyak masalah daripada menyelesaikannya, jadi Anda hanya akan melakukannya jika itu memecahkan kebutuhan tertentu yang Anda miliki.

Keuntungan besar dari manifes adalah mereka bertindak sebagai indeks terhadap sejumlah besar data di satu tempat yang padat. Karena itu mereka meningkatkan kinerja (karena Anda dapat memuat seluruh manifes dari disk dan menyimpannya dalam memori), terutama dalam kasus di mana Anda perlu mengulangi beberapa objek, tetapi Anda tidak tahu sebelumnya apa objek-objek itu . Jika objek ada di disk, terutama jika ada di beberapa tempat, Anda harus menyentuh sistem file setiap kali Anda ingin beralih ke file. Untuk sistem file berbasis disk, waktu yang diperlukan untuk menyentuh sistem file adalah penghalang, sehingga iterasi file dalam direktori adalah biaya yang sangat besar. Dengan membuat pra-manifes file saat membangun (NB: bukan waktu kompilasi), Anda menukar biaya itu untuk penggunaan memori.

File arsip memerlukan penggunaan manifes, hanya karena daftar isi untuk arsip pada dasarnya adalah manifes itu sendiri, sehingga Anda mendapatkan perilaku secara gratis. Dan jika Anda diharuskan untuk menggunakan manifes untuk aset di satu lokasi, mungkin lebih baik untuk bersikeras bahwa semua aset dirujuk melalui manifes; memungkinkan Anda untuk mengabstraksi lokasi penyimpanan aktual / mekanisme aset dari referensi ke aset tersebut dalam kode. Dengan begitu Anda dapat memiliki satu jenis referensi aset dalam kode Anda, dan tidak harus membuat perbedaan antara jalur file, jalur file arsip + offset, atau sub-aset.


1

Selain jawaban lain, itu juga membuat kode Anda sedikit lebih terpisah dari aset Anda. Anda dapat, misalnya, mengizinkan seorang artis untuk bekerja secara langsung dengan file manifes tanpa harus memiliki programmer membuat perubahan dan membuat build baru. Yang diperlukan hanyalah mengubah file manifes untuk menunjuk ke gambar baru dan hanya menjalankan permainan lagi.


0

File manifest menyediakan lapisan tipuan antara nama sumber daya dan lokasinya. Setelah lapisan tipuan tambahan hanyalah tanda desain yang berlebihan. Namun, kadang-kadang lapisan tambahan itulah yang dibutuhkan untuk membangun solusi yang elegan dan efisien.

Berikut adalah contoh konkret sederhana di mana pemisahan nama sumber daya / lokasi membantu saya. Sementara dalam pengembangan, aset seni saya dalam kontrol revisi dengan kode sumber. Ini sangat nyaman dan memungkinkan saya untuk beralih dengan cepat. Biasanya nama sumber mencerminkan lokasi itu. Manifes pengembangan sangat lurus ke depan.

Saya tidak ingin mendistribusikan game dengan aset yang tersebar. Jadi, ketika saya siap untuk mendistribusikannya, saya dapat dengan mudah memasukkan aset saya ke dalam file sumber daya dan membuat manifes baru.

Juga tekstur atlas adalah cara terbaik untuk memeras sedikit lebih banyak kinerja dari sistem grafis. Atlase cepat tetapi mereka sulit untuk bekerja sementara seni masih dalam pengembangan. Solusi saya adalah hanya membangun atlas di bagian akhir saat saya mengoptimalkan permainan. Karena saya menggunakan manifes, yang perlu saya lakukan adalah memperbarui manifes untuk menunjuk ke lokasi atlas dan voilà permainan sekarang menggunakan atlas daripada file langsung.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.