Simulasi fisik sisi server dengan ratusan pemain

9

Saat ini saya sedang mengerjakan game berorientasi fisika singleplayer di mana saya ingin fisika disimulasikan di sisi server. Ini karena permainan akan memiliki papan pemimpin, perkembangan pemain yang gigih, dan sebagainya dan saya ingin mencegah segala jenis kecurangan - pada dasarnya arsitektur client-server murni, klien itu "bodoh" dan hanya menampilkan apa yang ingin ditampilkan oleh server.

Namun masalahnya adalah bahwa game tersebut kemungkinan besar akan dimainkan oleh ratusan (mungkin ribuan) orang pada saat yang bersamaan. Ini mengkhawatirkan saya, karena kemungkinan besar akan membunuh daya pemrosesan server jika saya harus melakukan dan memelihara ratusan negara pada saat yang sama.

Saya tidak akan memiliki masalah memindahkan semua simulasi fisika ke sisi klien, tetapi kemudian saya benar-benar membutuhkan cara untuk memvalidasi jika hasil simulasi klien valid. Namun, saya tidak tahu caranya.

Saya telah berpikir tentang menjalankan simulasi sisi server sesekali untuk memvalidasi jika klien masih bermain adil, tetapi saya benar-benar ingin server memiliki ketegangan sesedikit mungkin.

Fisika akan menjadi serumit demo GDC 2011 oleh Glenn Fiedler , bahkan mungkin lebih sederhana. Namun, lebih banyak benda bertubrukan kaku yang selalu bertabrakan akan berada dalam satu adegan dan mereka semua akan terlihat sekaligus.

Saya mengalami kesulitan mendapatkan jawaban untuk kasus khusus ini, karena sebagian besar sumber daya di web - lagi-lagi, situs Glenn Fiedlers menjadi yang hebat - berbicara tentang fisika jaringan skala kecil (mis. FPS dengan 30 pemain, seperti Halo).

Setiap saran, situs web, makalah atau sejenisnya tentang hal itu akan sangat dihargai.

Rekap pertanyaan yang ingin saya jawab:

  • Seberapa layak model klien-server? Apakah kekhawatiran daya pemrosesan server saya sah dan membumi?
  • Apakah mungkin untuk memvalidasi simulasi fisik yang dijalankan oleh klien di server dengan andal? Jika ya, bagaimana caranya?
Lennard Fonteijn
sumber
Saya akan membiarkan pertanyaan ini terbuka sedikit lebih lama dengan harapan lebih banyak orang akan memposting pemikiran mereka. Terima kasih saya sampaikan kepada mereka yang telah melakukannya!
Lennard Fonteijn
Selama klien berbeda independen, Anda seharusnya tidak memiliki masalah penskalaan secara horizontal. Gunakan sesuatu seperti EC2, bawa kapasitas online sesuai kebutuhan.
ipeet
1
Di mana masalahnya jika seseorang curang dalam satu permainan pemain? Biarkan mereka, lebih baik lepaskan ide papan peringkat dan fokus untuk membuat permainan pemain tunggal yang menyenangkan
Maik Semder
2
"Apakah mungkin untuk memvalidasi simulasi fisik yang dijalankan oleh klien pada server dengan andal?" Ya itu mungkin untuk memvalidasinya, tetapi membaca komentar Anda di bawah ini: Perencanaan Anda untuk membagikan uang RL ke skor teratas, dan itu mirip dengan permainan panah, yaitu setelah fisika lemparan awal mengambil alih. Masalahnya di sini adalah kurang memvalidasi fisika, ini mudah. Masalahnya adalah bahwa Anda akan memiliki curang yang membiarkan program komputer melakukan lemparan untuk memberi mereka skor sempurna.
Daniel Carlsson
Fisika yang divalidasi oleh server di dunia bersama sepenuhnya dimungkinkan, DCUO adalah contoh yang bagus untuk ini. Harap dicatat bahwa "server" benar-benar berarti "sekelompok kotak server" sementara Anda tampaknya menulis dalam arti "beberapa" menjadi satu kotak yang berada di suatu tempat. Anda saat ini tidak dapat mensimulasikan ribuan aktor independen dalam ruang fisik yang sama, sehingga kurangnya diskusi tentang hal itu; yang dapat Anda lakukan adalah menyebarkan ribuan pemain ke pulau-pulau simulasi independen yang tidak berinteraksi.
Patrick Hughes

Jawaban:

5

Anda dapat memvalidasi pengiriman sisi klien dari pengguna lain, dan meminta klien melaporkan ke server jika pengiriman terlihat tidak valid.

Kemudian Anda dapat mengambil tindakan (baik melarang penipu, atau melarang siapa yang memalsukan laporan palsu). Untuk memeriksa diri Anda apakah kiriman itu benar-benar tidak valid atau tidak, Anda dapat menggunakan klien khusus atau apa pun.

o0 '.
sumber
3
Itu sebenarnya sangat pintar! Tidak akan memikirkan itu, jelas setidaknya 2 atau 3 klien harus menjalankan simulasi seandainya klien menjalankan orang lain simulasi-nya curang - dalam hal ini server selalu dapat melakukan simulasi akhir jika semua klien melaporkan sesuatu yang aneh .
Lennard Fonteijn
1

Game Anda adalah singleplayer, satu-satunya 'interaksi' dengan pemain lain adalah leaderbord. Anda dapat menelurkan contoh untuk memeriksa simulasi pada server Anda untuk setiap pengiriman, Anda tidak perlu semua trik untuk memastikan bahwa fisika adalah lebih dari 30 klien, jadi saya tidak berpikir Anda membutuhkan lebih banyak sumber daya daripada yang sudah Anda miliki sejak fisika sudah bekerja :).

Memeriksa setiap hasil akan sedikit berlebihan, Anda dapat mengirim simulasi yang dikompres ke server setiap kali seseorang mengirim skor ke leaderbord, kemudian hanya memeriksa skor 5% teratas di server Anda sendiri, atau mungkin bahkan 1% teratas atau bahkan lebih pintar hanya memeriksa skor tinggi baru dan menganggap semua orang tidak lebih baik dari # 1 mungkin memiliki simulasi yang tidak curang.

Saya tidak tahu apakah simulasi Anda seperti, mengatur dan tidak berinteraksi (mudah diperiksa) atau apakah pemain dapat berinteraksi dengan sim saat sedang berjalan, tetapi pastikan untuk melakukan fisika Anda sedemikian rupa sehingga mengambang berbeda representasi titik tidak mengacaukan hal-hal dan membuat tampilan lari yang valid tidak valid.

Roy T.
sumber
Saya tidak ingin membahas spesifik gameplay itu sendiri, tetapi Anda dapat membandingkan permainan saya dengan permainan anak panah: Setelah Anda mengarahkan dan melakukan lemparan, fisika mengambil alih dan tidak ada yang dapat Anda ubah tentangnya lagi. Apakah pengetahuan ini mengubah jawaban Anda?
Lennard Fonteijn
Tidak, itu tidak akan mengubah apa pun :). Simpan saja replay di server dan hanya periksa yang mencurigakan (mis. Skor tinggi baru)
Roy T.
1

Jangan lakukan itu, saya dapat meyakinkan Anda bahwa simulasi fisika hanya pada server adalah ide yang sangat buruk. Masalah utama bukan beban server, tetapi responsif. Responsif pada klien akan sangat buruk. Pemain akan menekan tombol, maka Anda harus melakukan perjalanan pulang-pergi ke server sebelum Anda mendapatkan hasil simulasi. Saya telah melakukan variasi ini di masa lalu (kebanyakan hanya menekan tombol), dan hasilnya tidak cantik dan hanya boleh dilakukan untuk permainan yang sangat lambat yang memiliki peluang untuk lolos darinya (dan bahkan dalam kasus-kasus itu dirasakan kurangnya respons adalah masalah besar).

Skema yang lebih baik yang ingin saya coba di lain waktu skenario jenis ini muncul sendiri adalah untuk memilih pemain bagian kecil dari playerbase Anda, kemudian Anda mensimulasikan untuk mereka sisi server untuk sementara waktu dan membandingkan hasil Anda dengan mereka, tanpa sepengetahuan mereka. Jika mereka menyimpang terlalu banyak (Anda harus mengharapkan beberapa derajat divergensi), maka Anda mengklasifikasikannya sebagai curang potensial, dan terus mensimulasikan mereka untuk sementara waktu lebih lama untuk mengonfirmasi. Apa yang akan Anda dapatkan adalah semacam kurva dengan seberapa banyak pemain yang sah menyimpang dibandingkan dengan server, dipengaruhi oleh kondisi jaringan dll, dan Anda akan segera melihat bahwa curang ada di luar kurva ini. Sistem ini memiliki manfaat sebagai berikut:

  • Otomatis
  • Anda tidak mengorbankan responsif
  • Saat Anda hanya mensimulasikan subset yang sangat kecil dari playerbase Anda, beban akan dapat dikelola, dan bahkan dapat diskalakan (mungkin Anda memilih lebih sedikit pemain untuk disimulasikan jika bebannya tinggi)
  • Berlaku untuk setiap game yang dapat saya pikirkan, sehingga sangat dapat digunakan kembali
Ylisar
sumber
Jadi, seperti Roy, Anda pada dasarnya mengatakan: Pertahankan di sisi klien, simpan "replay" ketika klien mengirimkan skor dan sesekali validasi replay itu (tidak semuanya, persentase kecil). Bagaimana jika berdasarkan skor yang diberikan klien pembayaran kredit telah dilakukan - bagian perkembangan pemain, kredit juga dapat dibeli dengan uang nyata (!!!) - apakah Anda masih merekomendasikan pendekatan ini? Jika menipu memberikan kredit dalam jumlah berlebihan dan saya hanya memvalidasi sesekali, pada dasarnya saya akan kehilangan uang. Anda mungkin dapat menandai seseorang saat skornya di atas ambang tertentu, tetapi apakah akan ada cara yang lebih baik?
Lennard Fonteijn
Jika mesin fisika bersifat deterministik (seharusnya) dan server mensimulasikan menggunakan status awal dan input yang sama dengan klien (yang seharusnya layak), maka hasilnya harus dalam batas kesalahan floating point yang wajar (tidak signifikan). Bahkan jika ada efek acak, dan tidak layak untuk melewati status RNG, Anda dapat melewati angka acak dan menggunakannya untuk memeriksa (dan bahkan memeriksa distribusinya, jika gulungan acak fudging membuat perbedaan gameplay yang besar) .
ipeet
Yang satu kredit terlibat Anda sebaiknya memeriksa setiap ulangan karena kecurangan tidak lagi menjadi yang teratas dalam daftar skor tertinggi tetapi untuk mendapatkan uang. Anda ingin lebih banyak keamanan jika uang terlibat, saya tidak dapat membantu Anda di sana.
Roy T.
@ Roy. Saya mungkin akan tetap melakukannya, bahkan jika saya tidak membayar uang berdasarkan kredit (seseorang salah baca yang saya kira?). Saya bermaksud memiliki kebijakan toleransi nol, jadi saya hanya mengumpulkan file replay untuk validasi. Jika itu benar-benar mencurigakan, saya mengambil tindakan.
Lennard Fonteijn
1

Seperti yang Daniel katakan, masalah besar di sini adalah program yang melakukan aksi untuk pemain; tidak ada kemiringan fisika dalam game yang diperlukan jika pemain adalah lengan robot dengan presisi yang biasanya diselesaikan untuk bedah saraf.

Beberapa pria
sumber
Saya mungkin agak tidak jelas. Game saya akan memberi Anda kredit virtual setelah Anda menyelesaikan game. Anda dapat menggunakan kredit ini untuk membuka kunci konten baru untuk dimainkan. Anda juga dapat menggunakan uang sungguhan untuk membeli kredit untuk membuka kunci konten lebih cepat (ingat Anda itu bukan Pay2Win, saya benci itu). Saya tidak punya niat membayar uang nyata berdasarkan kredit. Yang mengatakan, panah hanya metafora untuk menggambarkan seberapa besar pengaruh seorang gamer pada keadaan tubuh-kaku, saya tidak takut "aimbot" karena itu akan memberi Anda 0 keuntungan.
Lennard Fonteijn