Solusi yang efisien untuk partioning ruang multiplayer?

10

Pertanyaan ini agak sulit, tetapi saya akan mencoba menjelaskannya.

Katakanlah saya sedang membangun game online (bukan skala MMO), tapi itu mendukung pemain sebanyak mungkin, dalam pendekatan server otoritatif. Saya ingin dunia yang sangat besar dengan banyak musuh yang disimulasikan AI.

Saya menyadari beberapa strategi untuk menghemat CPU server dengan membagi ruang dan tidak memproses apa yang tidak perlu diproses. Saya telah membagi dunia berdasarkan wilayah, yang membutuhkan waktu pemuatan dan transisi kecil, yang menurut saya penting untuk menjaga kualitas permainan saat bermain secara lokal (sendirian atau bahkan dengan beberapa teman). Saya tidak berharap para pemain berada di lebih dari satu atau dua wilayah.

Masalahnya adalah suatu daerah bisa menjadi sangat besar, dan memiliki banyak NPC yang disimulasikan sekaligus. Bagaimana saya menangani ini tanpa mempengaruhi pengalaman para pemain? Pendekatan seperti satu server per wilayah dan sama-sama tidak ada dalam tabel.

Saya terutama mencari struktur data untuk menampung gerombolan musuh, dan bahkan NPC yang damai. Untuk menyelesaikan pertanyaan, harap perhatikan bahwa ada kendaraan, oleh karena itu sangat cepat untuk bepergian dalam suatu wilayah, yang mempengaruhi "kapan" untuk menyisihkan area.

Grimshaw
sumber
Apakah Anda dibatasi hanya untuk satu server fisik?
Patrick Hughes
Akhirnya, tidak. Tetapi demi kesederhanaan dan pencapaian, untuk saat ini, saya tidak dapat menyulitkan proyek lebih banyak lagi :)
Grimshaw
Mulai dari yang sederhana. Sesuatu seperti WoW yang beroperasi pada beberapa kotak fisik per "server" hanya membagi dunia mereka menjadi kotak dan semua pembaruan didasarkan pada siapa yang ada di kotak yang sama seperti Anda. Sangat sederhana, mudah untuk men-tweak, berfungsi dengan baik dan Anda dapat menggunakannya hanya dengan satu kotak Anda untuk mengontrol pemrosesan.
Patrick Hughes
Saya sepenuhnya setuju dengan sudut pandang Anda, dan mungkin saya melewatkan sesuatu dalam pertanyaan saya. Bagaimana jika ada satu pemain di kanan sel sel, dan yang lain di sebelah kiri sel tetangga kanan? Mereka harus saling bertemu! Dunia terlihat terus untuk permainan seperti WoW .. Ini yang saya tidak mengerti, bagaimana membuat grid dunia yang berkelanjutan, sambil tetap efisien? Tentu saja ada situasi ketika pemain dari dua "server" harus bertemu satu sama lain :)
Grimshaw
1
Dan ya, jika Anda akan memiliki banyak hal di seluruh dan banyak pemain di seluruh Anda benar-benar harus merencanakan agar semuanya aktif di mana-mana dan sepanjang waktu, tidak ada cara ajaib di sekitar itu. Inilah sebabnya mengapa kotak tunggal dari grup server MMO hanya melayani maksimum 200-500 pemain DAN mengapa MMO AI untuk NPC menyedihkan sekali (alias murah untuk dihitung).
Patrick Hughes

Jawaban:

5

Dari apa yang saya mengerti Anda akan memiliki semacam fisika yang berjalan di server Anda.

Jika itu masalahnya ada juga teknik lain yang tersedia untuk AI / fisika selain partisi ruang. Dari yang paling tidak jelas:

  • prioritas: NPC tanpa interaksi langsung dengan pemain dapat menerima lebih sedikit waktu CPU dengan menurunkan kecepatan refresh mereka. Anda dapat menggunakan antrian prioritas dan menjalankan antrian dengan prioritas lebih tinggi dari pertama hingga terakhir, sedangkan antrian lainnya hanya akan berjalan 1/2, 1/4 atau 1/8 dari antrian setiap siklus. dengan cara ini Anda memastikan setiap objek berjalan di beberapa titik tetapi Anda mengurangi berapa kali mengkonsumsi CPU.
  • Fisika juga dapat diturunkan (hanya kotak tabrakan dan bola yang dapat digunakan saat roaming dan menjauh dari pandangan).
  • menyederhanakan AI / simulasi dengan mengalokasikan perilaku yang sangat mendasar untuk NPC dan lingkungan saat pemain berada jauh. Biasanya itu akan berkeliaran atau memindai musuh bukannya berburu, mengumpulkan, bertani ...
  • beberapa fisika dan AI juga dapat didelegasikan kepada klien. Jika Anda benar-benar kekurangan CPU di server, Anda dapat menandai objek sebagai sebagian diselesaikan dan klien akan menyesuaikan fisika dan posisi objek tersebut secara lokal (untuk menghindari NPC mengambang). Klien dapat diberi tanggung jawab dalam menjalankan AI (selama pertempuran melawan pemain, perangkat pemain yang ditargetkan dapat langsung menjalankan NPC yang menyerang)
  • untuk pemain, fisika juga dapat diturunkan di server dan klien akan menerima lebih banyak tanggung jawab dalam resolusi tabrakan. Misalnya: Anda menabrak objek dengan kendaraan Anda, server hanya akan menyelesaikan tabrakan pada kotak tabrakan dan menandai objek-objek tersebut sebagai kemungkinan tabrakan. Klien akan mengirim resolusi ke server dengan stempel waktu yang akan menerimanya jika objek ditandai dan solusinya tampaknya benar.

Setelah Anda menerapkan mekanisme ini, Anda dapat memutuskan seberapa banyak dan seberapa sering Anda membutuhkannya. Hal yang hebat tentang ini adalah bahwa nanti Anda dapat menambahkan beberapa server yang akan dapat mengambil alih beberapa tugas alih-alih aplikasi klien.

Tentu saja deteksi tabrakan yang diperkirakan akan membuat beberapa penyimpangan, tetapi Anda akan dapat menyelesaikannya dengan menambahkan lebih banyak presisi dari waktu ke waktu.

Juga mengenai fisika Anda harus melihat lib yang mendukung semacam sistem GPGPU seperti OpenCL atau CUDA jika Anda memiliki akses ke server yang mendukung keduanya.

Anjing hutan
sumber
Menggabungkan partisi ruang dari suatu wilayah dengan pembaruan prioritas harus tepat seperti yang saya butuhkan, optimal untuk jumlah pemain yang sedikit, dan masih dioptimalkan ketika banyak area dimuat. Terima kasih.
Grimshaw
@DevilWithin Seharusnya membantu, dan tidak memerlukan perubahan di sisi klien. Saya juga menambahkan beberapa detail pada jawabannya.
Coyote
AI yang disederhanakan adalah ide bagus. Meskipun NPC jauh dari pemain, mereka tidak perlu melakukan apa pun selain bergerak dalam banyak kasus. Itu berarti saya bisa melakukan perkiraan tentang apa yang mereka lakukan, setiap 1 menit atau sesuatu, hanya untuk membuat mereka berkeliaran di seluruh dunia .. membayangkan mereka sebagai zombie, mereka akan melakukannya!
Grimshaw