Sinkronisasi multipemain dan pencarian jalur

8

Saya memiliki antarmuka tipe titik & klik pada klien, yang menjalankan A * di server, untuk pencarian jalur.

Gim ini dikendalikan seperti RTS, tetapi dunia ini gigih, sehingga pemain harus dapat bergabung / pergi kapan saja, dan hanya akan ada paling banyak 30 unit di layar.

Apa cara terbaik untuk menyinkronkan pergerakan pemain antara server dan klien, setelah saya menghitung jalurnya?

Apakah server perlu menyinkronkan klien pada setiap langkah / bingkai animasi? atau bisakah ia memberi tahu klien "pergi ke posisi X, Y" untuk setiap node di jalan, dan setiap pemain yang bergerak? Atau apakah yang terbaik untuk hanya menjalankan timer animasi pada klien dan server, dan apakah itu disinkronkan secara implisit seperti itu?

Seperti apa pertukaran data pada gerakan berbasis jalur?

EDIT:

Beberapa dari Anda telah menyarankan berbaris, karena saya mengatakan "RTS", tetapi gim ini bukan RTS, hanya memiliki antarmuka yang sama. Perbedaan besar adalah saya harus bisa membuat pemain bergabung dan meninggalkan permainan kapan saja . Maaf karena tidak lebih spesifik.

cloudhead
sumber

Jawaban:

2

Alternatifnya adalah melakukan pathfinding pada klien yang memiliki unit. Ini memiliki keuntungan menyebarkan pekerjaan lebih merata. Kerugian melakukan semua pathfinding di server adalah bahwa server harus melakukan semuanya; Kelemahan dari mengirimkan hanya perintah 'pindah ke X, Y' kepada klien adalah bahwa setiap klien harus menemukan setiap jalur tunggal. Sebagai gantinya, setiap 'centang' dalam siklus kunci-langkah, setiap klien memberi tahu server, secara harfiah, setiap langkah unit berikutnya. Server memastikan unit benar-benar dapat pindah ke sana, dan memindahkan unit. Karena klien tidak memiliki semua informasi (Khususnya, apa yang dilakukan unit klien lain), perintah gerakan yang tidak valid tidak diperlakukan sebagai kesalahan. Ini memberikan beberapa bandwidth untuk mendapatkan lebih banyak waktu untuk menghitung jalur.

Ganti server dengan rekan; metode ini juga bisa digunakan untuk game peer-to-peer, asalkan Anda memastikan urutan pergerakan unit dianggap sama pada semua mesin.

Blecki
sumber
1

Game RTS biasanya memiliki lockstep-sync (sinkronisasi terjadi setiap frame). Memberitahu setiap jalur ke klien akan memungkinkan klien yang diretas untuk menyalahgunakan informasi tambahan.

Cloudanger
sumber
1

Tidak juga. Satu-satunya hal yang harus Anda kirim adalah perintah. Contoh: 20 unit ini harus pindah ke (X, Y) dan kemudian biarkan setiap pemain mengetahui bagaimana mereka sampai di sana. Bagian yang sulit adalah memastikan mereka semua melakukan hal yang persis sama. Untuk mencapai ini, sebuah model penguncian digunakan, tautan di bawah ini harus menjelaskannya secara rinci. Juga, Anda hanya harus menyinkronkan potongan-potongan penting. Apa pun yang tidak mengubah permainan tidak boleh disinkronkan. Animasi dalam game RTS biasanya hanya untuk sisi visual.

Hal lain, game RTS biasanya bukan client-server, tetapi P2P. Dengan cara itu salah satu pemain tidak bisa menipu karena ketika ada ketidakkonsistenan terdeteksi, Anda cukup memutuskan sambungan.

Berikut adalah sesuatu untuk membantu Anda memulai: http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php http://altdevblogaday.com/2011/07/09/synchronous-rts-engines-and- a-tale-of-desyncs / http://altdevblogaday.com/2011/07/24/synchronous-rts-engines-2-sync-harder/

Peter Ølsted
sumber
Masalahnya adalah saya membutuhkan pemain untuk dapat bergabung dan pergi kapan saja. Gim ini bukan RTS, hanya saja memiliki antarmuka yang mirip.
cloudhead
Jika Anda memiliki lebih dari mengatakan, 50 objek sepenuhnya dinamis pada waktu tertentu, Anda mungkin perlu melihat ke dalam mekanika RTS. Apakah gim Anda seperti CIV atau LOL?
Peter Ølsted
Ini lebih seperti Diablo, Penjara Bawah Tanah atau HoN, tetapi dengan titik & klik. Seharusnya tidak lebih dari ~ 20 unit di layar.
cloudhead
1

Setelah jalur dihitung, server hanya menggunakan jalur itu untuk mengontrol karakter. Kehadiran jalur tidak membuat perbedaan untuk masalah ini - Anda masih mengirim data yang sama, apakah itu pembaruan posisi biasa atau apa pun. Biasanya tidak apa-apa untuk mengirim posisi reguler (diinterpolasi pada klien untuk memperhalusnya) dan pesan terpisah ketika unit berhenti.

Kylotan
sumber
Ok, itu yang saya tuju.
cloudhead
1

Dalam permainan saya (permainan jenis RPG multipemain) saya mengirim bagian dari jalur ke klien (untuk NPC terdekat), yaitu. 3 posisi berikutnya dan Waktu ketika NPC harus ada di sana. Untuk pemain saya hanya mengirim posisi valid terbaru + stempel waktu sehingga pada klien saya dapat melakukan perhitungan mati (atau sesuatu yang lebih rumit jika diinginkan).

Ini berfungsi sepenuhnya baik sebagian besar karena tidak ada tabrakan antara pemain / NPC (dengan lag rendah Anda tidak benar-benar melihat apa pun, dengan, katakanlah 250+ msec lag Anda melihat perbedaannya jika Anda dapat melihat dua layar (dari dua pemain) ) pada saat yang sama tetapi masih tidak benar-benar terlihat pada 'satu layar').

Jadi saya akan mengatakan: lanjutkan dengan penulisan server (posisi validasi + cap waktu pemain dan juga untuk AI di awal, Anda dapat membuat sistem yang lebih rumit untuk NPC nanti tanpa masalah besar) + prediksi klien.

ps. Saya menggunakan presisi milidetik yang berfungsi dengan sangat baik kecuali bahwa int yang ditandatangani hanya berlaku selama 3 minggu sebelum saya harus me-restart server.

Anda mungkin juga ingin memeriksa prediksi waktu (mis. Mencoba menyinkronkan sedekat mungkin dengan server).

Valmond
sumber