Dalam jenis variabel apa posisi pemain disimpan pada MMORPG seperti WoW?

18

Saya bahkan mendengar J. Carmack dengan cepat membicarakannya ...

Bagaimana perangkat lunak dapat melacak posisi pemain dengan sangat akurat, berada di dunia yang sedemikian besar, tanpa memuat antar zona, dan dalam skala multipemain? Bagaimana data diformat saat melewati netcode?

Saya bisa mengerti bagaimana simpul disimpan ke dalam memori kartu grafis, tetapi ketika datang untuk menyinkronkan multiplayer, saya tidak bisa membayangkan apa yang terbaik.

jokoon
sumber

Jawaban:

26

Scott Bilas bekerja di Dungeon Siege dan menulis sebuah makalah, "The Continuous World of Dungeon Siege" . Meskipun Dungeon Siege bukan MMO, ia memiliki dunia, dan ia berbicara tentang posisi pemain di makalahnya. Saya menemukan itu sebagai bacaan yang bagus. Inilah bagian yang relevan:

Masalah Presisi

Sejak awal, tim teknik tahu bahwa dunia yang berkelanjutan akan secara signifikan mempengaruhi mesin dan desain konten, dan masalah intinya adalah stabilitas numerik. Bayangkan dua karakter berjalan dalam formasi terpisah dua meter menuju timur jauh dari asal. Pada titik tertentu, jarak dari satu sama lain kewalahan oleh jarak dari asal, dan karakter akan tampak "di lokasi yang sama".

Dengan floating point, semakin jauh Anda dapatkan dari titik asal, semakin presisi Anda kalah, yang dapat menyebabkan segala macam masalah buruk. Hal-hal tidak beres dengan benar, retakan muncul di antara jerat yang berdekatan, ruang mulai terkuantisasi, dan kucing dan anjing mulai hidup bersama. Dungeon Siege menggunakan FPU dalam mode presisi tunggal untuk manfaat kinerja yang jelas, dan untuk mencocokkan presisi asli perangkat keras video. Namun, bahkan jika kita meningkatkan presisi, pada akhirnya itu tidak akan pernah bisa menyelesaikan masalah karena dunia direncanakan menjadi, dan pada akhirnya, sangat besar.

Masalah presisi berarti tidak mungkin untuk memiliki ruang koordinat dunia terpadu seperti kebanyakan game lainnya. Alih-alih, solusinya adalah membagi dunia kontinu ke dalam satu set ruang koordinat independen, dan beralih di antaranya secara berkala untuk mengatur ulang presisi. Berbagai ide dicoba dalam batasan-batasan ini, dan kami akhirnya memilih variasi sistem portal standar.

Solusi kami terdiri dari sistem koordinat berbasis simpul relasional, di mana setiap bongkahan geometri (Siege Node) memiliki ruang koordinatnya sendiri, dan dihubungkan secara spasial ke geometri tetangga melalui pintu yang berbagi kesamaan dengan tetangga tersebut. Susunan node yang dihubungkan oleh pintu membentuk grafik berkelanjutan yang mewakili seluruh peta dunia. Sistem simpul ini berevolusi dari waktu ke waktu dari tujuan semula untuk mempertahankan presisi FPU menjadi metode utama membagi ruang secara efisien, dan akar dari optimasi yang tak terhitung jumlahnya.

Untuk merangkum konsep posisi 3D relatif terhadap node tertentu, vektor tradisional (x, y, z) harus ditambah dengan ID node (x, y, z, node) dan mewakili offset dari titik asal dari simpul tertentu sebagai gantinya. 4-tuple ini dienkapsulasi sebagai Siode Node Position, atau SiegePos. Kemudian, kami menambahkan SiegeRot (angka empat, node) untuk menangani perbandingan antara orientasi antar node.

Ungkapan "tidak ada ruang dunia" menjadi mantra bagi tim, meskipun secara harfiah butuh bertahun-tahun bagi semua orang untuk sepenuhnya memahami apa artinya.

Anda dapat melihat lebih banyak makalahnya di Penjara Bawah Tanah di sini .

Ricket
sumber
Itu sepertinya jawaban yang sangat konyol! Terima kasih! Saya akan bertanya-tanya apakah game hari ini akan menggunakan nomor tungkai seperti halnya bilangan bulat gmp.
jokoon
3

Untuk dunia tanpa zon yang besar saya akan pergi untuk titik presisi ganda, atau titik mengambang dengan potongan yang lebih kecil membagi tanah.

Setiap chunk akan memiliki sistem koordinatnya sendiri. Ketika Anda menyeberangi perbatasan ke masing-masing potongan ini, Anda akan mengubah segalanya menjadi sistem koordinat itu. Begitulah cara mereka melakukannya di SIM penerbangan.

Jika Anda memiliki zona kecil, saya kira float sudah cukup.

Nailer
sumber
Presisi ganda dengan cepat menghasilkan kinerja besar dan manfaat memori. (x, y, z, zona) adalah 16 byte; (x, y, z) ganda akan menjadi setidaknya 24. Anda tidak dapat melakukan matematika cepat pada mereka, dan Anda tidak dapat menggunakannya pada kartu grafis.
Nah, kartu Fermi dapat menggunakan presisi ganda;) Tapi ya, pendekatan yang terpotong-potong adalah apa yang jawabannya tetap sarankan.
Nailer
2

Saya akan mengatakan untuk lokasi aktual itu adalah vektor 3 mengapung. Tetapi akan ada juga indeks zona yang terkait dengan pemain juga. (Tapi bukan bagian dari lokasi karena semua yang ditangani oleh server zona berada di zona yang sama dan karenanya tidak perlu berada dalam struktur data yang sama.)

Ingat setidaknya ada 4 zona. 4 benua utama. Saya tidak berpikir salah satu dari mereka lebih dari sekitar 10 km di satu sisi. Sebagai contoh, blog ini sebelum ekspansi terbaru menghitung seluruh area yang dapat bepergian sebagai 41 mil persegi. Semua medan pertempuran, semua instance, masing-masing dengan-di zona mereka sendiri dan mengkoordinasikan ruang juga.

Menggunakan LUA API Anda bisa mendapatkan posisi pemain GetPlayerMapPosition () mengembalikan masing-masing float dari 0 ke 1 sebagai proporsi di sepanjang seluruh peta dunia.

Doug-W
sumber
1

Untuk WoW, saya berharap mereka menggunakan float x / y / z sederhana - tetapi relatif terhadap 'zona' tertentu

Ini akan membantu menangani 'zona bergerak', misalnya, kapal dan zeppelin

bluescrn
sumber
1

Biasanya game online seperti Wow, Tibia, dll. Simpan pos pemain. menggunakan tiga variabel X + Y + Z dalam tabel meta SQl player. Runescape melakukannya tanpa Z - dengan cara itu pemain selalu ditampilkan di bagian atas jala tanah.

Mikolaj Marcisz
sumber
apa itu tabel meta? Saya benar-benar ragu itu akan menyimpannya dalam DB, harus digunakan secara real time ...
jokoon
(1) Tabel meta dalam kasus itu adalah tabel DB dengan data karakter dasar, misalnya. Jenis kelamin, posisi xyz, jumlah kesehatan, uang tunai di bank dll dan apa pun yang mungkin ada. (2) Saya telah hosting server Tibia terbuka, di sana pos pemain disimpan dalam cache server. Tapi ... setiap 30 ~ ada server yang menyimpan dan POS pemain akan ditambahkan ke data meta Pemain. Jadi jika server dimatikan / crash, posisi pemain akan kembali ke posisi DB :)
Mikolaj Marcisz
-2

Pelampung? Nah, array 3 mengapung untuk game 3D. Setidaknya bagi kami, kami menggunakan kaki sebagai unit sehingga yang Anda butuhkan adalah 3-4 tempat desimal pada titik bahwa kebisingan yang melayang tidak menjadi masalah. Jika zona besar hanya satu atau dua mil di satu sisi, itu tidak terlalu besar. Adapun zonasi transparan dalam MMO, itu pertanyaan yang sama sekali berbeda. Dalam skema besar masalah sulit dalam MMO, posisi penyimpanan cukup rendah dalam daftar.

pembuat kode
sumber
Kami memiliki masalah ketelitian floating point di beberapa zona STO besar selama pengembangan. Saya tidak tahu apa yang terjadi pada mereka. Ini mungkin bukan prioritas utama, tetapi perlu dipertimbangkan cukup awal untuk benar-benar membuat level.