Varlıkları kaydederken sürüm oluşturma değişikliklerini nasıl yapabilirim?


9

Bir süredir bir RPG üzerinde çalışıyorum ve iki farklı serileştirme tekniği kullanıyorum.

  • Düşmanlar, Silahlar, eşyalar XML olarak kaydedilir.
  • Haritalar ve olaylar "kontrollü ikili" olarak kaydedilir (her sınıf bir kaydetme / yükleme yöntemi alır ve kaydetmek / yüklemek istediklerine karar verirler).

Ama haritalar ve etkinlikler için seçimimi sorgulamaya başladım. Endişelerim:

  • Bir harita editörü oluşturdum ancak dosyayı açarak küçük şeyleri değiştirmeyi hala özlüyorum.
  • Değişiklikler çok karışık. Sınıfa bir değişken eklemek istediğimi söyleyin, eğer her haritayı tekrar yüklemez / kaydetmezsem daha sonra kesilir.

İlk endişe tekniğimi değiştirmeden etrafta dolaşmak zor. JSON'a geçmeyi düşündüm, ama çok iş var. Ben de her yerde [DataContract] ve [DataMember] özellikleri ile oldukça çirkin görünüyor düşünüyorum.

Bu beni ikinci endişemle terk ediyor ve bununla nasıl başa çıkabileceğimi merak ediyorum? Tüm haritalarda dolaşan ve bunları yeni değişkenle yeniden kaydeden küçük bir program oluşturuyor musunuz? Çünkü şimdi birkaç harita almaya başladım ve hala elle yapıyorum. Ekstra iş yaratan bazı değişiklikler yapmak istediğimde her seferinde iki kere düşünmemi sağlıyor.

Yanıtlar:


5

Sürüm oluşturma sorununu çözmenin birçok yolu vardır; sürüm başına bir yükleme işlevine sahip olarak yapabilirsiniz, varlık yapısının zaman içindeki dönüşümünü (genellikle özniteliklerle) tanımlayarak işlemi otomatikleştirmeyi deneyebilir, yükleme / kaydetme işlevlerinde sürüme özgü kontroller yapabilirsiniz. .

"Değişiklikleri tanımla" yaklaşımını seviyorum ama nitelikler aracılığıyla yapmaya çalışmanın garip hızlı olduğunu buluyorum . Bunun yerine işlevleri kullanırdım; tüm uygun sürümünüz için Nsürümdeki verileri sürümdeki verilere dönüştüren bir işlev uygulamak N + 1. Yüklendiğinde, sürümü en son sürümle karşılaştırarak kontrol edin ve değilse, verileri tüm uygun sürüm oluşturma işlevleriyle çalıştırın. Her zaman en son sürümü kaydedin.

Veriler hala çalışma zamanı anahtar / değer formundayken dönüşümü yaparsanız bu en iyi sonucu verir. Bu, muhtemelen kendi ikili biçiminiz varsa JSON veya XML'nin temel anahtar / değer biçimini kullanamayacağınız için, verileriniz için "özelliklerin çalışma zamanı torbası" yaklaşımı olan bir gösterim uygulamak isteyeceğiniz anlamına gelir. Bunu yapmazsanız, size de çirkin aldığı, etrafında eski sınıf tanımlarını tutmak gerekebilir. Bu özellik kötü biçimde varlıklarını sahip olabilme da müthiş oyun editörü gelişimi için faydalıdır.

Geliştirme sırasında verilerinizi yinelediğinizde, doğal olarak en son sürüme kadar kabarır ve sonunda eski sürüm oluşturma işlevlerini silebilirsiniz. Bu, Lonca Savaşları 2'deki sanat varlıklarını (haritalar gibi) versiyonlamak için kullandığımız aşağı yukarı aynı yaklaşımdır.


Şimdi, tüm bunlar, varlıklar için hem metin hem de ikili serileştirmeyi desteklemenin yararlı olduğunu düşünüyorum. Geliştirme sırasında, tüm verilerinizi XML veya JSON tabanlı insan tarafından okunabilir bir biçimde tutun. Bu, yineleme yeteneğinizi çok artırabilir, çünkü verileri düzenlemek için bu kadar karmaşık araçlar oluşturmanıza gerek yoktur. Elle basit hızlı ayarlamalar yapabilmeye dönebilirsiniz.

İkincisi, oyunu göndermek için hala ikili bir format bile istediğinizi varsayarsak (dosya boyutunu veya dosya G / Ç sürelerini iyileştirebilir, bu yüzden geçerli bir istektir), serileştirme ve serileştirme API'lerinizi sürümlemeyi işlemek için tasarlayın. Sürüm olduğu bir noktada gibi gemi güncellemeleri veya hata düzeltmeleri isteyebilirsiniz çünkü hala bir kargo bağlamında yararlı. NET serileştirme ve Boost serileştirme sürüm yeteneklerini açıklayan bazı belgeler bulabilirsiniz ilginç. Eğer varsa edilmektedir metin ve ikili biçimlerin ikisini birden desteklemek için gidiyor, siz (veya yapı otomatik testler daha iyi, bunu yapmak için) zaman zaman bunları test emin olun.


Yorum için teşekkürler, bana nasıl devam edeceğim konusunda bazı fikirler verdi.
user1776562

1

XML veya JSON gibi özellik değeri çiftlerine sahip bir biçimlendirme dili kullanın.

Ayrıştırıcı, anlamadığı nitelikleri yok sayabilir veya bulamadığı varsayılanları kullanabilir, bu da geriye ve ileri uyumluluğu oldukça kolaylaştırır. Ayrıca, biçim insan tarafından okunabilir, böylece bir metin düzenleyicisiyle kolayca düzenleyebilirsiniz.

XML veya JSON gibi yerleşik bir dil kullandığınızda, birçok komut dosyası dilinin bunu desteklediğini fark edeceksiniz, bu nedenle çok sayıda dosyayı düzenlemek için bir komut dosyası yazmanız gerektiğinde, bunu yapmanın çok daha kolay olduğunu göreceksiniz.

Bu dillerin çoğunun dezavantajı, oldukça ayrıntılı olmalarıdır. Bu, sonuçta elde edilen dosyaların optimize edilmiş bir ikili biçimde olması gerekenden çok daha büyük olduğu anlamına gelir. Günümüzde, dosya boyutu çoğu durumda çok fazla önemli değildir. Ancak önemli olan yerlerde, dosya boyutu zip gibi bir stok algoritmasıyla sıkıştırılarak dosya boyutu önemli ölçüde azaltılabilir.

Tüm diller sabit sürücüden okunup ayrıştırılmadığı sürece biçimlendirme dilleri genellikle rasgele erişime izin vermez. Ancak pratikte bu o kadar önemli değil, çünkü sabit diskler sıralı okumalarla en hızlı. Aynı dosyanın farklı bölümlerine rasgele birden çok kez arama yapmak, gerekenden daha fazla veri okuduğunuz anlamına gelse bile, dosyayı tek seferde okumaktan çok daha yavaş olabilir.


1

protobuf kullanabilirsiniz. https://code.google.com/p/protobuf/ Geriye dönük olarak uyumlu hale getirirken kolayca genişletebileceğiniz json / xml avantajlarını ve ayrıca ikili olma avantajını sunar. İş akışı, protobuf dilinde bir veri formatı açıklaması oluşturup ardından serileştirme ve serileştirme için kaynak kodu oluşturmanızdır. Kaynak birkaç dil için oluşturulabilir. Ayrıca, spesifikasyonun okuma / yazmada dolaylı olarak yapıldığı json'un aksine, serileştirilmiş verilerinizin açık bir spesifikasyonuna sahip olmanız büyük bir avantajdır.


Serin görünüyor ama c # kullanın, bu c ++, python ve java için gibi görünüyor.
user1776562

Bir C # sürümü var. Ben şahsen test etmedim, ama bir tane var.
Arne
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.