Oyun verilerini kaydetmek için iyi bir dosya formatı nedir? [kapalı]


37

Bazı özel oyun verilerini kaydetmem gerekiyor. Harita, oyuncu vb.

Hepsinde "alt nesneler" olacak. Örneğin, bir harita ve harita bir "kiremit dizisine" sahip olacaktır. yani, hiyerarşik veri. Umarım ikili bir şey değil.

Bunlar için iyi bir format ne olurdu?

Şimdiye kadar düşündüm:

Serailization: Bu HIZLI ve kolay, ancak altta yatan sınıfları değiştirdiğimde kırılma eğiliminde.

XML: Bunu ayrıştırmaktan gerçekten nefret ediyorum. Test davam 100'den fazla kod satırından oluşuyordu ve çok basit bir format için bile tonlarca "yoğun iş" seviyor gibiydi.

INI: hiyerarşik veriler için gerçekten sakar olurdu.

Protobuf: Hiç kullanmadım, ama sınıfı değiştirirseniz, elinizde çok fazla manuel zorlama ve kırılma yapmanız gerektiğini okuyun.

Diğer seçenekler? Bu yüzden buradayım!

Düzenleme: bu Java btw.

Düzenleme 2:

"Kontrollü İkili Serileştirme" konusuna yerleştim (aşağıya bakınız).

Artıları:

  • hızlı

  • küçük (diskte) ve okuma / yazma sırasında kolayca sıkıştırılabilir / açılabilir.

  • Oyun ve araç setinden okumak / yazmak çok kolay.

  • Nesnenin ne dahil edilmesine / hariç tutulmasına karar verebilirim.

  • Nesneler / Veriler iç içe geçebilir.

Eksileri:

  • El ile düzenleyemiyorum (XML, YAML, vb. Gibi)

  • Scriptlerle kolayca okuyamıyor / değiştiremiyorum

  • Java Serileştirmesi varsayılan olarak diğer uygulamalara kıyasla oldukça yavaş / şişirilmiş, ancak kararlı ve çalışır


3
virgülle ayrılmış değerler
Thomas Eding

@trinithis KISS harika bir şey.
Nate,


Komik, ProtoBuf yükseltilebilirliği desteklemek için inşa edildi.
Jonathan Dickinson

ayarlar, vb. kullanıcı tarafından değiştirilebilen her şey için ini; ve her şey için ikili.
Uğur Gümüşhan

Yanıtlar:


38

Hierachical verilerini görüntülemek için YAML veya JSON iyi seçenek olacaktır. Bunlar uzak XML den ayrıştırma daha basit ve daha kolay.

Başka bir seçenek "kontrollü" bir ikili serileştirme işlemi olacaktır. Her nesne, durumunu kontrollü bir şekilde yazıyor, yani

void player::save(savegame &sgm)
{
    sgm.write(this->position);
    sgm.write(other properties);
    inventory.save(sgm);
}

id Tech 4 (Quake 4 / Doom 3 motoru) böyle bir yaklaşım kullanıyor.


+1 "Kontrollü" ikili seri hale getirme için. Bunu işte kullanıyorum ve harika!
NoobsArePeople2

1
"Kontrollü" ikili seri hale getirme için başka bir +1. Adı daha önce hiç duymadığım halde, birkaç yerde benzer bir şey yapıyorum - doğru yapıldı, veri dosyasında bulunmayan yeni eklenen alanlar için varsayılanları ayarlayabilme ve görmezden gelme avantajına sahip " Bir modelden çıkarıldığında veri dosyasında önemsiz ".
Izkata

Oyunumda böyle bir şey kullanıyorum. İyi çalışıyor! Java kullanıyorum. Her nesnenin bir dosya akışına yazan bir ToByteStream yöntemi ve bir dosya akışından okuyan bir yapıcı vardır. Javas Serileştirilebilir uygulamasını sevmedim.
Michaelhouse

4
Ya da sadece Boost.Serialize'ı kullanabilir ve sürüm oluşturma gibi harika özellikler elde edebilirsiniz.
Nicol Bolas

@ Izkata Bu adı ben yaptım çünkü bu yöntemin nasıl adlandırıldığı hakkında hiçbir fikrim yok.
Raphael R.

9

İyi yapılmış bir ikili format gerçekten tüm avantajlara sahip, hızlı, oldukça küçük ve yaptığınız kadar esnek.

İkili bir format oluşturmak, hiçbir kuralla sınırlı kalmazsınız, bu büyük bir avantajdır, ancak ironik olarak, büyük ölçüde ikili dosya yapılarına kötü bir ad veren şeydir. XML, JSON ve benzerleri sizin için çok fazla karar veriyor, bunlar her zaman optimal olmaktan uzak, ancak genellikle bazı genel sorunlardan uzak durmanıza yardımcı olacak makul güvenlikli seçimler.

Bu sorunları tanımlayın, formatınızı akılda tutarak tasarlayın ve mükemmel bir ikili format oluşturabilirsiniz.

İkili bir format oluşturacak kadar deneyimli değilseniz ve kendinize güvenmiyorsanız ve veri miktarı hız etkisinin ihmal edilebileceği kadar küçükse, JSON kullanmanızı öneririm, basittir, ancak işi yapar.


6

Dosya formatı seçiminiz büyük ölçüde mevcut araç setinize ve yapmak istediğiniz oyuna bağlıdır . Bu sözü edilen...

Bir oyun dosyası formatı karar verirken araç seti en önemli faktörlerden biridir. Eğer bir yaparsanız ikili biçimi , her zaman sağlamak zorunda araçlara sahip oyun verilerinin girişi için. Bu bir hex editörü kadar basit veya Unreal Editor kadar karmaşık olabilir.

Sanırım XML, YAML veya diğer dil dosyalarının en büyük avantajı, onu bir metin editörü ile kolayca düzenleyebilmenizdir. Ve mevcut bir standardı kullanarak, yanlış gidememenizi sağlar . Ancak, bu beni bir sonraki noktaya getiren bin dosyanız olduğunda bu çok sıkıcıdır .

Oyun. Ne tür bir oyun yapıyorsun? Neden bunun dosya biçimini etkileyeceğini söylüyorum? Çünkü, 2D bombardıman gibi bir şey yapıyorsanız, aşağıdaki gibi basit bir metin dosyasıyla kurtulabilirsiniz :

*********
*1     2*    1,2,3,4  - start point of players 1, 2, 3, 4
* + + + *    *        - walls
*       *    +        - crates
* + + + *
*3     4*
*********

Başka bir deyişle, her zaman belirli verileriniz için en belirgin olanı seçin . RPG'ler yapmak için en karmaşık oyun türüdür. Çok fazla veri gerektiriyorlar. Ancak , oyundaki tüm veriler için ikili veya metin tabanlı olmak üzere, belirli bir formata sahip olmanız gerektiği anlamına gelmez .

  • Haritalar, parçacıklar ve diğer grafikler , özel bir ikili format kullanma eğilimindedir. Çünkü uygulamanın en basit yolu . Haritaları metinsel olarak tanımlamak insanca aklı başında değil. Genellikle harita / seviye / parçacık editörleri aracılığıyla düzenlenir.
  • Oyuncular, eşyalar, düşmanlar, yetenekler ve görevler oyun dengesini etkileyen istatistiklerdir . Genellikle çok fazla ve çok fazla giriş ve ayar gerektirirler. Bunu, uygulama kolaylığı için bir XML dosyasına koyarak, ancak tasarımcıların oynaması için bir nesne editörü bulundurmayı seviyorum. İki dünyanın da en iyisi .

Genel olarak, metni metin biçiminde ve grafikleri ikili biçimde tanımlamak istiyorsunuz. Aşağıdaki size bir örnek vermelidir:

<Skill>
    <Name>Fireball</Name>
    <Animation>fireball.dat</Animation> <!-- Graphics described in another file -->
    <Attack>1.3</Attack>
    <Cooldown>15</Cooldown>
</Skill>

Özetlemek gerekirse, mümkünse, kesinlikle gerekmedikçe , verilerinizi kodlamamanız konusunda tavsiyem . Son kullanıcı, oyun oynanabildiği sürece önemli olan formatın ne kadar harika olduğu umurumda değil.

Şerefe, Roy =)


5

BSON oldukça hoş. http://bsonspec.org/ . JSON ayrıştırmak daha kolay ve ikili veri içeren daha iyidir, ancak yine de güzel bir yapıya sahiptir. Protokol tamponlarına biraz benziyor. Dezavantajı, dosent'in mongodb dışında bunun için çok fazla araç desteği gibi görünmesidir.

EDIT: MsgPack ( http://msgpack.org/ ) de BSON'a benzer ve daha fazla çekiş kazanıyor gibi görünüyor.


1
"İkili JSON" fikrinin iyi olduğunu düşünürken BSON'a çok az inancım var, çok fazla (gereksiz) veri türü var ve belgeler berbat.
aaaaaaaaaaaa

2

Özel ikili veri biçiminize ne oldu? Ham seri hale getirilmekten korkarsanız, alanları gerektiği gibi yazan kendi sisteminizi yazın ve bunları tekrar okuyun. Biçimin sağladığı saydamlığa ihtiyaç duymadığınız durumlar için gerçekten aşırı büyük ve karmaşık olan xml'ye gerek yok. Sadece iyi tanımlanmış bir dosya formatı tanımlayın ve ona yapıştırın, belki de her kayıttaki veri setinizi genişletmek için boş yer bırakarak onları boş değerlerle doldurun.
Bir sürüm numarası ve belki de bir sağlama toplamı ekleyin, böylece hangi alanların doldurulması gerektiğini ve geçerliliği kontrol etmek için akıl sağlığı kontrolünü yaptırmanız yeterlidir.


1

Bazı belirli veriler için XML veya başka bir formatı Base64 eklentileriyle karıştırabilir ve okunabilirliğe ihtiyacınız olan alanlar için normal METİNİ kullanabilirsiniz.

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.