Mayoritas MMORPGS memiliki sistem Worldsave yang akan menyimpan semua karakter setiap X jam. Saya kira alasannya adalah kinerja. Jadi mengapa ini lebih baik, kinerja bijaksana, daripada menyimpan karakter pada pemutusan?
networking
mmo
databases
bunden
sumber
sumber
Jawaban:
Ini bukan untuk kinerja. Ini adalah failafe. Jika dunia menghemat setiap beberapa menit, maka jika sesuatu terjadi pada server dan mematikan semua orang hanya akan kehilangan kemajuan beberapa menit.
Dengan menyimpan pada putuskan, jika server memiliki masalah semua orang akan kehilangan semua yang telah mereka lakukan sejak mereka masuk. Bagi mereka yang bermain dalam sesi yang sangat panjang (seperti yang biasa terjadi dalam MMO), mereka akan kehilangan sejumlah data yang signifikan.
Mereka mengorbankan sedikit kinerja untuk menghilangkan risiko kehilangan data massal.
Tentu saja, Anda dapat dengan mudah menyimpan data pemain di mesin klien, mengurangi lalu lintas jaringan. Masalahnya di sini adalah bahwa ia terbuka untuk peretasan. Setelah satu orang berhasil menemukan cara curang, mereka membagikannya dan semua orang melakukannya.
EDIT: Seperti yang ditunjukkan @Philipp , ini juga menghilangkan kemampuan untuk menggandakan item. Dengan sistem save-on-disconnect jika transaksi dilakukan sebelum server crash dan satu orang log out sebelum crash, kedua pemain digulirkan kembali ke saat terakhir mereka logout, baik menghapus item atau menduplikasi mereka.
sumber
Sistem awal yang disimpan hanya pada saat disconnect cenderung juga menyimpan secara berkala saat pemain aktif. Dalam sistem itu, biasanya MUD (Multi-User Dungeons), karakter dipertahankan dalam memori sampai mereka secara berkala dibuang ke file.
Ini berarti bahwa jika pengguna terputus tanpa "berkemah", mereka biasanya menemukan diri mereka beberapa kamar jauhnya dan kehilangan banyak barang rampasan, XP, dll, dari terakhir kali mereka menyelamatkan. Dalam hal itu, itu berperilaku seperti bagaimana konsol RPG bermain hari ini (Anda harus menyimpan permainan Anda tanpa mematikan konsol, atau Anda kehilangan segalanya sejak terakhir kali Anda menyimpan).
Sistem bekerja untuk tujuan yang dimaksudkan, karena karakter tidak dapat berinteraksi satu sama lain, kecuali mungkin melalui sistem "mail" di mana mereka dapat mengirim pesan dan barang satu sama lain. Peluang kehilangan barang dan berkembang cenderung cukup signifikan, tetapi hanya memengaruhi satu karakter pada satu waktu dalam kebanyakan kasus.
Fitur Worldsave muncul karena karakter pada akhirnya dapat berinteraksi langsung satu sama lain, sehingga semua karakter yang diputar harus dalam keadaan yang konsisten, atau duplikasi dan penghapusan item dapat terjadi. Ini bukan masalah dalam skenario MUD, karena sulit untuk menyalahgunakan sistem dengan cara yang mengakibatkan duplikasi item atau mata uang, tetapi itu sangat mudah dilakukan di MUD MMO awal. Pemain A memberi pemain B item, pemain B menyimpan dan pemain A memutus tanpa menyimpan. Duplikasi instan.
Worldsave bukan manfaat kinerja, tetapi dirancang untuk mencegah kecurangan. Saya ingat bermain di sistem di mana acara Worldsave secara harfiah diumumkan sebelumnya, dan sering menggantung seluruh sistem selama satu menit sementara server memperbarui semua file-nya. Sementara ini mencegah kecurangan, itu tidak terlalu nyaman bagi pengguna sistem ini.
Itu membawa kita ke keadaan saat ini. Hari ini, kami tidak menggunakan fungsi tipe Worldsave. Kami menggunakan basis data. Ini memungkinkan kami untuk memastikan bahwa duplikasi dan penghapusan diminimalisasi sebanyak mungkin. Karakter ada sebagai catatan dalam basis data, dan setiap transaksi antara pemain adalah transaksi basis data literal; baik tindakan sepenuhnya berkomitmen atau itu akan dibatalkan.
Kecuali bug yang tidak biasa dalam sistem, Anda mendapatkan manfaat dari menyimpan file karakter individu (menghemat waktu cepat) dan manfaat worldsave (tidak ada kecurangan), tanpa kekurangan baik (kehilangan kemajuan yang signifikan dan duplikasi item).
Saat merancang MMO modern, Anda ingin membuat prosedur tersimpan dalam database, dan menggunakan prosedur itu untuk melakukan transaksi. Misalnya, saat melakukan perdagangan antara dua pemain, mungkin terlihat seperti ini:
(Catatan: SQL ini, tidak ditulis dengan cara praktis dan hanya dimaksudkan sebagai contoh).
Dengan cara ini, jika ada crash sebelum komit, sistem kembali ke keadaan di mana pemain 111 dan pemain 333 masih memiliki item asli, sementara setelah komit, perdagangan selesai. Tidak ada peluang untuk digandakan, karena karakter disimpan pada saat yang sama, seperti yang dijamin oleh database.
sumber