Saya sedang mengerjakan alat pengeditan level yang menyimpan datanya sebagai XML.
Ini ideal selama pengembangan, karena tidak sulit untuk membuat perubahan kecil pada format data, dan ini bekerja dengan baik dengan data seperti pohon.
The downside, meskipun, adalah bahwa file XML agak membengkak, sebagian besar karena duplikasi nama tag dan atribut. Juga karena data numerik mengambil lebih banyak ruang secara signifikan daripada menggunakan tipe data asli. Level kecil bisa dengan mudah berakhir sebagai 1 MB +. Saya ingin menurunkan ukuran ini secara signifikan, terutama jika sistem ini akan digunakan untuk permainan di iPhone atau perangkat lain dengan memori yang relatif terbatas.
Solusi optimal, untuk memori dan kinerja, akan mengkonversi XML ke format tingkat biner. Tetapi saya tidak ingin melakukan ini. Saya ingin menjaga formatnya tetap fleksibel. XML membuatnya sangat mudah untuk menambahkan atribut baru ke objek, dan memberi mereka nilai default jika versi lama dari data dimuat. Jadi saya ingin tetap dengan hierarki node, dengan atribut sebagai pasangan nama-nilai.
Tapi saya perlu menyimpan ini dalam format yang lebih ringkas - untuk menghapus duplikasi nama tag / atribut yang masif. Mungkin juga untuk memberikan atribut tipe asli, jadi, misalnya data titik-mengambang disimpan sebagai 4 byte per float, bukan sebagai string teks.
Google / Wikipedia mengungkapkan bahwa 'XML biner' bukan masalah baru - sudah dipecahkan beberapa kali. Adakah yang punya pengalaman di sini dengan sistem / standar yang ada? - apakah ada yang ideal untuk penggunaan game - dengan parser / loader library (C / C ++) gratis, ringan dan lintas platform?
Atau haruskah saya menemukan kembali roda ini sendiri?
Atau apakah saya lebih baik melupakan yang ideal, dan hanya mengompresi data .xml mentah saya (ini harus dikemas dengan baik dengan kompresi mirip zip), dan hanya mengambil memori / kinerja mencapai on-load?
sumber
Jawaban:
Kami banyak menggunakan XML biner untuk Pengembalian Superman: Videogame . Kami berbicara ribuan file. Itu bekerja dengan baik, tetapi jujur tampaknya tidak sepadan dengan usaha. Itu memakan sebagian kecil dari waktu pemuatan kami, dan "fleksibilitas" XML tidak meningkat. Setelah beberapa saat, file data kami memiliki terlalu banyak pengidentifikasi aneh, referensi eksternal yang perlu disinkronkan, dan persyaratan aneh lainnya agar benar-benar layak diedit oleh manusia lagi.
Juga, XML benar-benar format markup, dan bukan format data. Ini dioptimalkan untuk banyak teks dengan tag sesekali. Itu tidak bagus untuk data terstruktur penuh. Itu bukan panggilan saya, tetapi jika sudah dan saya tahu apa yang saya tahu sekarang, saya mungkin akan melakukan JSON atau YAML. Keduanya cukup singkat untuk tidak memerlukan pemadatan, dan dioptimalkan untuk merepresentasikan data , bukan teks .
sumber
Simpan dan edit level Anda sebagai XML normal, tetapi minta mesin game Anda dengan malas memanggangnya menjadi XML biner selama memuat, dan menyimpan XML biner kembali ke disk sehingga dapat memuatnya di lain waktu (jika XML mentah belum berubah) .
Sesuatu seperti ini:
Dengan begitu Anda mendapatkan yang terbaik dari kedua dunia. Pada rilis, Anda hanya perlu memastikan semua file biner ada di sana.
sumber
Google Protocol Buffer sepertinya cara untuk melakukannya, tetapi saya belum menggunakannya sendiri.
http://code.google.com/p/protobuf/
Anda mendefinisikan file .proto yang menjelaskan format file:
Ini kemudian dikompilasi dengan alat baris perintah yang menghasilkan kelas C / C ++ untuk menulis dan mengurai file data biner dalam format data yang didefinisikan sebelumnya. Ada juga beberapa ekstensi untuk berbagai bahasa pemrograman.
Kelemahan dari ProtocolBuffer adalah bahwa mereka bukan format plaintext. Anda membutuhkan alat untuk membuat, membaca, dan mengeditnya. Tapi ini seharusnya tidak menjadi masalah jika Anda menggunakannya hanya untuk bertukar data antara editor game Anda dan game Anda. Saya tidak akan menggunakannya untuk mendefinisikan file konfigurasi;)
Mengompresi file xml mentah juga harus berfungsi. Jenis permainan apa yang Anda buat? Jika berbasis level maka Anda harus memuat semua sumber daya yang diperlukan hanya sekali ketika level dimuat.
pembaruan: Ada beberapa proyek untuk bahasa lain seperti C # untuk bekerja dengan ProtocolBuffers:
http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns
sumber
.proto
file, yang hampir menghilangkan masalah miskomunikasi. Protos jauh lebih mudah dibaca / dipelihara daripada skema xml, jika Anda bahkan memiliki disiplin (dan waktu) untuk menggunakan skema xml.Bagaimana dengan format JSON?
http://www.json.org/xml.html
sumber
"cars":{"ford":[8C,FA,BC,2A,384FFFFF],"holden":[00,00,04,FF,04FF54A9]}
Anda bahkan dapat menghilangkan pengidentifikasi "mobil" dan langsung masuk ke array jika Anda tahu di mana lapangan mobil akan berada. Anda bahkan dapat menghilangkan "ford" dan "holden" nama jika Anda tidak perlu menyimpan data itu, meninggalkan Anda dengan:[...,[[8C,FA,BC,2A,384FFFFF],[00,00,04,FF,04FF54A9]]]
. Apakah ini menjadi lebih ringkas?Gunakan JSON.
(Membangun tanggapan Munificent, dan sebagian besar sebagai tanggapan atas keprihatinan Anda yang diungkapkan di tempat lain)
Anda telah menyebutkan kekhawatiran bahwa JSON memiliki masalah membuang elemen penamaan ruang, seperti XML. Tidak.
JSON dibangun di atas dua struktur: pasangan nama / nilai ( objek ) dan daftar nilai yang terurut ( array ). XML dibangun hanya pada pasangan nama / nilai.
Jika Anda berpikir JSON mengandalkan objek yang telah Anda baca, JSON yang dibangun untuk bersifat deskriptif dan dapat dibaca manusia, seperti ini (menggunakan pasangan digit oktal untuk mewakili byte tunggal):
Namun Anda juga memiliki pilihan untuk menulisnya seperti ini, selama Anda tahu di mana semuanya akan berada (dan dapat mencari indeks 4, daripada objek "mobil", untuk mendapatkan daftar mobil Anda):
Apakah itu bisa lebih ringkas daripada hanya memiliki
[
,]
,,
dan nilai-nilai Anda?Ya, itu terjadi jika Anda bersedia untuk semakin dekat dan lebih dekat ke aliran biner murni.
Hanya saja, jangan menembak diri sendiri dengan mengoptimalkan terlalu banyak.
sumber
Saya tahu Anda telah menerima jawaban, tetapi Google "Fast Infoset" (binary XML) dan vtd-xml.
Meskipun yang terakhir (VTD) mungkin tidak menyelesaikan aspek kompresi penggunaan XML Anda, itu mungkin mempercepat akses node di file besar, jauh (itu menggunakan 'kamus' offset biner untuk melompat ke node, dan tidak membuat objek untuk setiap node , alih-alih bekerja pada string XML asli). Oleh karena itu, pencarian XML-nya [dikatakan] lebih cepat dan tidak memerlukan banyak memori dalam proses untuk mengakses / memanipulasi dokumen XML.
Kedua hal di atas memiliki binding dalam bahasa populer (yang termasuk C #).
Bersulang
Kaya
sumber
Anda bisa mencoba Karvonite . Seharusnya lincah. Ini adalah kerangka kerja tetap yang akan beradaptasi dengan perubahan data Anda dengan cukup baik (yang lebih baik dibandingkan dengan menangani biner diri Anda). Saya tidak benar-benar yakin bagaimana data terstruktur, tetapi file-file ini jauh lebih kecil daripada file kembung xml. (Saya berasumsi ini menyimpan data dalam format biner alih-alih teks seperti xml)
Satu-satunya hal yang bisa saya pikirkan dengan ini adalah bahwa jika data Anda rusak atau seberapa kacau dengan cara yang tidak disukai Karvonite, jenis Anda pada belas kasihan pembuatnya kecuali jika Anda mengetahui bagaimana struktur dari data bekerja.
Cara Anda menentukan cara menyimpan / memuat data adalah Anda cukup membuka editor kegigihan mereka, mengimpor unit Anda dengan semua objek data dan mencentang beberapa kotak centang untuk menunjukkan objek apa yang ingin didukung dan bidang / properti apa yang akan disimpan.
Mungkin patut dicoba. Karena Anda menggunakan C #, ini cocok dengan bahasa Anda karena berfungsi dengan XNA (Windows, Xbox360, dan Windows Phone 7 yang saya pikir Anda tertarik sejak Anda menyebutkan iPhone?).
Sunting: Hanya perhatikan bahwa Anda hanya menggunakan C # untuk alat-alat tersebut. Ini mungkin tidak cocok dengan alur kerja Anda. Untuk beberapa alasan saya memiliki XNA di kepala saya.
sumber