Haruskah saya menggunakan database SQL untuk menyimpan data di game desktop? [Tutup]


9

Mengembangkan Mesin Game

Saya merencanakan permainan komputer dan mesinnya. Akan ada dunia 3 dimensi dengan tampilan orang pertama dan itu akan menjadi pemain tunggal untuk saat ini. Bahasa pemrogramannya adalah C ++ dan menggunakan OpenGL.

Keputusan Desain Pusat Data

Keputusan desain saya adalah menggunakan arsitektur berpusat data di mana ada manajer acara global dan manajer data global . Ada banyak komponen seperti fisika, input, suara, renderer, ai, ... Setiap komponen dapat memicu dan mendengarkan acara . Selain itu, setiap komponen dapat membaca, mengedit, membuat, dan menghapus data .

Pertanyaannya adalah tentang pengelola data.

Apakah akan menggunakan Database Relasional

Haruskah saya menggunakan Database SQL, misalnya SQLite atau MySQL, untuk menyimpan data game? Ini berisi hampir semua konten game seperti item, karakter, inventaris, ... Kecuali jerat dan tekstur yang bahkan lebih terkait dengan kinerja, jadi saya akan menyimpannya dalam memori.

Apakah database SQL cukup cepat untuk menggunakannya untuk membaca realtime dan menulis informasi game, seperti posisi karakter yang bergerak? Saya juga perlu peduli tentang kompatibilitas lintas platform. Selain menyimpan semua dalam ingatan, alternatif apa yang saya miliki?

Keuntungan Akan Menjadi

Keuntungan menggunakan database relasional seperti MySQL adalah struktur berorientasi data yang memungkinkan komputasi cepat. Saya tidak perlu objek untuk mewakili entitas. Saya dapat dengan mudah meminta data objek di dekat pemain yang diperlukan untuk rendering. Dan saya tidak perlu berhati-hati dengan data objek yang jauh. Selain itu tidak perlu savegames karena status hole game disimpan dalam database. Last but not least, memperluas game ke game online akan relatif mudah karena sudah ada tempat di mana status hole game disimpan.


Anda mungkin ingin mempertimbangkan objek database lebih dari database relasional, yang menyelesaikan beberapa masalah yang disebutkan dalam jawaban yang diterima tentang skema rapuh dan semacamnya.
ashes999

Jika Anda memiliki proses yang lebih cocok untuk database relasional, Anda dapat menggunakan SQL Tertanam dengan akses memori hibrid. Ini akan memotong banyak masalah yang membuat database SQL tradisional tidak cocok untuk tuntutan kinerja permainan.
rovyko

Jawaban:


11

Basis data SQL hampir tidak cukup cepat untuk digunakan untuk membaca dan menulis informasi permainan secara waktu nyata. Data tersebut hampir selalu disimpan dalam memori, dalam struktur data tradisional.

Mungkin ada beberapa manfaat menggunakan database tertanam seperti SQLite untuk tipe data tertentu, misalnya. data statis yang tidak berubah selama bermain game tetapi berubah selama pengembangan. Ini kemudian dapat digunakan sebagai bagian dari game terakhir di mana SQLite hanya benar-benar digunakan saat memuat game untuk pertama kalinya, atau ketika memulai level baru, dll.

Namun ada juga banyak kerugiannya - sulit untuk menambal bagian-bagian individual dari data ketika mereka disimpan dalam file database tunggal, itu tidak ideal untuk banyak jenis data kompleks yang dibutuhkan game (dan yang Anda katakan akan menyimpan di luar - tetapi akan memiliki referensi ke dan dari hal-hal di dalam), itu tidak sangat fleksibel ketika Anda perlu mengubah skema, itu tidak selalu kompatibel ke belakang setelah Anda mengubah skema, dll.

Untuk alasan ini, sebagian besar pengembang game hanya akan menggunakan format mereka sendiri. Pengembang profesional yang sadar kinerja kadang-kadang melangkah lebih jauh dan menyimpan struktur data dalam memori langsung ke disk sehingga dapat dimuat dengan pemrosesan minimum.

Dan jika Anda benar-benar membutuhkan data tabular berbasis teks yang mudah diedit, Anda bisa menggunakan format berbasis teks sederhana, seperti CSV, XML, JSON, YAML, dll.


2
Saya akhirnya menggunakan SQLite untuk menyimpan status permainan. Karena saya menggunakan sistem entitas, itu masuk akal: Semua yang saya miliki adalah properti. Setiap jenis properti memiliki tabelnya di database dan entitas dihubungkan oleh id (global unik) mereka. Tetapi dalam, katakanlah, basis data sistem warisan tidak masuk akal, kurasa.
danijar

1
Ya, saya pikir menggunakan SQLite untuk menyelamatkan keadaan permainan adalah ide yang bagus, asalkan Anda berencana untuk melakukan itu sejak awal. Saya tidak ingin DB menjadi tempat utama di mana data game disimpan selama bermain.
Kylotan

5

Basis data tidak cepat, menggunakan basis data jauh lebih lambat daripada akses memori tradisional. Alasannya sederhana, database dinamis, ada banyak overhead yang melekat padanya, pertanyaan harus diuraikan, hash perlu dihitung dan hal-hal lain.

Hanya ada satu keuntungan dari menggunakan database dan itu kegigihan. Anda dapat menjalankan satu atau beberapa aplikasi dengan satu basis data dalam jangka waktu yang lama tanpa harus takut data. Tetapi klien game sama sekali tidak perlu untuk itu.

Jadi, Anda ingin mendapatkan setiap objek yang berjarak kurang dari 1000px?
Itu akan menjadi:

List<Entity> retVal;
for(entity in entities)
  if(Distance(entity.pos(), to) < 1000)
     retVal.append(entity);
return retVal;

Sekarang apa yang akan Anda pikirkan tentang database jika Anda memintanya untuk mengambil setiap objek yang jauhnya kurang dari 1000px?
Itu akan melakukan hal yang persis sama! Hanya dengan banyak biaya overhead yang akan membuat operasi yang sangat sederhana ini menghabiskan biaya sekitar 100 kali waktu prosesor (tergantung pada berapa banyak entitas yang Anda miliki). Basis data bukan sihir.

Jangan gunakan database untuk hal lain selain aplikasi server.


2
SQL server memiliki indeks spasial. Itu tidak akan mengulangi semua catatan tetapi menggunakan pendekatan indeks pintar
MichaelD
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.