İçerik boru hattı araçları motora yerleştirilmeli mi?


10

Bir oyun motoru ne kadar minimal olmalı? İçerik boru hattının ne kadarı motora yerleştirilmelidir?

Süper motorun yararlı olabileceği bazı durumlar:

  • Kullanıcı içeriğini yüklerken, kullanıcının dokularını paketlemesi gerekmez, motor yükleme zamanında bunu yapar.

  • Bir komut dosyası, önceden oluşturulduğundan çok daha büyük boyutta bir yazı tipi ister; motor, yeni bir doku atlası oluşturmak için ttf dosya reklamını ayrıştırabilir.

  • Halo dövüşü .

Bunların hiçbiri elbette ücretsiz değil. Bu, içerik kanalı araçlarınızın C ++ ile yazılmasını gerektirir. Boru hattında kullandığınız destek kitaplıklarının aygıtta kullanılmak üzere derlenmesi gerekir. İçerik oluşturmanın hatalı olmamasını gerektirir. Ve genellikle motorunuzu daha büyük ve hantal yapar.
Diğer artıları ve eksileri nelerdir?
Profesyoneller eksileri ağır basar mı?

Bazı özel sorular:

  • Motor çeşitli görüntü formatlarını yükleyebilmeli mi? Sadece TGA yükleyicinin kodunu kullanmak oldukça kolaydır.

  • Ses formatları ne olacak? Sadece wav dosyalarının yüklenmesini desteklemek mümkün müdür? Genellikle büyük olan ortam müzik dosyaları hakkında.

  • Motor dinamik TTF ayrıştırma ve atlas oluşturma kapasitesine sahip olmalı mı?

  • Doku paketleme.

Yanıtlar:


11

İçeriden Noel Llopis'in Oyunları bu günlerde "Uzaktan Oyun Düzenleme" yayınına dokundu . Açılış paragrafı:

Uzun zamandır minimal oyun çalışmalarının hayranıyım. Çevrimdışı veya ayrı bir araçta yapılabilecek her şey çalışma süresinin dışında olmalıdır. Bu, oyun mimarisini ve kodunu çok yalın ve basit bırakır .

(Bu makale,% 100 katılıp katılmamanıza bakılmaksızın, Noel öğelerinin çoğunda olduğu gibi şiddetle tavsiye edilir.)

Buradaki anahtarın karmaşıklığı motorun dışında tutmak olduğuna inanıyorum. Yine de esnekliğiniz olabilir, ancak içerik kanalında esneklik vardır. Verileri dönüştürmek ve taşımak için zaman harcamayarak daha iyi performans elde edersiniz.

Daha iyi performans, bazı motor içi düzenleme yeteneklerini kaybetmesine rağmen, garip bir şekilde daha düşük yineleme süresine dönüşebilir: oyunu bir saniyede yükleyebilirseniz bir şey denemek daha kolaydır.

" Unix felsefesinin bazı ilkelerini benimsemek " nin zincirinizi esnek tutmanıza yardımcı olacaktır: küçük bir modüler boru hattı.

Kişisel felsefem: Verileri olabildiğince çevrimdışı olarak pişirin , ancak istediğiniz zaman yeni pişmiş verileri almak için motor desteği sağlayın. (Bu yeni verinin uygun bir noktaya kadar devreye girmesi gerekmediğini unutmayın: "yenile" düğmesine basıldığında, bir sonraki seviye başlar, her ne olursa olsun yeni bir alana geçiş yaparsınız. Anahtar, en aza indiren tatlı noktayı bulmaktır. minimum kod karmaşıklığı ve kodlama çabası ile yineleme süresi.)

Şirketimizde sanatçı / tasarımcıya dönük araçlarımızın çoğu UI sorunlarına odaklanmıştır: tek varlıkların veya bunların toplu işlerinin manipülasyon kolaylığı vb. Bazen Photoshop veya 3DS Max gibi 3. taraf araçlardır. Bu araçlar bir ara formata aktarılır (genellikle kaynak ikili verilere gönderme yapan xml'dir, ancak her zaman değil). Ara format, hedef platform için hızlı ve yararlı bir şey haline getiren bir arka uç "veri oluşturma" aracı tarafından alınır.

Taşınabilirlik, ek arka uç veri oluşturma araçları ekleyerek veya içerik oluşturuculara görünmez olma avantajına sahip mevcut arka uç veri oluşturma araçlarını genişleterek elde edilir.

Şimdi, uygun bir artımlı veri markasıyla, pişmiş formatta saniyeler içinde değişiklik yapabilirsiniz; motorunuz örümcek veya bir araç örümcek olabilir ve daha sonra bunlar kaynak sisteminizde, uygun olduğunda yeniden yüklenmeye hazır olarak görünür.

Araçlar - özellikle arka uç verileri araçlar - genellikle motor kodundan daha sloppier ve ümitsizdir. Bu sorun değil, çünkü bunları yeniden düzenlemek / yeniden yazmak, genişletmek ve test etmek daha kolaydır; davranışları için spesifikasyonlarınız var ve bunları bazı motor kodlarına kıyasla test etmek oldukça kolaydır.

Sorularınızla ilgili görüşlerim:

Motor çeşitli görüntü formatlarını yükleyebilmeli mi? Sadece TGA yükleyicinin kodunu kullanmak oldukça kolaydır.

(Yanda: motorda bir TGA dekoder kullansanız bile, el kodlaması yapmayın. Sadece sorun istiyorsunuz - çoğu görüntü formatına sahip birçok incelik ve uymayan birçok araç var görüntü işleme için mevcut iyi test edilmiş kütüphane kodunu bulmaktan en iyisidir.)

Burada araç TGA'dan iç doku formatınız ne olursa olsun, meta verilere dönüştürürüm.

Ses formatları ne olacak? Sadece wav dosyalarının yüklenmesini desteklemek mümkün müdür? Genellikle büyük olan ortam müzik dosyaları hakkında.

Burada üç biçim kullanıyoruz: izlenen müzik (.xm), ADPCM (.wav) ve Speex (.spx). Bunun nedeni çoğunlukla el bilgisayarlarında olduğumuz ve bu formatların kodunu çözmek için çok hafif olmasıdır.

Motor dinamik TTF ayrıştırma ve atlas oluşturma kapasitesine sahip olmalı mı? Doku paketleme.

Atlasing zor bir sorundur: son sorunuza bakın yanıtlarına bakın. Neredeyse her zaman çevrimdışı yapmaya değer.

Ayrıca, karakter başına meta verileri sıfıra yakın yük kodlu fırınlanmış bir yapı haline getirebilirsiniz.

Kapanışta, mod topluluğu için bu boru hattını oyununuzla temizleyebilir ve paketleyebilirsiniz. Her zaman daha fazla kaynak biçimi ekleyebilirsiniz. Ayrıca, belirli durumlarda içerik oluşturma araçları ile motor arasındaki boşluğu doldurmanızı engelleyen hiçbir şey yoktur; umarım veri pişirme kodunuz ve örümcek / aktarım kodunuz, bazı durumlarda doğrudan içerik oluşturucu araçları tarafından kullanılabilecek kitaplıklara dönüştürülebilir. Ama benim ilk hedefimi yapmam gerekmiyor, mutlaka ... Bunun nihai bir hedef olacağını ve bunun tasarımınızı biraz etkilemesine izin verin ve önce düşük asılı meyveyi tercih edin.


Güncelleme olarak, dokular için KTX Dosya Biçimini kullanmayı düşünebilirsiniz . structÇoğu GL kullanımı için çoğunlukla "oku ve git" olma avantajına sahiptir (ve yorumlarınızdan hala esnek ve iyi tanımlanmışken GL'yi hedefliyormuşsunuz gibi görünür).

KTX üstbilgisi, hedefinize bağlı olarak tamamen pişmiş veriler için biraz yüksek olabilir ve kullanıcı tabanınıza bağlı olarak endian takas desteğinden vazgeçmek isteyebilirsiniz ... ama kesinlikle en azından tasarım konuları için bir değere değecektir.


Harika şeyler teşekkürler. Kendi yüklemem kolay resim formatımı oluşturmayı hiç düşünmemiştim. Zaten yapılmış minimal doku yükleme kütüphanesi var mı? Sonra tekrar temelde genişliği, yüksekliği ve kodlaması olan bir bayt akışıdır (yani GL_RGB555).
deft_code

1
Görüntüyü DirectX, GL veya ne kullanırsanız kullanın tam olarak almak için kendi görüntü biçiminizi o kadar fazla oluşturmayın. =) Kütüphanelere gelince: orada bir ton var. Araçlar için, sadece ImageMagick ( imagemagick.org/script/index.php ) kütüphane malzemelerini veya hatta programları kullanma eğilimindeyim ... ImageMagick kodu eski okul ve biraz çirkin, ancak oldukça hızlı, esnek ve yol -tested. Eminim başkalarının başka önerileri olacaktır; Alet zinciriniz için örneğin C # kullanıyorsanız, bu tür şeylerin çoğu zaten .NET kütüphanelerine yerleştirilecektir ...
leander

1
"Eminim başkalarının başka önerileri olacaktır" MFC! :) Ya da belki OpenIL. Varlıkları platforma özgü biçimlere dönüştürmenin önemli noktalarından biri, daha fazla kaynak biçimi ve daha fazla platform ekledikçe kombinasyon sayısının patlayacağıdır. Kaynak varlıkları bir ara biçime dönüştürmek ve daha sonra bunu platforma özgü biçimlere dönüştürmek, dönüşüm yollarının sayısını azaltacaktır. Başka bir kaynak biçimi ekleyin, ara biçime bir dönüştürücü yazın. Başka bir platform ekleyin, o platformların hedef biçimine bir fırıncı ekleyin.
Chris Howe

1
Karmaşıklığı motorun dışında tutmanın, işlevselliğin motor için mevcut olmadığı anlamına gelmediğini de ekleyeceğim. Motordan kolayca ayrılabilmesi için ayrı tutulması önemlidir. Varlıkların sıcak yüklenmesini desteklemenin ne kadar yararlı olduğunu vurgulayamıyorum, yani işleri anında yeniden yükleme. Bu da sisteminize çok fazla karmaşıklık getirebilir, böylece oyunun varlıkların nereden geldiğini umursamayacağı şekilde inşa edildiğinden emin olmak istersiniz.
dash-tom-bang

3

Sorularınız kulağa çok öznel geliyor ve büyük ölçüde hedef kitlenizin kim olduğuna bağlı.

Yazı tipi / ttf ayrıştırma sorunuzu alalım. Eğer kendi yazı tiplerini eklemeyi planlıyorsanız, muhtemelen içe aktarma işlemini mümkün olduğunca az adım yapmak istersiniz. Oyuna dahili olarak çok sayıda yazı tipi / yazı tipi boyutu ekliyorsanız, belki de bir sanatçının küçük bir eğitim ile kullanabileceği biraz karmaşık bir araç istersiniz. Bir kez dahili olarak yapacaksanız, uygun bir ithalatçı yapmak için harcadığınız zaman muhtemelen önceki durumlar için araçlar yazmak için zaman ayırmaktan daha az olacaktır.

Bu gerçekten her şey için bir ölçek meselesi. Gömülü araçlar, bir çok kez bir şey yaptığınızda ve bundan kaynaklanan karmaşıklığı / hataları azaltmak istediğinizde çabaya değer. Eklediğiniz her ek niteleyici (örneğin, PSD'leri içe aktarmak yerine yalnızca TGA dokuları) son kullanıcı tarafından daha fazla zaman harcanmasına neden olur.

İçerik araçlarının genellikle teknik olarak daha az eğimli (okur: sanatçılar) tarafından kullanıldığını unutmayın. Şahsen, Unity'nin sadece bir kaynak dosyaya (psd, 3ds, ttf, mp3, jpg, mov, neyse) sürükleyebileceğiniz şekilde çalışmasını seviyorum ve otomatik olarak dahili formatına dönüştürecek. Dahili biçim çoğunlukla son kullanıcıdan gizlenir. Ayrıca, kaynak dosya değişikliğini algıladığında otomatik olarak yeniden dönüştürülür. Ama bu çok iş.

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.