Apa manfaat kinerja dari menyimpan semua karakter yang masuk dalam MMO secara berkala?

26

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?

bunden
sumber
34
Ini bukan untuk kinerja; itu mengorbankan sedikit kinerja untuk kebenaran , yang lebih penting.
Mason Wheeler
Apakah waktu benar-benar berperan di sini? AFAIK, setiap tindakan dalam mmo disimpan dengan segera. Anda mendapatkan item dan item itu ditambahkan di server tanpa penundaan ke akun Anda, jika tidak server harus ingat bahwa Anda melakukan itu dan kemudian melakukannya 5 menit kemudian, yang tidak memiliki manfaat. Atau klien harus mengingat dan mengirimnya 5 menit kemudian, yang sekarang membuka Anda untuk melakukan peretasan, karena dalam 5 menit itu siapa pun dapat mengubah / menambahkan data yang akan dikirim.
HopefullyHelpful
4
@HopefullyHelpful Tidak, itu tidak benar. Setiap tindakan dalam MMO ada di memori segera, tapi itu sementara. Menyimpan semuanya secara langsung ke penyimpanan persisten masih terlalu mahal, bahkan dengan SSD. Bahkan dengan gim yang menyimpan langsung ke basis data, basis data itu sendiri tidak segera menyimpan data itu ke disk (atau setidaknya menyimpan hanya log transaksi, bukan data yang konsisten - ini harus dibangun kembali saat macet, dan membutuhkan cukup banyak sedikit waktu). Tetapi penghematan pada putuskan adalah ide yang buruk untuk alasan lain - konsistensi.
Luaan
1
Saya pikir pertanyaan ini akan lebih sesuai dengan apa manfaat kinerja dari menyimpan karakter dalam interval vs secara real time.
Anthony
2
@Luaan: Sangat mungkin untuk menyimpan setiap perubahan status ke penyimpanan persisten, bahkan pada HDD mekanis. (Anda mungkin perlu beberapa di server yang sibuk). Caranya adalah dengan tidak memperbarui objek individu. Sebagai gantinya, Anda menyimpan log transaksi "Player (A) .Inventory + = Object (B)`. Secara berkala Anda menghapus status penuh. Untuk memulihkan, Anda memuat ulang penyimpanan penuh terbaru dan menerapkan transaksi terbaru dari log transaksi. Karena Anda sedang menulis satu file secara berurutan, Anda mencapai kinerja puncak untuk HDD mekanis. Tetapi untuk menjaga agar log transaksi tetap masuk akal, Anda perlu menyimpan penuh secara berkala
MSalters

Jawaban:

66

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.

Aric
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Josh
5

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:

start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;

(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.

phyrfox
sumber