Neden kod içeriğinin kodlanması kötü?


41

Çoğu oyunun diyalog metnini dosyalarda sakladığını biliyorum, fakat aynı zamanda birkaç metin tabanlı oyunun içeriği (harita, seçimler, olası oyuncu komutları, hikaye metni) oyun koduna programladığını gördüm.

Birkaç neden düşünebilirim, ancak metin oyunlarının bile her şeyi programın dışındaki dosyalarda tutmasının temel nedeni nedir?

Uygulama ayrıntıları, içeriği popüler XML biçiminde tutmak, ayrıştırmak, ardından XML dosyasından oluşturulan değişkenleri temel alan haritaları görüntülemek / görüntülemek ve yalnızca XML dosyasını tamamen bırakmak arasında çok az farklılık gösterir. Her ikisi de ekrana çıkan dizelerle bitiyor. Fark sadece gösterim değil mi?

Bazı oyunlar bile kodun içindeki grafikleri (ASCII sanatı?) Tutar. Bunun doğru olmadığını biliyorum ve neden kötü olmasının birkaç nedeni olduğunu tahmin edebilirim, ancak bunun nedenini de bilmiyorum.

Programın dışındaki içeriğin çoğuna sahip olmak çok popüler. Cüce Kalesi bile gerçek ASCII karakterlerini kullanmaz, ancak ASCII karakterlerinin görüntülerini belleğe yükler.

Öncelikle soruyorum çünkü XML dosyaları oluşturmak, ayrıştırmak ve çalışmak biraz PITA. Bilirsin ... sadece her benzersiz zindanı (içeriği) kendi sınıfı yapan tembel alternatifle karşılaştır.


9
Metin tabanlı oyunlar kodların çoğunu zorlaştırır, ancak bence geliştirildikleri zaman ve tasarım tercihleri ​​kötüdür. Aynısı Cüce Kalesi için de geçerli olabilir. Metin tabanlı oyunlarımı kişisel olarak aldım ve içeriği kaynağın dışına ve bir veritabanına taşıdım. Hayatımı çok kolaylaştırdı.
Glen Swan

7
i18n kaynağa gömülü içerikle yapmak çok zor olurdu.
03'te

5
Bunun oyun gelişimine özgü olduğundan emin değil. Gelecekte, programcılar SE veya stackoverflow üzerinde sormayı düşünün.
MichaelHouse

13
just making every unique dungeon (content) its own class.Bu sadece beni titretti. Verilerin mantıktan ayrılması benim için çok temel bir ilkedir ve hala ihlal eden geliştiriciler olmasına şaşırdım.
Lilienthal

4
Neye karar verirseniz verin, kodlama içeriğinin çok daha fazla özel durum için uygun olduğunu fark edin. Belirli bir patronun sadece gece yarısı ile 07:00 arasında (gerçek zamanlı) görünmesini ister misiniz? Zorlamak, canavarların sadece belirli zamanlarda ortaya çıkması için genel bir yol oluşturmaktan çok daha kolaydır.
user253751

Yanıtlar:


85

Bunun birkaç nedeni var. Sadece birkaç tanesine dokunacağım:

  1. Kaynak kodunuzu bir karmaşa yapar. Çok fazla iletişim kutunuz varsa (ağaçlar), kod tabanınızın büyük bir kısmı, gerçek oyun kodunuzla hiçbir ilgisi olmayan bir metindir.
  2. Tek bir karakter kadar her değiştirdiğinizde yeniden derlenmeniz gerekir.
  3. İletişim kutusunun kendisi gezinmek zor. Tamamen birkaç tane, tamamen kendi kaynağınızın içinde iç içe geçmiş bir spagetti ve iç içe geçmiş iflekeler, switchvb. Bu daha sonra hatalara açık, okunması zor ve hata ayıklaması zor olan kodla sonuçlanır.
  4. İnsanların oyununuzu değiştirmesini veya genişletmesini sağlamak istiyorsanız, bir şeyi değiştirmek için kaynak kodla uğraşmaları gerekmiyorsa bu çok daha kolaydır.
  5. Bir takımda çalışıyorsanız, yukarıdaki husus daha da önemlidir. Yazıcınızın sadece bir iletişim kutusuna girmek için kodla uğraşmasını istemiyorsunuz.
  6. Var olan kitaplıkları kullanıyorsanız XML veya diğer standart dosya biçimlerini ayrıştırmak oldukça kolaydır, bu nedenle bu yöntemle uygulamanın maliyeti çok fazla avantaj sağlarken ve yukarıda belirtilen sorunlardan kaçınırken çok düşüktür.
  7. @MiloPrice aşağıda belirtildiği gibi, metniniz harici dosyalarda ise oyunu yerelleştirmek çok daha kolaydır. Bir dosya ekleyerek bir dil ekleyebilir, ekibiniz kaynağa dokunmak zorunda kalmadan çeviriyle ilgilenebilir (bu, özellikle tüm kodunuzu görmesi gerekmeyen kişilerin çevirmesine izin verirseniz önemlidir - freelancerları düşünün, takımınıza ait olmayan topluluk vb.)

10
Kodunu bozacağını söyleyemem. Aksi halde, içerik olsun ya da olmasın, herhangi bir şey toplu olarak karışıklık olarak kabul edilebilir. İçeriği, kod gibi iyi bir yapıda yapılandırabilirsiniz. Ancak, puanların geri kalanı hala güçlü duruyor.
Glen Swan

28
Yerelleştirme / çeviri kolaylığı bir diğer büyük avantajdır.
Milo P

2
@Christian: Verilerin, programda doğrudan kullanılabilir olduğu bir biçimde programa gömülü olduğu veri odaklı bir programınız olabilir (örneğin, C veya C ++, büyük, umarım conststatik depolama süresi olan diziler). Bu, çalışma zamanında harici bir veri gösterimi yükleme / dönüştürme işleminin tüm kodunu ve çalışma zamanı bellek maliyetini düşürür. Tabii ki, verileri dışarıda tutmak için diğer tüm nedenleriniz hala geçerlidir.
R. ..

2
Şahsen burada belirtilen nedenlerle daha güçlü bir yaklaşımı tercih ediyorum: Kodunuzun çoğunu bir komut dosyası dilinde de taşıyın. C / C ++ 'da bir çekirdek oluşturun, Python veya Lua gibi bir dil ekleyin ve bir API verin. Don't Starvebu yaklaşımı izler ve gördüğüm en iyi yazılı oyunlardan biridir. Geçmişte ve günümüzde sayısız diğer oyunlar da bunun yanı sıra uygulamalar (ve nadiren yardımcı programlar) yapar. Genel olarak, küçük projeler dışında ve küçük işletmelerin, ağır katmanlama ve ayrılmanın her zaman arkadaşınız olduğunu söyleyebilirim .
mechalynx


30

Oyun içeriği verilerini koda koymak, o oyun içeriği verilerinde herhangi bir olası değişikliği veya yinelemeyi görmek için oyunun kendisini yeniden derlemeniz gerektiği anlamına gelir. Bu iki nedenden dolayı kötü:

  • Oyunların yazıldığı birçok dilde derleme süreleri uzun. C ++ özellikle bu açıdan çok kötü olabilir ve C ++ büyük ticari oyunlar için çok yaygın bir dildir. C # ve Java gibi dillerle daha az sorun olmakla birlikte, oyun aslında verileri görmek için çalışırken oyun verilerini çalışırken yeniden yüklenebilecek harici dosyalarda saklamak kadar hızlı değildir.

  • Çoğu oyun, içerik üreten teknik olmayan geliştiricilerin (tasarımcılar ve sanatçılar) oluşan ekipleri tarafından geliştirilir. Sadece teknik olmayan insanlar, oyunu yeniden derlemek veya içeriğini yinelemek için "hantal programlayıcı araçlar" ile uğraşmak zorunda kalmazlar, aynı zamanda sadece programcılara kaynak koduna maruz kalmayı en aza indirmek istenebilir (çünkü daha az insan kaynak koduna erişebilir, sızdırabilecek daha az kişi - yanlışlıkla ya da değil).

Metin veya XML dosyalarından veri yüklemenin karmaşıklığını fazla tahmin ettiğinize inanıyorum. Bunu yapmak için çoğu zaman bir kütüphane kullanmalısınız, bu da XML / JSON / her ne olursa olsun daha kolay ayrıştırma işlemini yapar. Evet, veri güdümlü bir seviye yükleme sistemi yazmak için biraz fazla maliyet var, ancak uzun vadede her bir seviyeyi temsil etmek için tonlarca benzersiz sınıfla genellikle size çok zaman kazandıracak.

Daha küçük veya daha basit oyunların, veri odaklı bir yaklaşımın uzun vadeli yatırımından elde edecek kadar kazancı olmayabilir, bu nedenle geliştiriciler, onu destekleyen mevcut çerçeveleri / motorları kullanmadıkça, verileri yalnızca kodlamada daha verimli olabilirler. oyun kodu.

Elbette, herhangi bir oyunun verilerini harici dosyalara koymak (ya da koymamak) için seçmesinin bir çok nedeni vardır; hepsini listelemek mümkün değil. Bazı seviyelerde, genellikle hepsi oyunun yeniden inşa etmemesi gereken ek yineleme hızına veya esnekliğine ineceklerdir.


Derleme zamanlarının gerçekten önemli olduğunu sanmıyorum ama bir geliştirici olarak her zaman "temiz kod" için gayret gösteriyoruz.
Savaş

4
@Wardy Derleme süreleri C ++ 'da gerçekten önemlidir. Projenin boyutu, şablonların agresif kullanımı ve hatta geliştirici tembelliklerinden dolayı (gereksiz başlıklar dahil) inşa etmek için 15 dakikadan fazla süren çözümler ile çalıştım. Ve bunun büyük ticari oyunlarda da geçerli olduğuna eminim.
concept3d

1
@ concept3d: Projemin 15 dakika sürmesini diliyorum. Özel bir derleme sunucusundaki temiz yapı ~ 50 dakika sürer.
Mooing Duck

kaynak koduna erişimi ne kadar az insan olursa, C ++ 'nın neden olduğu beyin hasarı yaşayacak kadar az kişi. : P
Sarge Borsch

Bence bazı insanlar etkin bir yeniden yükleme noktasını kaçırıyor olabilir - hiç kimse oyunun yeniden derlenmesi 30 saniye sürse bile umursamıyor, sanatçılar oyunu tekrar başlatmak istemiyorlar, bir klavye kısayolu istiyorlar, böylece farklı animasyonları test edebiliyorlar ve anında dokular. Aslında bu en çok istedikleri şeylerden biri. Oyunun dışında işlerin nasıl göründüğünü görmek bir şeydir ama oyunda onları görmek önemli.
wolfdawn

7

Her zaman olduğu gibi, her zaman olduğu gibi değişir. Ama önce, zor kodlamanın kendi başına kötü olmadığını iddia etmek istiyorum.

Bazı basit oyunlarda kodlanmış içeriğe, özellikle de diyalog metnine sahibim ve dünya bitmedi. Programcıları soyutlamayı seviyoruz, fakat yaptığınız her soyutlama katmanının programınızı daha karmaşık ve anlaşılmasını zorlaştıracağını unutmayın.

Oyununuz yeterince basitse, içindeki bazı içeriği kodlayabilirsiniz, bunun için kesinlikle sadelik adına düşünürdüm.

Ancak bu gerçekten fazla ölçeklenmiyor. İçeriği dış kaynaklara koymanın en yaygın nedeni, bir kişinin veya ekibin oyunu yazmaya odaklanırken bir diğeri içeriği oluşturmaya ve parlatmaya odaklanabileceği için takım çalışmasını basitleştirmektir.

Ancak, program ve içerik arasındaki çizgiyi çizmek her zaman çok önemsiz değildir. Bir kişi dokuların% 100 içerik olduğunu söyleyebilir; peki ya usule göre oluşturulan dokular? İletişim metni% 100 içerik olarak kabul edilebilir; peki önceki eylemlerinize bağlı olarak iletişim ne zaman değişir? Komut dosyası veya gölgelendirici gibi programın% 100'ü olarak düşünülebilecek diğer unsurlar da oyunun içeriğinin bir parçası olarak düşünülebilir. Sabit kodlanmalı mı? harici bir kaynak olarak yüklenmeli mi?

Bununla birlikte, oyununuzda desteklediğiniz her içerik türünün kendisiyle ilgili bir yükleme ve yorumlama koduna sahip olması gerektiğini unutmayın; bu nedenle, genel olarak, şüpheleniyorsanız, kodlama içeriğini öneririm ve yalnızca gerçekten bu esnekliğe ihtiyaç duyuyor (ihtiyacınız olduğunu düşünürken değil - ihtiyaç duyduğunuzda değil, gerçekten yaptığınız zaman)

Son olarak, kaynak dosyalara veri kaydetmenin bir avantajı, yalnızca onlara ihtiyaç duyduğunuzda yükleyebilmenizdir (bu nedenle oyun yüklenme sürelerini hızlandırabilir) ve artık gerekmediğinde bunları kaldırabilirsiniz (bu nedenle daha fazla içeriğe sahip olmanıza izin verir) belleğe sığabileceğinden daha fazla). (Nitpickers'ın köşesi: resource DLL'leri dış kaynak olarak kabul edilebilir)


7
"ama yaptığınız her soyutlama katmanının, programınızı daha karmaşık ve anlaşılması daha zor hale getireceğini unutmayın." Kabul etmemeliydim, soyutlama bir programı daha kolaylaştırabilir ve kesinlikle anlaşılmasını kolaylaştırabilir.
NPSF3000

1
NPSF3000 soyutlamaların @ olacaktır karmaşık eklemek, ama olabilir onlar eklemek daha karmaşıklığı ortadan kaldırır.
user253751

2
@ immibis, bu yüzden bir soyutlama yapıldıktan sonra bir projenin karmaşıklığının toplamı öncekinden daha düşük olmalıdır .
NPSF3000

3
@ NPSF3000: Demek istediğim sadece yapabileceğiniz için soyutlamalar oluşturmamanız gerektiği. Bazen kodlama verileri daha basit, daha anlaşılır ve her yerinde daha kolaydır. Çoğu zaman, oyunları pişman olduğum soft softcode yolunda izledim . Ayrıca, soyutlamalar eklemenin onları çıkarmaktan her zaman daha kolay olduğunu aklınızda bulundurun, bu yüzden soyutlamalar eklemenizi yalnızca onlara ihtiyaç duyduğunuzda katılıyorum.
Panda Pajama

@PandaPajama bir şey yapmak 'sadece yapabildiğiniz için', bir şey ne olursa olsun, bir soruna neden olabilir. Bu, bir şeyin doğası gereği karmaşık olduğu anlamına gelmez, bu benim endişelendiğim nokta. Ayrıca, soyutlamalar eklemenin onları çıkarmaktan daha kolay olduğunu düşündüren nedir? Başımın üstünden başka türlü düşünürdüm - bir soyutlamayı geç eklemek, önemli ölçüde yeniden yapılanma anlamına gelebilir, ancak gereksiz bir soyutlamanın kaldırılmasının karmaşık olacağı bir durumu hemen düşünemiyorum. XML'den kodlanmış dizgelere geçmek önemsiz olmalıdır.
NPSF3000

3

Metin dosyalarında saklamak için büyük bir sebep yeniden kullanılabilirliktir. Haritalarınızı, iletişim kutunuzu ve diğer kaynakları bir metin dosyasından okuyan bir metin oyunu çerçevesi oluşturmak, çerçevenizi diğer oyunlar için yeniden kullanmanızı sağlar. Metin oyunlarının ötesine geçmek, Call of Duty gibi büyük bütçe başlıklarının her yıl yeni bir oyun çıkarmasıdır.

Başka bir neden taşınabilirlik. Aynı dosyaları web, pc, Mac, Android vb. İçin kullanabilirsiniz. Yapmanız gereken tek şey bu farklı platformlar için çerçevenizi oluşturmak ve oyun verilerinin büyüklüğüne dokunulmamış.

Metin tabanlı oyunların ötesine geçildiğinde bir komut dosyası ve dosyalarda depolanan veriler yeniden derleme sürelerini azaltır ve verileri daha kolay yönetmek için bir arabirim oluşturmanıza olanak sağlar.


1
Elbette, malzemelerin çoğunun tekrar kullanılabilir olması, zaten sahip olduğunuz kuralların dışında "özel" bir şey yapmaktan kaçınmanız için sizi zorlama eğilimindedir. Kesinlikle büyük kodlu büyük oyunları savunmuyorum, ancak deneysel oyunlara prototip yazarken veya yazarken çok faydalıdır - size çok daha fazla esneklik verir. Elbette bir bedeli var, bu yüzden oyun gerçekten işe yaradığında her şeyi yeniden yansıtmak genellikle iyi bir fikirdir. Oynanış zor kısım - mimari cehennemden geçmeden test edebileceğinizden emin olun: D Betonların elde edilmesinden sonra genel formu bulmak genellikle daha kolaydır.
Luaan

3

Daha hızlı değişiklik yapmak adına, tonlarca daha büyük üretimlerdeki gelişmeyi hızlandırır.

Basit değişikliklerin yapılması için herkese nasıl girileceğini ve kaynakların düzenlenmesi gerektiğini öğretmeniz gerekmez. Gerçek kodun dışına sürükleyerek daha fazla insanın etrafta dolaşma şansını yakalar, hangi seçeneklerle oynayabileceğinizi bulmak daha kolaydır ve oyunun çeşitli bölümlerini daha iyi hale getirme sürecinin tamamı çok daha az zaman alır. Sorular ve Cevaplar bile bu konuda yardımcı olabilir.


3

Henüz kimsenin bundan bahsetmediğine inanamıyorum, ancak bunun büyük bir nedeni yerelleştirmeyi LOT kolaylaştırmak. İngilizce, Fransızca, Almanca, İspanyolca, Portekizce, İtalyanca, Rusça, Çince ve hedeflediğiniz diğer dilleri desteklemeniz gerekiyorsa, kodlanmış her dil için ayrı kodlama yapılmasını gerektirir. Ayrıca, belirli bir içeriği kaldırmanız gerekirse (okuma: sansür), "önlemek için sadece bu anal sondalama mini oyununu ne olduğunu grafiksel olarak açıklayan bu pasif agresif bayrakla değiştirmek yerine" önlemek için kodunuzu değiştirmeniz gerekir. ". Aynı zamanda tüketiciler için de düşmancadır, çünkü diğer kütüphaneleri yüklemeniz gerektiğinden dili değiştirmek için oyunu yeniden başlatmaları gerekebilir. En sonunda,

Diğer yandan, eğer harici kaynaklar kullanıyorsanız, farklı dilleri desteklemek sadece farklı bir kaynak dosyasını yüklemek anlamına gelir. Oyun çalışırken bu kolayca yapılabilir. bu, gelişimi büyük ölçüde basitleştiren tek bir kod tabanına sahip olabileceğiniz anlamına gelir. Ayrıca, diğer diller için sürüm sonrası desteği kolayca ekleyebileceğiniz anlamına gelir. Son olarak, kullanıcının disk alanından ve bant genişliğinden tasarruf etmek için belirli dilleri (oyunlarda sık sık gerçekleşmeyen ancak yine de mümkün olan bir özellik) yüklemekten vazgeçmesine izin verebileceğiniz anlamına gelir.


3

Bence anahtar bir ifade kaygıların ayrılması .

Kodunuz metni koddan daha fazla içermiyorsa, daha az karmaşık olur. Kodu yazan programcının belirli bir metni düşünmesi gerekmez ve koda odaklanabilir.

Yerelleştirme hakkında düşünmesi gerekmiyor. Yerelleştirmeyi yapan kişinin kod hakkında endişelenmesi gerekmez.


3

Ben, "beyazdan ziyade" olan bir adam olmanın ve dışsal bir metin kaynak dosyasını sıcak bir şekilde kullanmanızı tavsiye etmenin çok kolay olduğunu düşünüyorum.

Neden? Çünkü burada her bir çözümün maliyetini / sorunlarını / avantajlarını dengelemekle ilgili bir seçenek var.

Harici bir dosya kullanırken ... Sanırım diğer cevaplar faydaları yeterince açıklıyor. Peki ya maliyetler? Geçerli bir formalizm tanımlamalısınız, bir tercüman inşa etmelisiniz, bir dosya formatına karar vermelisiniz ve daha da kötüsü ... başka bir uygulama - bir editör- oluşturmalısınız. Büyük bir proje yapan 50 kodlayıcı ekibin bir üyesiyseniz, bu% 0,00'lük bir konudur. Ama eğer yalnızsan: oyalanmışsın.

Yine, harici bir kaynağın muazzam esneklik faydalarını tahmin etmiyorum: veri odaklı programlama bana video oyunları için gidilecek gibi görünüyor. Ama maliyeti unutmayalım.

Öte yandan, kodun içindeki metnin hızlı prototip oluşturmaya izin verdiğinden ilk kez tercih edilmelidir. O zaman benim tavsiyem, proje olgunlaştıkça, diyalogları modellemek için gereken veri türünü (ruh hali / tarih / devlet /…) analiz etmekti. Sonra bir noktada, bazı sınıflara / kurallara / dosya formatına karar verirsiniz ve gerçek olanı seçersiniz, diğerlerinin de kodu içerikten düzenlemesine / ayrıştırmasına izin verir. VEYA basit diyaloglar içeren bir oyun için (Mario ...) sadece maliyeti çok yüksek görürsünüz ve birkaç karakter / davranışı kodlanmış tutarsınız.
Senin çağrı.

(Yerelleştirme hakkında not: bu sadece bir karma tablo, bu yüzden bağımsız ve kolayca çözülebilir bir konu.)


Metini koda yazdıysanız, bunlardan bazıları hala geçerlidir. Hala belirli bir biçime, ağaçta gezinmek için bir yol vb. Bunu göz önünde bulundurarak, bir dış içerik kaynağının uygulanması için herhangi bir ek maliyet, özellikle bu kütüphanelerin ve editörlerin bu dosyaları ayrıştırma, yazma, düzenleme ve oluşturma için var olmalarından dolayı nispeten düşük görünmektedir. Diyaloglarınızın karmaşıklığına bağlı olarak, özel bir editör olmadan da kurtulabilirsiniz ve sadece standart bir metin editörü kullanabilirsiniz.
Christian

1
Tabii: belki de yeterince açık değildim, demek istediğim sadece birkaç diyalogdan sonra diyaloglarınızın şeklini bildiğiniz anlamına gelir (düz bir çizgiden karmaşık bir ağaç veya devlet makinesine). İlk adımlarda birkaç (en kolay) ifs + bazı sabit kodlu dizeler tamam imho. Sonra ihtiyaçlarınızı açıkça belirlediğiniz zaman, her bir çözümün maliyetini / faydalarını değerlendirdikten sonra bir seçim yapın.
GameAlchemist

Mevcut tek kişilik oyun projemde kullandığım bir orta nokta, derleme zamanından önce ayrıştırılan dosyalardan oluşturulan sabit kodlanmış içeriğe sahip olmak. Her iki dünyanın en kötü çözümü olacak birçok durumda, ancak ihtiyacım olan şey için aslında oldukça iyi.
glenatron

2

Ben sanırım lisans kodda içerik eklemek için bir neden olabilir.

Örneğin,

  • kodunuz FLOSS olabilir , ancak içeriğinizi hiçbir şekilde lisanslamak istemezsiniz (belki de oyun kodunuzu yayınlamak istersiniz, böylece başkaları farklı içerikli benzer oyunlar oluşturmak için kullanabilir)
  • kodunuz FLOSS olabilir, ancak içeriğiniz için bir Creative Commons lisansı kullanmak istiyorsunuz (yazılım lisansları içerik için çok iyi çalışmadığından ve tersi)
  • kodunuz özel olabilir , ancak ücretsiz içeriği yeniden kullanıyorsunuz
  • kodunuz tescilli olabilir, ancak ücretsiz / serbest lisans altında kendi içeriğinizi yayınlamak istiyorsunuz
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.