Saya sedang membangun MMO dan ingin menambahkan NPC. Masalahnya adalah saya tidak tahu desain dasarnya. Apa perhitungannya, klien atau server? Saya akan mengerti server yang menghitung peristiwa dan reaksi, tetapi ketika sampai pada pathfinding dan posisi serta pergerakan pemain, siapa yang menghitungnya?
Siapa yang menghitung AI server atau klien? Saya tidak bisa membayangkan server menghitung pathfinding, posisi, pergerakan dan sebagainya. Tolong saya butuh bantuan untuk memahami ini, terima kasih, apa pun akan membantu.
Jawaban:
Sebagian besar MMO hari ini memiliki sesuatu yang penting dilakukan di sisi server, untuk alasan keamanan. Anda tidak dapat membongkar banyak ke klien, itulah sebabnya salah satu hal pertama yang dipotong adalah rutinitas AI. Saya pikir sebagian besar pengembang menganggap sisi klien dapat diretas sebagai aturan, bukan pengecualian.
Badumna Scalify ( http://www.scalify.com/badumna.php ) mencoba untuk memuat sebagiannya pada klien karena mereka akan melakukan perhitungan di sisi klien dan dikirim satu sama lain; beberapa data juga dikirim ke rekan otoritatif untuk divalidasi sebelum diteruskan ke klien, seperti server khusus. Masalahnya adalah bahwa SEMUA data dalam game multipemain HARUS dikirim melalui rekan otoritatif jika Anda ingin mencegah kecurangan. Saya membesarkan Badumna karena sepertinya yang paling dekat dengan apa yang Anda inginkan, tetapi bahkan itu tidak akan bisa menangkap curang - mungkin menangkap beberapa, tetapi segala sesuatu yang penting (mis. Semuanya, cukup banyak) harus dilakukan server- sisi.
Saya mungkin mengembangkan beberapa di Badumna, karena itu masih bisa menjadi sesuatu yang Anda anggap berguna (tapi saya mendorong Anda untuk mempertimbangkan kembali off-loading sesuatu yang penting pada klien, karena klien AKAN curang).
Badumna menawarkan arsitektur hybrid untuk operasi data. Ini memberikan kontrol penuh kepada pengembang dalam memutuskan apa yang penting (dan harus diverifikasi) dan apa yang tidak (dan dapat dikirim oleh jaringan terdesentralisasi).
Jika MMO mengharuskan setiap bit informasi harus diverifikasi, maka Badumna akan berfungsi sebagai solusi client-server. Namun, saya percaya bahwa ada berbagai kategori aplikasi MMO dengan berbagai persyaratan. Misalnya, cukup sering sebuah MMO akan memiliki zona tempur di mana pemain cenderung menipu dan karenanya setiap bit informasi harus diverifikasi. Namun, ada juga zona di mana pemain hanya bisa berjalan / berlari / menari / mengobrol. Zona semacam itu tidak memerlukan verifikasi lengkap dan dapat memanfaatkan jaringan terdesentralisasi Badumna dan mendapat manfaat dari skalabilitas yang ditawarkannya.
Kedua, Badumna menyediakan fitur keamanan tambahan yang dapat diakses pengembang seperti perlindungan identitas (sehingga pengguna tidak bisa berpura-pura menjadi orang lain), proksi keluhan (memungkinkan klien dikonfigurasi untuk melaporkan pemain jahat / curang ke sumber tepercaya), dan daftar hitam (melarang pemain jahat dari game).
Saya belum terlalu banyak mengeksplorasi Badumna, jadi mungkin ada masalah dan fitur yang tidak saya sadari, tapi setidaknya saya sudah meliriknya sepintas lalu.
tl; dr: klien harus benar-benar hanya keyboard dan mouse yang terhubung ke internet.
sumber
Jawaban singkatnya adalah bahwa untuk MMO standar, perhitungan AI selalu dilakukan oleh server.
Beberapa gim akan meminta klien mencoba memprediksi AI, sehingga NPC akan bereaksi lebih cepat, tetapi itu hanya ilusi; NPC yang asli selalu dikontrol oleh server.
sumber
MMO adalah server yang menghadap publik (Internet-). Apa pun yang Anda ingin dapat mengendalikan sepenuhnya tidak boleh diakses oleh publik, jika tidak, Anda berisiko membiarkan penyerang mengontrol NPC. Kecuali jika Anda melakukan semacam enkripsi pada perintah Anda (yang akan berdampak pada kinerja), Anda tidak dapat mempercayai klien untuk hanya menjalankan kode Anda sendiri.
Memprediksi pergerakan NPC pada klien untuk mengkompensasi keterlambatan adalah ide bagus; Anda secara teoritis dapat memasukkan sebanyak mungkin perilaku AI seperti yang Anda inginkan dalam program klien dan menyinkronkannya secara berkala - tetapi membiarkan klien untuk mendikte perilaku NPC akan memberi klien potensi untuk mengacaukan dunia permainan. Jika klien melakukan sinkronisasi dari dunia game di server maka Anda akan berakhir dengan NPC nakal yang tidak terkendali.
Yang memalukan, sebenarnya, karena mendistribusikan AI pada klien dapat berdampak skalabilitas.
sumber
Biasanya server harus menghitung atau memvalidasi setiap data yang diteruskan ke atau diterima dari klien. Tapi itu tergantung pada seberapa besar Anda bisa mempercayai klien dan seberapa penting perhitungan itu. Terkadang perhitungan utama dapat dilakukan pada klien dan server mungkin dapat menggunakan metode sederhana untuk memvalidasi data yang dihasilkan.
sumber
Untuk membangun jawaban yang lain, strategi "pembongkaran dan verifikasi" memang bisa bermanfaat, dalam situasi di mana verifikasi lebih mudah daripada perhitungan asli (atau di mana hanya sekali-kali pemeriksaan spot cukup untuk menangkap penipu).
Misalnya, jika Anda meminta klien melakukan pencarian path A * dan mengirim hasilnya ke server, yang harus dilakukan server adalah memeriksa apakah a) path tersebut valid, dan b) tidak ada path yang lebih pendek. Memeriksa validitas jalur harus mudah, dan memeriksa optimalitas bisa lebih mudah daripada menemukan jalur optimal untuk memulainya, karena Anda sekarang memiliki batas atas pada panjang jalur yang perlu Anda periksa. (Khususnya, jika klien mengembalikan jalur garis lurus, itu jelas optimal selama valid.) Sejujurnya, saya tidak tahu apakah trik khusus ini akan berguna dalam praktik, tetapi saya tidak melihat kendala mendasar untuk itu.
Namun perlu diingat bahwa jika Anda menurunkan NPC AI ke klien, maka klien yang diretas dapat menggunakannya untuk memprediksi perilaku NPC di muka. Untuk beberapa jenis permainan atau situasi ini bisa menjadi masalah serius.
sumber
Mungkin terbaik untuk memiliki beberapa rutinitas AI sederhana dan perhitungan kritis-gim di sisi server, sambil menangani operasi non-gim-rumit yang rumit di sisi klien.
Misalnya, server tahu di mana NPC yang bermusuhan berada dan di mana karakter pemain. Ketika karakter pemain berada dalam jangkauan NPC, perhitungan sisi-server dapat dilakukan untuk melihat apakah NPC harus menyerang pemain, dan perutean pathfinding sederhana dapat dilakukan untuk menentukan berapa lama NPC akan mencapai pemain.
Setelah NPC telah ditransisikan ke status serangan, klien dapat menangani animasi dan pencarian jalur yang bagus. Ketika NPC cukup dekat dengan klien untuk menyerang server dapat melakukan perhitungan untuk melihat apakah serangan itu terjadi, apa kerusakannya, dll ...
Anda harus memastikan bahwa setiap perhitungan yang benar-benar memengaruhi hasil permainan ditangani oleh server dan diteruskan ke klien, sementara perhitungan yang tidak kritis ditangani oleh klien.
Dalam kasus paling sederhana, Anda akan menjaga klien tetap sinkron dengan di mana ia mengharapkan server berada, server akan memverifikasi, maka klien akan menghitung lagi.
sumber