Varlık bildirim dosyalarını neden kullanmalıyım?


12

Bazen insanların grafik / ses dosyaları / vb. Kullanmak yerine bunu tavsiye ettiğini görürsünüz. bunun gibi...

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

... bunun yerine manifest dosyasını dolaylı yollama seviyesi olarak kullanmalısınız:

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

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

Bu tür bir yaklaşımı benimsememin nedenleri ne olurdu? Derlenmiş bir dil kullanmıyorsam, bunun için hala nedenler var mı?

Yanıtlar:


8

Çoğu zaman bildirim dosyaları bir tür arşiv dosyası biçimiyle ilişkilendirilir. Örneğin, java'daki bir JAR dosyası, zip dosyası içindeki varlıkları listeleyen ve bunları nerede bulacağınızı gösteren bir bildirim dosyası içeren bir zip dosyasıdır. Bu durumda "path / to / image.png" gerçek bir dosya sistemi yolu değildir, bunun yerine nesneyi sıkıştırılmış bir arşivde nasıl bulacağınızla ilgili bilgilerdir. Disk alanının sıkıştırma avantajına ek olarak, bir dosya arşivi kullanmak performansı artırabilir, çünkü pencerelerin az sayıda dizinde on binlerce ayrı dosyayla uğraşmak çok zor bir zamana sahiptir.

Bu tür bir manifest dosyası kullanarak, belirli bir veri yığınının nereden geldiğini tamamen soyutlayabilirsiniz. Dosyanız bir DVD'de veya internetten veya bir zip dosyasının içinde olabilir. Bu durumlarla başa çıkmak için bazı ek kodlar yazmanız gerekecek, ancak bir bildirim dosyası kullanarak oyun mantığınızın bir şeyin nereden yüklendiğini hiç önemsemesi gerekmez.

Şimdi, derlenmemiş bir dil kullanıyorsanız, bu manifest dosyası kesinlikle bir C # kaynak dosyası olabilir, ancak bir kayıt defteri ayarına veya benzer bir şeye bağlı olarak istemci yürütme zamanında kullandığınız manifest dosyasını kolayca değiştirebiliyorsanız güzeldir. Örneğin, yürütme sırasında bir sabit sürücü önbelleğinin olup olmadığını veya yalnızca DVD'nin kullanılabilir olup olmadığını kontrol edebilirsiniz. Daha sonra, kullanılabilir kuruluma bağlı olarak hangi manifestin kullanılacağını değiştirebilirsiniz.


Karmaşık senaryolarda dosya konumlarını soyutlama ihtiyacını görebiliyorum, ancak dosyaları bir zip arşivinden almak, dosya adları ve yollar arşivde korunduğu için bir bildirim gerektirmemeli.
Alex Jasmin

4

Bunun bir nedeni: veri odaklı programlama.

Kodunuz yalnızca "LightWood" dokusuna ihtiyaç duyduğunu bilmek isteyebilir ve kaynak yöneticisinin dosyanın doğru yolunu bulmak için bu anahtarı kullanmasına izin verebilir. Dahası, komut dosyalarında insanlar dosya yollarını hatırlamak istemezler. Onlar dağınık, yanlış olabilirler. Manifest'in dosyanın olduğu yerde çalışmasına izin verin ve insanın dosya adına değil, adına göre ihtiyaç duydukları malzemeyi çalışmasına izin verin.

<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

Genel bir tasarım deseni olarak, tezahürler, farklı bir nesne kümesi hakkındaki tüm bilgileri tek bir yerde toplamak istediğinizde yararlıdır. Dosyaların orijinal referansları yeniden derlemeden / güncellemeden taşınmasına izin vermek için arşivle / paketlenmiş dosyalarla veya dolaylı olarak ilgili olması gerekmez. Aslında, ikincisi çözdüğünden daha fazla sorun getirebilir, bu yüzden bunu sadece sahip olduğunuz belirli bir ihtiyacı çözerse yapardınız.

Manifestlerin en büyük avantajı, tek bir kompakt yerde büyük miktarda veri için bir dizin olarak hareket etmeleridir. Bu nedenle, performansı arttırırlar (çünkü tüm manifest'i diskten yükleyebilir ve bellekte tutabilirsiniz), özellikle birden fazla nesne üzerinde tekrarlamanız gerektiğinde, ancak bu nesnelerin ne olacağını önceden bilmezsiniz . Nesneler disk üzerindeyse, özellikle birden çok yerdeyse, dosyalar üzerinde her yineleme yapmak istediğinizde dosya sistemine dokunmanız gerekir. Disk tabanlı dosya sistemleri için, dosya sistemine dokunmak için gereken süre engelleyicidir, bu nedenle bir dizindeki dosyalar üzerinde yineleme yapmak büyük bir maliyettir. Oluşturma zamanında bir dosya listesini önceden oluşturarak (Not: derleme zamanı değil), bu maliyeti bellek kullanımı için takas edersiniz.

Arşiv dosyaları manifestlerin kullanılmasını gerektirir, çünkü arşivin içindekiler tablosu aslında bir manifesttir, bu nedenle davranışı ücretsiz olarak alırsınız. Ayrıca, bir konumdaki varlıklar için manifestler kullanmanız gerekiyorsa, tüm varlıklara manifestler yoluyla referans verilmesi konusunda daha açık olabilir; varlıkların gerçek depolama yerini / mekanizmasını koddaki bu varlıklara yapılan referanslardan soyutlamanızı sağlar. Bu şekilde, kodunuzda tek bir varlık referans türü olabilir ve dosya yolları, arşiv dosyası yolu + ofseti veya alt varlıklar arasında ayrım yapmak zorunda kalmazsınız.


1

Diğer yanıtlara ek olarak, kodunuzu varlıklarınızdan biraz daha ayrı tutar. Örneğin, bir programcının değişikliği yapması ve yeni bir derleme yapması gerekmeden bir sanatçının doğrudan manifest dosyalarıyla çalışmasına izin verebilirsiniz. Tek gereken manifest dosyasını yeni bir görüntüye işaret edecek şekilde değiştirmek ve sadece oyunu tekrar çalıştırmak.


0

Bildirim dosyaları, kaynak adı ile konumu arasında bir dolaylama katmanı sağlar. Daha sonra ekstra dolaylama katmanları sadece aşırı tasarımın bir işaretidir. Bununla birlikte, bazen zarif ve verimli bir çözüm oluşturmak için ekstra katmana ihtiyaç vardır.

Kaynak adı / yer ayrımının bana yardımcı olduğu basit bir somut örnek. Geliştirme sırasında sanat varlıklarım kaynak kodu ile revizyon kontrolünde. Çok kullanışlı ve hızlı bir şekilde tekrarlamama izin veriyor. Genellikle kaynak adı konumu yansıtır. Gelişim tezahürü çok basittir.

Oyunun etrafına dağılmış bir oyun dağıtmak istemiyorum. Bu yüzden dağıtmaya hazır olduğumda, varlıklarımı bir kaynak dosyasına kolayca ekleyebilir ve yeni bir bildirim oluşturabilirim.

Ayrıca doku atlasları, grafik sisteminden biraz daha fazla performans sıkmak için harika bir yoldur. Atlaslar hızlıdır, ancak sanat hala gelişme aşamasındayken çalışmak için bir acıdır. Benim çözümüm, atlası sadece oyunu optimize ettiğimde oluşturmak. Manifestler kullandığım için tek yapmam gereken manifestoyu bir atlas konumuna işaret edecek şekilde güncellemek ve oyun artık düz dosyalar yerine atlas kullanıyor.

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.