Apakah lebih baik menggunakan XML / JSON / Teks atau database untuk menyimpan konten game?

29

Saya sedang mempertimbangkan bagaimana menerapkan permainan berbasis komponen, karena itu tampaknya menjadi hal yang panas dan saya suka ide desain yang fleksibel. Salah satu fitur dari desain seperti itu adalah bahwa menambahkan hal-hal baru ke permainan dapat dilakukan melalui data, sering disajikan sebagai memuat konten melalui file teks seperti XML. Ini memiliki keuntungan karena dapat dibaca manusia dan mudah diedit dalam editor teks apa pun. Pada sisi negatifnya, teks bisa lebih lambat untuk ditangani, dan Anda harus mengelola banyak koleksi file data. Format berbasis teks yang serupa seperti JSON atau file konfigurasi akan memiliki manfaat serupa.

Di sisi lain, ada database kecil dan portabel seperti SQLite atau Tokyo Cabinet. Meskipun tidak langsung dapat dibaca oleh manusia, file-file ini mudah untuk dihubungkan, dan saya membayangkan beberapa jenis alat pengeditan akan lebih disukai untuk desain konten game. Menggunakan DB memungkinkan penyimpanan informasi konfigurasi yang konsisten dan pengambilan yang mudah. Anda bisa membuat cerita bersambung data menjadi DB untuk menyimpan game juga.

Dari segi kinerja, saya pikir secara umum XML lebih cepat untuk file kecil tetapi basis data lebih baik untuk sejumlah besar data. Saya membayangkan setiap game nyata akan memiliki banyak objek game.

Jadi pertanyaannya: Mana pendekatan yang lebih disukai? Saya condong ke DB, tapi saya ingin tahu apakah ada jebakan tersembunyi atau keuntungan nyata yang kuat untuk file teks. Atau jika ada alternatif lain selain ini (cerita bersambung ke format biner kurasa?)

CodexArcanum
sumber

Jawaban:

18

Ini mungkin tidak muncul begitu banyak untuk game pribadi kecil, tetapi satu masalah sulit ketika datang ke data game adalah multi-user editing / versioning. Kami menggunakan banyak file teks kecil yang dimasukkan ke sejumlah kecil biner gumpalan oleh proses build. Ini membuat hidup lebih mudah bagi desainer karena mereka memiliki banyak fleksibilitas dalam alur kerja mereka. CCP, sebagai contoh balasan, menggunakan database pengeditan pusat yang terhubung dengan semua desainer. Ini membuat langkah build tidak diperlukan (atau setidaknya jauh lebih sederhana) tetapi itu berarti Anda perlu mengimplementasikan semua fitur versi dan alur kerja sendiri, sehingga mereka pasti akan lebih sederhana daripada alat lain di luar sana. Anda dapat menangani kinerja dalam kedua kasus tersebut, jadi pertanyaan sebenarnya adalah apa yang Anda inginkan untuk alur kerja desainer dan bagaimana Anda bisa sampai di sana?

pembuat kode
sumber
Itu poin yang bagus. Saya belum mempertimbangkan alur kerja multi-orang terlalu dekat atau kontrol versi. Keduanya adalah argumen yang sangat baik dalam mendukung file teks, setidaknya sebagai dokumen sumber. Dukungan alat yang lebih mudah juga. Terima kasih untuk perspektif itu!
CodexArcanum
Cukup mudah untuk mengekspor database ke XML juga. Dengan hanya sedikit perencanaan kedepan, Anda dapat menulis pemuat komponen Anda sebagai antarmuka - kemudian tancapkan pembaca database atau pembaca file xml. Saat membangun komponen, database mungkin lebih mudah karena ada GUI siap pakai untuk semua manipulasi data vs mengedit banyak file. Kemudian, dalam proses pembuatan akhir, cukup simpan basis data ke xml, panggang ke biner, dll ... dan versi produksi dari gim ini hanya menggunakan loader yang sesuai.
Lenensi
1
Bagaimana itu membantu? Menggunakan editor khusus dan kemudian menghasilkan file teks benar-benar memberi Anda bagian terburuk dari setiap opsi:
P
7

JSON sangat ringan dan mudah dimengerti. Saya pikir ini lebih cocok untuk permainan. cJSON sangat bagus. itu juga akan dimasukkan ke sumber Anda dengan cara yang sama seperti SQLlite.

File XML lebih sulit untuk diedit oleh pengguna daripada yang Anda kira. jika Anda pergi ke rute itu, Anda mungkin ingin membuat editor untuk digunakan orang-orang untuk membantu mereka menghindari perangkap umum.

McKay
sumber
Saya benar-benar tidak pernah melihat JSON sebanyak itu, karena saya senang dengan XML (Betapa lebih mudahnya itu benar-benar terjadi) .. ternyata JSON sangat menakjubkan ... tapi seperti XML tidak yakin bagaimana itu akan bekerja jika itu sangat data heavy
Spooks
7

Saya terlambat ke pesta di sini tapi saya menghabiskan banyak waktu untuk meneliti hal ini.

Pertama mengapa saya tidak menggunakan yang berikut ini:

XML: Berlebihan verbose. Banyak redundansi. Mengulangi nama bidang? KOTOR

JSON: Saya pikir JSON bagus untuk tata letak UI tetapi untuk database, tidak. Ini akan memiliki masalah yang sama seperti XML, redundansi, dan bersarang dalam. KOTOR.

SQL : Ini adalah opsi yang bagus, jika Anda mengelola sakit kepala pengaturannya. Saya telah membuat game seluler tempat kami menyimpan data game online dalam basis data SQL. Format tabelnya bagus. Masalahnya adalah kami harus mengambil databasenya dari online dan pengaturannya bisa merepotkan. Tetapi SQL adalah solusi yang layak. Unity tidak mendukung ini secara asli, dan plugin yang saya coba memiliki masalah besar (khususnya ketika mencoba membuatnya berfungsi dengan kontrol versi).

Akhirnya, inilah solusi yang saya pilih untuk digunakan (dan saya menyukainya).

CSV : Sederhana. Mari saya gunakan format tabel, dan saya punya satu titik referensi mudah ketika saya perlu memperbaruinya. Saya dapat memiliki tabel untuk semua senjata saya, kolom untuk semua atribut, dan baris untuk setiap jenis senjata.

Anda dapat menggunakan Microsoft Excel tetapi itu memuntahkan peringatan bodoh ini setiap kali Anda perlu menyimpan. Anda dapat menggunakan makro untuk menimpanya, tetapi saya katakan selamatkan masalah Anda dan dapatkan LibreOffice . Ini gratis, mendukung pengeditan CSV, dan ketika Anda membuka file itu memuat lebar kolom untuk mencocokkan nama (Excel tidak melakukan ini dan itu membuat saya gila).

Maka Anda hanya perlu mem-parsing file CSV ke dalam gim Anda. Saya menggunakan Unity sehingga yang harus saya lakukan adalah menggunakan parser C # CSV yang bagus ini yang saya temukan:

Contoh parser CSV

Anda mengonversi file CSV menjadi objek data game dan Anda siap melakukannya. Dengan Unity Anda dapat mengubahnya menjadi ScriptableObjects . Jadi alur kerja saya adalah: Perbarui CSV -> Parse CSV ke dalam Objek Scriptable -> Gunakan data dari ScriptableObjects untuk game saya

Agresor
sumber
6

Jawabannya tergantung pada bahasa apa yang Anda gunakan untuk game.

Jika Anda menggunakan C ++, Anda disarankan untuk menggunakan salah satu pustaka XML yang ada (seperti TinyXml atau eXpat ).

Di sisi lain, jika Anda menggunakan PHP, Anda dapat dengan mudah menggunakan server database seperti MySQL atau SQLite. (Perlu diingat bahwa jika Anda menggunakan rute ini, Anda akan membutuhkan lebih banyak sumber daya karena server database akan berjalan sebagai proses terpisah dan aplikasi database yang lebih besar seperti MySQL dapat mengkonsumsi banyak RAM saat menjalankan.)

JSON mendapatkan banyak momentum dan tentu saja merupakan pilihan terbaik jika aplikasi Anda ditulis menggunakan lebih dari satu bahasa.

Singkatnya, itu tergantung pada apa yang mudah digunakan dalam bahasa Anda.

George Edison
sumber
1
Apa masalah menggunakan DB dari C ++?
Budda
2

Jika Anda ingin tetap berada di ranah XML, Anda dapat menggunakan Binary XML untuk membantu meningkatkan kinerja pemuatan.

Misalnya Fast Infoset adalah implementasi dari xml biner

Orang dapat menganggap Fast Infoset sebagai gzip untuk XML, meskipun FI bertujuan untuk mengoptimalkan ukuran dokumen dan kinerja pemrosesan, sedangkan gzip hanya mengoptimalkan ukuran. Sementara pemformatan asli hilang, tidak ada informasi yang hilang dalam konversi dari XML ke FI dan kembali ke XML.

David Young
sumber
Meskipun mungkin bukan sesuatu yang akan saya gunakan (saya condong ke JSON melalui XML) Saya sangat menghargai tautannya.
CodexArcanum
1

Saya telah merancang basis data dan bermain-main dengan banyak ide permainan selama bertahun-tahun sekarang. Favorit pribadi saya saat ini, adalah beberapa format berbasis teks yang dapat dibaca manusia untuk konfigurasi, tetapi kemudian menguraikan "skrip lambat" ini menjadi sesuatu yang lebih dapat dijalankan. Sama seperti JAVA dan .NET dikompilasi ke dalam bytecode Run-time.

Gagasan yang sama berlaku di sini. Saya memiliki versi "sumber" komponen dan kemudian pre-compiler / parser menjalankannya. Jika mereka mengambil terlalu banyak memori, Anda dapat menempatkannya dalam database-cepat SQL dari beberapa agak atau menyimpannya sebagai file biner. Tapi maksud saya adalah, gunakan memori atau database SQL sebagai ruang kerja / cache Anda sehingga Anda tidak perlu menguraikan skrip berulang-ulang. Anda dapat membuat kompilator, memindahkan file yang diurai menjadi "source-lib" dan dengan cara ini biarkan precompiler melakukan versi juga (menjaga file sebelumnya untuk tujuan rollback).

Jika ini tentang "ruang harddisk tanpa batas", maka daftar ke sesuatu seperti Dropbox atau Amazon S3 dan sinkronkan dengan mereka.

Jadi rencana untuk saya saat ini:

  1. Config / scripts / xml (beberapa format yang dapat dibaca manusia) sebagai file teks (seperti kode sumber)
  2. Parser / validator yang dijalankan melalui skrip baru dan memeriksa apakah mereka mengikuti aturan
  3. Compiler yang membuat biner atau SQL-row keluar dari file asli, sehingga ini cepat untuk retreive + cepat untuk dijalankan.

Mengenai stabilitas, saya saat ini sedang membangun database untuk menjadi "co-location host" dan autosync antara beberapa lokasi juga, sehingga jika ada kegagalan jaringan / perangkat keras satu lokasi, situs lain harus dapat menangani lalu lintas yang sama / gamestates.

BerggreenDK
sumber
Solusi menarik, terutama mengingat seberapa banyak cloud hosting telah berkembang sejak jawaban Anda ditulis.
rideoutcolin
1

Jika Anda menggunakan couchdb, Anda pada dasarnya akan menyimpan semuanya sebagai struktur JSON. Couchdb akan membantu mereplikasi (beberapa) data pengguna Anda lebih atau kurang tanpa rasa sakit.

egarcia
sumber
0

Anda dapat menemukan prosedur di Unity Wiki dengan PHP, MySQL dan C # / JavaScript, dan berfungsi dengan baik untuk tujuannya.

Ini terdiri dari tiga langkah

  1. Buat Database MySQL kosong dan tabel.
  2. Buat skrip sisi server PHP (Ini akan terhubung ke tabel MySQL, menerima data dari skrip Unity (langkah 3), dan query database (contoh yang diberikan adalah memasukkan data atau memilih))
  3. Buat Unity Controller Script (Ini akan terhubung ke skrip PHP yang dibuat pada langkah 2)
Tiago mendukung GoFundMonica
sumber