Saya mencoba untuk membungkus otak saya dengan konsep menciptakan pengalaman multiplayer server / klien.
Masalah saya terutama terkait dengan timestep. Pertimbangkan skenario berikut:
Klien terhubung ke server. Klien mengirimkan inputnya ke server untuk menunjukkan ia ingin pindah. Server mensimulasikan input dan menentukan posisi klien itu di dunia game.
Karena klien dan server sama-sama berjalan pada waktu yang berbeda, bagaimana Anda mensimulasikan secara akurat sehingga semua klien sinkron dengan server? Server saya saat ini diset pada 30ms timestep. Saat saya memproses perpindahan klien, ada ratusan permintaan yang menunggu untuk diproses, namun tidak ada cara untuk menunjukkan berapa lama antara masing-masing permintaan.
Saya benar-benar tidak memahami cara mensimulasikan dengan benar di server berdasarkan waktu, agar semuanya tersinkronisasi.
sumber
Jawaban:
Sederhananya, Anda perlu mengirim cap waktu dengan setiap snapshot dari server, dan dengan setiap input dari klien.
Di kedua ujung Anda memerlukan proses untuk "mengisi" frame mana pun di mana paket tidak diterima.
Dalam gim saya (gim aksi cepat - milik Anda mungkin berbeda), di server, saya membuang input "lama" (rusak), dan cukup tebak bahwa jika tidak ada paket input baru yang tiba, tombol yang sama tetaplah ditahan (ada sedikit lebih banyak hal untuk memastikan penekanan tombol / rilis pendek ditangani, tapi itu premis dasar).
Pada klien saya menyimpan "lag buffer" (dijelaskan dalam artikel ini yang ditautkan Tetrad). Saya menggunakan rata-rata bergulir dari waktu kedatangan untuk memastikan bahwa buffer lag tetap panjang yang tepat - membuat permainan klien berjalan sedikit lebih lambat atau lebih cepat untuk mengejar ketinggalan. Jika snapshot tidak tiba pada waktunya maka saya melakukan ekstrapolasi pada klien. Kalau tidak, saya interpolasi antara snapshots di buffer.
Klien juga bertanggung jawab untuk melacak round-trip-time untuk input dan menggunakannya untuk prediksi (server mengirimkan kembali cap waktu input yang digunakan saat menghitung frame yang diberikan). Ini buffer input untuk jangka waktu itu, replaying mereka untuk mengambil posisi pemain dari posisi "lama" (dalam snapshot dari server) ke posisi "hadir" yang diprediksi.
Pada dasarnya server hanya terus berjalan pada frame rate yang tetap. Terserah klien tetap disinkronkan dengan server.
Tentu saja, ini hanya tinjauan tingkat tinggi. Ada banyak detail seluk beluk yang harus Anda cari tahu saat menerapkannya.
sumber