Bagaimana cara melacak posisi real-time pemain dalam MMO?

14

Bagaimana Anda melacak posisi para pemain di MMORPG? Saya membaca bahwa Anda dapat menggunakan database atau menyimpan koordinat dalam file. Saya mencoba menggunakan database tetapi lambat. Bagaimana file dapat digunakan untuk melacak posisi pemain?

Baccari
sumber

Jawaban:

23

Bagaimana file dapat digunakan untuk melacak posisi pemain?

Anda menulis posisi pemain ke file. Misalnya, jika Anda mengidentifikasi setiap pemain dengan nomor unik (atau GUID), Anda bisa menggunakannya sebagai nama file. Dalam file, cukup tulis data posisi dalam format yang dapat Anda parse nanti. Misalnya, 467239.txtmungkin berisi 20, 3, 19jika pemain # 467239 berada di lokasi ( x, y, z ) itu.

Ini tidak jauh berbeda dari apa yang akan Anda lakukan dengan database, namun - database tidak boleh "lambat" pada operasi ini, itu harus sangat cepat (mungkin lebih cepat daripada file, karena Anda memiliki lebih banyak overhead IO disk atau penguncian IO pertengkaran - jika Anda menyimpan banyak posisi per file - dalam pendekatan berbasis sistem file).

Mungkin Anda mencoba menggunakan DB atau sistem file untuk menyimpan posisi pemain saat runtime ? Anda seharusnya tidak melakukan ini sama sekali .

Saat runtime, di server Anda, posisi pemain harus disimpan dalam memori dan diperbarui di sana, seperti yang akan Anda lakukan dengan jenis permainan lainnya. Secara berkala mereka dapat disimpan ke disk atau penyimpanan persisten lainnya - misalnya, ketika pemain beristirahat, menyimpan, atau logout.

Tetapi menulis setiap posisi pemain untuk menyimpan setiap pembaruan tidak perlu dan sangat tidak efisien; itu tidak akan pernah cukup cepat untuk menangani apapun yang menyerupai skala pemain "besar".


sumber
1
Ya, sebenarnya, saya menyimpan posisi pemain ke postgreSQL saat runtime. Tetapi, jika saya menyimpannya di memori server bagaimana saya bisa memperbarui posisi di klien?
Baccari
12
Metode di mana klien diperbarui adalah sama dalam semua kasus: server memberi tahu klien apa posisinya melalui pesan jaringan (atau lebih realistis, klien, yang melakukan prediksi lokal, juga memiliki posisi lokal yang server memvalidasi dan mengonfirmasi untuk klien). Anda seharusnya tidak meminta klien Anda mengakses database yang diakses server.
1
Saya kehilangan titik tentang mengatakan "lakukan dengan file", hanya untuk menjelaskan itu sebenarnya lebih buruk daripada menggunakan db dan kemudian menjelaskan yang merupakan masalah sebenarnya. Mengapa Anda membutuhkan penjelasan file yang tidak berguna itu? Itu hanya membingungkan pembaca biasa, yang tidak bermanfaat bagi siapa pun.
o0 '.
6
Sudah pengalaman saya di masa lalu yang mengabaikan pertanyaan langsung dan hanya melanjutkan kuliah tentang apa yang saya pikir "cara yang benar" harus cenderung lebih konfrontatif dan membuat OP kurang reseptif untuk dibimbing menjauh dari yayasan yang lebih lemah pertanyaan asli mereka adalah datang dari, itu saja.
13

Posisi harus dalam RAM saat digunakan. (mis: karakter pemain ada di dunia) Anda tidak dapat menggunakan DB sebagai memori operasi. Anda bisa, tetapi ini akan mengerikan.

Anda harus menyimpan posisi secara teratur, tetapi tidak setiap kali mereka berubah.

Saya juga akan menghindari menyimpan semua posisi pada saat yang bersamaan. Jika Anda ingin mempertahankan kegigihan jika server crash, Anda harus menyimpan posisi sesering mungkin tetapi pada waktu luang permainan. Cukup lakukan ini secara batch.

Hemat 30 posisi saat waktu luang tersedia.

Adapun klien. Mereka harus menerima pembaruan kondisi game (relevan) melalui koneksi ke perangkat lunak server Anda. Bukan dari DB ... Itu tidak praktis, lambat, buruk, jahat dan kekuatan akan terganggu.

Anjing hutan
sumber
2
Dan ya, gunakan utas terpisah untuk menghindari situasi di mana basis data mungkin memblokir sisa lingkaran permainan Anda.
Coyote
4

Saya memiliki utas terpisah yang saya antri untuk menyimpan ke file setiap 500 atau lebih kutu game. Jika tidak, Anda harus menyimpan semuanya dalam RAM.

Ian Macalinao
sumber
4

Apa yang saya lakukan di server saya, adalah untuk menyimpan arah pemain (vektor) dan posisi terakhir, jika pemain memiliki kecepatan, saya menghitung posisi pemain baru setiap 2 detik.

Klien tentu saja memiliki posisi posisi sendiri dan mengirimkannya arah baru (vektor) ke server.

Server otoritatif tentang posisi dan mengirim paket posisi jika klien bergerak jarak tertentu sejak pemeriksaan terakhir (ini dapat menyebabkan efek karet gelang adalah klien tidak sinkron).

Semua ini tentu saja terjadi dalam ingatan.

Christian Flodihn
sumber