Menyimpan koordinat setiap objek di sisi server dalam MMO

12

Dalam MMORPG:

Apakah tipikal atau layak untuk menyimpan koordinat setiap pohon, semak batu, dll di sisi server untuk deteksi tabrakan?

Jika demikian, apa cara yang layak untuk menyimpan sejumlah besar koordinat (struktur data dan sebagainya, penanganan masalah kinerja)?

Jika tidak, apakah jenis deteksi tabrakan ini dilakukan sepenuhnya di sisi klien, dengan server tidak memeriksa sama sekali?

Atau apakah ada jalan tengah, dengan klien memeriksa tabrakan dan memverifikasi server? Jika demikian, bagaimana server memverifikasi hal yang sama tanpa menyimpan koordinat di server juga?

Sajith Dilshan Jamal
sumber
2
Saya tidak cukup tahu tentang ini untuk memberikan jawaban yang baik, tetapi jika Anda melakukan deteksi tabrakan hanya di sisi klien, curang akan menemukan cara untuk memotong semua, atau mengambil powerups yang jauh dari mereka.
Peethor
2
-1 "Pertanyaan tidak menunjukkan upaya penelitian apa pun".
Vaillancourt
sebenarnya, mungkin bukan duplikat, saya belajar tentang skema partisi spasial dan struktur data spasial yang tidak dimiliki pertanyaan lain
Sajith Dilshan Jamal

Jawaban:

15

Tidak tergantung pada kelayakan (ya, tergantung pada skala) sering kali ada cara yang lebih baik atau lebih mudah.

Misalnya, dalam MMO khas Anda, server benar-benar hanya perlu tahu tentang peta navigasi kasar yang digunakan oleh AI dan pencarian jalur pemain. Alih-alih menyimpan lokasi pohon, Anda dapat memotong lubang pada navmap di lokasi pohon. Begitu juga untuk kendala besar lainnya.

Bahkan gim yang membutuhkan deteksi tabrakan yang lebih mendalam, Anda sering dapat memecahnya menjadi deteksi sisi server dan klien. Server hanya dapat memusatkan perhatian pada jalur kasar sementara klien menangani lebih banyak deteksi tabrakan yang sensitif terhadap animasi. Misalnya, pemain yang terluka mencoba merangkak di sepanjang batu besar untuk menemukan tempat persembunyian dari musuh. Server menentukan bahwa seorang pemain bisa bergerak sepanjang tepi batu (server tidak tahu bahwa ada adalah batu, hanya saja ada jalan pemain bisa mengambil sebelah daerah unpathable) sementara klien tahu bahwa batu hadir dan memainkan animasi karakter yang bersandar pada batu saat berjalan. Perhatikan bahwa klien tidak bergerakkarakter atau gameplay yang memengaruhi dengan cara apa pun dalam kasus ini; itu hanya bereaksi terhadap objek terdekat dengan animasi.

Anda tentu dapat menyimpan sejumlah besar objek di server. Tidak ada bedanya dengan game dunia terbuka. Gunakan skema partisi spasial yang bagus dan jaga agar jejak memori objek Anda seringan mungkin. Perhatikan bahwa kami mungkin memiliki versi "angka besar" yang berbeda di kepala kami di sini: jika Anda bermaksud ingin menyimpan setiap kerikil kecil atau benjolan berbatu dalam permainan sebagai objek terpisah maka itu hanya konyol, bahkan untuk permainan pemain tunggal . :)

Sean Middleditch
sumber
7

Ya - itu layak. MMO sering membagi dunia game menjadi beberapa area, karena ini membuat pekerjaan lebih mudah, tetapi Anda masih bisa melakukannya dengan 1 area besar - Anda hanya perlu menggunakan skema partisi spasial yang baik.

Karena sebagian besar objek dalam MMO tidak bergerak, Anda juga dapat melakukan pass preprocessing di mana objek digunakan untuk membuat pohon memeriksa tabrakan.

Jejak memori bukan masalah besar di sini selama Anda menggunakan instancing. Menyimpan pasangan mengapung per objek tidak ada artinya dalam skema besar hal. PC sederhana saat ini akan memiliki 4 gigabytes, sementara menyimpan posisi hanya 3 float (atau 3 ganda) - yang dengan mudah akan memungkinkan beberapa juta objek yang tersimpan dalam game.

Menyimpan hal-hal seperti inventaris untuk setiap pemain tidak diragukan lagi akan mengambil lebih banyak data - meskipun itu dapat dengan mudah di-cache ke disk dan hanya dimuat ketika pemain masuk.

Anda harus secara berlebihan melakukan pengecekan tabrakan pada klien dan juga server, karena ini akan memungkinkan klien untuk bereaksi lebih responsif terhadap lingkungan. Jika seorang pemain berjalan ke dinding, Anda ingin mereka segera berhenti bergerak - tidak setelah setengah detik ketika server merespons.

Anda hanya ingin menggunakan server untuk hal-hal yang otoritatif juga. Misalnya, Anda akan melakukan pencarian jalur hanya pada klien, karena Anda tidak dapat menipu dengan mengambil jalur yang kurang efisien!

Tdk beralasan
sumber
terima kasih atas tip tentang skema perpisahan ruang, saya belajar sesuatu yang baru
Sajith Dilshan Jamal