Apa format file yang baik untuk menyimpan data game? [Tutup]

37

Saya perlu menyimpan beberapa data game khusus. Peta, pemain, dll.

Semuanya akan memiliki "sub objek". Misalnya, peta dan peta akan memiliki "larik" ubin. yaitu, data hierarkis. Semoga tidak ada biner.

Apa format yang baik untuk ini?

Sejauh ini saya telah mempertimbangkan:

Serailization: Ini CEPAT dan mudah, tetapi cenderung rusak ketika saya mengubah kelas yang mendasarinya :(

XML: Saya sangat benci menguraikan ini. Kasing pengujian saya adalah lebih dari 100 baris kode dan sepertinya banyak sekali "pekerjaan sibuk" bahkan untuk format yang sangat sederhana.

INI: akan sangat janggal untuk data hierarkis.

Protobuf: Tidak pernah menggunakannya, tetapi membaca Anda harus melakukan banyak manual mucking dan istirahat jika Anda mengubah kelas.

Pilihan lain? Itu sebabnya saya di sini!

Sunting: ini adalah Java btw.

Edit 2:

Saya memilih "Serialisasi Biner Terkendali" (lihat di bawah).

Pro:

  • itu cepat

  • itu kecil (pada disk) dan dapat dengan mudah dikompresi / didekompresi saat membaca / menulis.

  • sangat mudah untuk membaca / menulis dari game dan toolset.

  • Saya dapat memutuskan apa yang akan disertakan / dikecualikan dari objek.

  • Objek / Data dapat disarangkan.

Cons:

  • Tidak dapat mengeditnya dengan tangan (seperti XML, YAML, dll)

  • Tidak dapat dengan mudah membaca / memodifikasinya dengan skrip

  • Serialisasi Java secara default cukup lambat / kembung dibandingkan dengan implementasi lain, tetapi stabil dan berfungsi

pengguna697111
sumber
3
nilai yang dipisahkan koma
Thomas Eding
@trinithis KISS adalah hal yang hebat.
Nate
3
Jangan jatuh ke dalam perangkap yang berpikir penguraian CSV itu mudah: secretgeek.net/csv_trouble.asp
Tetrad
Lucu, ProtoBuf dibangun untuk mendukung peningkatan kemampuan.
Jonathan Dickinson
Penyanyi untuk semua yang dapat dimodifikasi pengguna seperti pengaturan, dll; dan biner untuk yang lainnya.
Uğur Gümüşhan

Jawaban:

38

Untuk menampilkan data hierarki, YAML atau JSON akan menjadi opsi yang baik. Mereka jauh lebih sederhana dan lebih mudah diurai daripada XML.

Pilihan lain adalah proses serialisasi biner "terkontrol". Setiap objek menulis itu menyatakan secara terkendali, yaitu

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

id Tech 4 (mesin Quake 4 / Doom 3) menggunakan pendekatan seperti itu.

Raphael R.
sumber
+1 Untuk serialisasi biner "yang dikendalikan". Saya menggunakan ini di tempat kerja dan itu bagus!
NoobsArePeople2
1
+1 lainnya untuk serialisasi biner "yang dikendalikan". Meskipun saya belum pernah mendengar nama itu sebelumnya, saya melakukan sesuatu yang serupa di beberapa tempat - dilakukan dengan benar, ini memiliki keuntungan untuk dapat menetapkan default untuk bidang yang baru ditambahkan yang tidak ada dalam file data, dan mengabaikan " sampah "dalam file data saat bidang dihapus dari model.
Izkata
Saya menggunakan sesuatu seperti ini di game saya. Itu bekerja dengan baik! Saya menggunakan java. Setiap objek memiliki metode ToByteStream yang menulis ke aliran file dan konstruktor yang membaca dari aliran file. Saya tidak suka implementasi Serializable Javas.
MichaelHouse
4
Atau Anda bisa saja menggunakan Boost. Bersertifikat dan dapatkan fitur-fitur luar biasa seperti versi dan sebagainya.
Nicol Bolas
@Izkata Saya telah membuat nama itu karena saya tidak tahu bagaimana metode ini disebut.
Raphael R.
9

Format biner yang dibuat dengan baik benar-benar memiliki semua kelebihan, cepat, cukup kecil, dan sefleksibel Anda membuatnya.

Membuat format biner Anda tidak terikat oleh aturan, yang merupakan keuntungan besar, tetapi ironisnya sebagian besar yang memberi struktur file biner nama yang buruk. XML, JSON dan sejenisnya membuat banyak keputusan untuk Anda, mereka jauh dari selalu optimal, tetapi mereka adalah pilihan yang cukup aman yang biasanya akan membantu Anda menghindari beberapa masalah umum.

Identifikasi masalah ini, rancang format Anda dengan yang ada dalam pikiran, dan Anda dapat membuat format biner yang hebat.

Jika Anda tidak berpengalaman / cukup percaya diri untuk membuat format biner dan jumlah data cukup kecil sehingga dampak kecepatannya dapat diabaikan, saya sarankan Anda menggunakan JSON, itu sederhana, tetapi berhasil.

aaaaaaaaaaaa
sumber
6

Pilihan Anda format file sangat tergantung pada Anda saat toolset dan permainan Anda berniat untuk membuat. Dengan mengatakan ...

Toolset adalah salah satu faktor terpenting ketika memutuskan format file game. Jika Anda membuat format biner , Anda harus selalu memastikan bahwa Anda memiliki alat untuk memasukkan data gim Anda. Ini bisa sesederhana hex editor, atau serumit Unreal Editor.

Saya kira keuntungan utama XML, YAML, atau file bahasa lainnya, adalah Anda dapat mengeditnya dengan mudah melalui editor teks. Dan menggunakan standar yang ada, memastikan Anda tidak salah . Tapi, ini sangat membosankan ketika Anda memiliki seribu file, yang membawa saya ke poin saya berikutnya.

Permainan. Game seperti apa yang kamu buat? Mengapa saya mengatakan ini akan mempengaruhi format file? Karena, jika Anda membuat sesuatu seperti bomberman 2D, Anda bisa lolos dengan file teks sederhana seperti:

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

Dengan kata lain, selalu gunakan format yang paling jelas untuk data spesifik Anda . RPG adalah genre game yang paling rumit untuk dibuat. Mereka membutuhkan banyak data. Tetapi tidak berarti Anda harus menempel format tertentu , baik itu biner atau berbasis teks untuk semua data dalam game.

  • Peta, partikel, dan hal - hal grafis lainnya cenderung menggunakan format biner khusus. Karena itu cara paling sederhana untuk mengimplementasikannya . Tidak waras secara manusiawi untuk menggambarkan peta secara tekstual. Biasanya diedit melalui editor peta / level / partikel.
  • Pemain, item, musuh, keterampilan, dan pencarian adalah statistik yang memengaruhi keseimbangan game . Mereka biasanya membutuhkan banyak input dan penyesuaian. Saya suka melakukan ini dengan meletakkannya dalam file XML untuk kemudahan implementasi, tetapi memiliki editor objek untuk para desainer untuk bermain. Terbaik dari kedua dunia .

Secara umum, Anda ingin mendeskripsikan teks dengan format teks, dan grafik dengan format biner. Berikut ini akan memberi Anda contoh:

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

Singkatnya, itu adalah rekomendasi saya sepenuhnya bahwa jika memungkinkan, Anda tidak membuat skrip data Anda, kecuali benar-benar diperlukan . Pengguna akhir tidak peduli seberapa hebat formatnya, asalkan permainan dapat dimainkan, itu yang terpenting.

Cheers, roy =)

Roy
sumber
5

BSON cukup bagus. http://bsonspec.org/ . Lebih mudah untuk menguraikan JSON dan lebih baik dalam berisi data biner, tetapi masih memiliki struktur yang bagus. Ini agak mirip dengan buffer protokol. The downside adalah bahwa ada dosis tampaknya banyak dukungan alat untuk itu di luar mongodb.

EDIT: MsgPack ( http://msgpack.org/ ) juga mirip dengan BSON dan tampaknya mendapatkan daya tarik lebih.

dasar
sumber
1
Sementara saya berpikir bahwa ide "binary JSON" bagus, saya kurang percaya pada BSON, ada terlalu banyak tipe data (redundan), dan dokumentasinya payah.
aaaaaaaaaaaa
2

Apa yang terjadi dengan format data biner khusus Anda? Jika Anda takut serialisasi mentah, tulis sistem Anda sendiri yang menulis bidang sesuai kebutuhan, dan membacanya kembali. Tidak perlu xml, yang memang terlalu besar dan rumit untuk situasi di mana Anda tidak memerlukan transparansi yang disediakan oleh format. Cukup tentukan format file yang ditentukan dengan baik dan berpegang teguh padanya, menyisakan mungkin beberapa ruang untuk perluasan set data Anda di setiap record dengan menambahkannya dengan nilai nol (misalkan Anda memiliki record 100 byte sekarang, padukan ke 150 untuk digunakan di masa depan.
Tambahkan nomor versi dan mungkin sebuah checksum sehingga Anda dapat mengetahui bidang apa yang harus diisi dan melakukan pemeriksaan kewarasan untuk validitas, dan Anda siap melakukannya.

jwenting
sumber
1

Anda dapat mencampur XML atau format lain dengan penyisipan Base64 untuk beberapa data tertentu, dan untuk bidang yang perlu dibaca Anda dapat menggunakan TEXT biasa

Yevhen
sumber