Data apa yang dipertukarkan dalam game real-time multipemain?


8

Saya seorang programmer hobbyist dan sekarang saya ingin tahu tentang data apa yang dipertukarkan dalam sesi multipemain dalam game waktu nyata seperti starcraft 2. Saya melakukan banyak pencarian. Saya menemukan gafferongames.com menawarkan tinjauan yang sangat baik dari masalah yang perlu dipertimbangkan.

Glenn dalam artikel dan komentarnya memberikan alasan yang sangat kuat untuk menggunakan UDP melalui TCP, tetapi SC2 jelas menggunakan TCP. Untuk Qlee Gleen,

Masalah dengan menggunakan TCP untuk game adalah bahwa tidak seperti browser web, atau email atau sebagian besar aplikasi lainnya, game multi-pemain memiliki persyaratan waktu nyata pada pengiriman paket. Untuk banyak bagian gim Anda, misalnya input pemain dan posisi karakter, tidak masalah apa yang terjadi sedetik yang lalu, Anda hanya peduli dengan data terbaru.

Jadi dari pernyataannya, saya menduga bahwa pendekatannya adalah mengirim keadaan permainan penuh setiap unit pada setiap frame. Jika server tidak menerima input pemain pada frame saat ini, maka itu hanya keberuntungan pada pemain itu. Untuk God of War: Acension, di mana dia memimpin jaringan dev, ini seharusnya bekerja dengan baik.

Untuk SC2, karena kemampuan replaynya, firasat saya memberi tahu saya bahwa mesin yang mendasarinya adalah timestep tetap "mesin input pengguna pemutaran" yang ditentukan, di mana satu-satunya data yang dipertukarkan adalah input pemain . Oleh karena itu pernyataan Glenn mybe sama sekali tidak relevan untuk SC2. Input pemain adalah penting, dan urutan input bahkan lebih penting. Saya tidak berpikir itu layak untuk SC2 mengirim keadaan permainan 200 unit dan lebih banyak pada 30 - 60 FPS.

Pertanyaan: Saya bisa saja salah, tetapi saya telah berusaha mengidentifikasi 2 jenis data yang mungkin. Apa teknik lainnya? Akan baik untuk Qoute game jika Anda mau.

EDIT: menemukan tautan ini tentang model jaringan Starcraft


1
Salah satu alasan mengapa banyak game menggunakan TCP adalah karena UDP sering diblokir.
Matsemann

Jawaban:


12

Glenn dalam artikel dan komentarnya memberikan alasan yang sangat kuat untuk menggunakan UDP melalui TCP, tetapi SC2 jelas menggunakan TCP.

Glenn sebagian besar berbicara tentang permainan berbasis fisika, yaitu. penembak orang pertama dan game mengemudi. Ini memiliki persyaratan yang berbeda untuk permainan strategi waktu nyata di mana posisi unit yang tepat pada setiap langkah logika adalah penting. Jadi strategi komunikasi tentu berbeda.

"Waktu nyata" berarti berbagai hal dalam konteks yang berbeda. Game tidak real time 'sulit' karena jika pesan terlambat, semuanya rusak. (Setidaknya, tidak ada alasan bagus untuk permainan yang begitu menuntut, karena sistem hanya perangkat lunak harus dapat pulih dari keterlambatan pemrosesan, tidak seperti pembangkit tenaga nuklir atau peralatan medis misalnya.) Game benar-benar waktu nyata 'lunak' atau 'tegas'. ( Definisi di Wikipedia seperti biasa .) Jenis permainan membuat perbedaan seberapa cepat Anda memerlukan informasi, apakah Anda dapat kehilangan informasi dan lolos begitu saja, dll. Cukup untuk mengatakan bahwa TCP cukup baik untuk banyak permainan, tetapi untuk gim lain, lebih disukai UDP.

Saya menduga bahwa pendekatannya adalah mengirim keadaan permainan penuh setiap unit pada setiap frame.

Dia akan mengirim informasi yang cukup untuk merekonstruksi keadaan game yang relevan dari setiap unit yang telah berubah.

  1. Anda tidak perlu mengirim informasi apa pun tentang sesuatu yang belum berubah.
  2. Anda tidak perlu mengirim status penuh jika Anda dapat mengirim informasi yang cukup bagi penerima untuk membangun negara baru dari negara lama. (mis. Kirimkan saja nilai delta relatif ke kondisi lama. Atau kirim saja bagian kondisi yang telah berubah dan bukan sisanya.)
  3. Jika dua game menjalankan algoritma yang persis sama dan memiliki data yang persis sama maka Anda bisa mengirim input dan penerima akan menirukan efek secara lokal untuk mendapatkan status baru.

Sebagian besar game tidak memenuhi kriteria 3, jadi mereka menggunakan 1 dan 2 sebagai gantinya. Namun banyak game RTS dapat, dan memang, memanfaatkan 3.

Juga, tidak harus harus "setiap frame". Konsep bingkai juga samar-samar. Apakah ini bingkai rendering? Apakah ini kumpulan logika? Apakah ini bingkai data jaringan yang dikirim? Apakah ketiganya selalu menyelaraskan satu-ke-satu atau apakah Anda mendapatkan tingkat grafik variabel dengan tingkat logika tetap? Beberapa gim, terutama gim strategi waktu nyata seperti Starcraft 2, atau gim dengan kemampuan memutar ulang (saat Anda menyentuhnya) ingin menjaga segala sesuatunya dalam keadaan sempurna dengan memiliki pembaruan jaringan biasa (yang mungkin atau mungkin tidak cocok dengan 'bingkai' dalam pengertian lain) tetapi ini bukan persyaratan untuk semua game. Banyak game hanya mengirimkan pembaruan secara semi-reguler, tergantung pada seberapa jauh mereka bersedia membiarkan klien berjalan.

Input pemain adalah penting, dan urutan input bahkan lebih penting. Saya tidak berpikir itu layak untuk SC2 mengirim keadaan permainan 200 unit dan lebih banyak pada 30 - 60 FPS.

Banyak game tidak akan memperlakukan frame rendering sebagai bingkai logis. Mereka mungkin memiliki 60FPS dalam grafik tetapi hanya memiliki 10 pembaruan logika per detik, dan mengirim 1 pembaruan jaringan untuk masing-masing. Tetapi bahkan 30 pembaruan jaringan per detik adalah wajar jika Anda menggunakan metode 'kirim masukan', tentu saja.

Saya telah berusaha mengidentifikasi 2 jenis data yang mungkin. Apa teknik lainnya? Akan baik untuk Qoute game jika Anda mau.

Tidak terlalu banyak ada teknik yang berbeda, tetapi beberapa kendala berbeda pada sistem, dan pentingnya setiap kendala akan bervariasi dari satu game ke game lainnya. Jadi, Anda hanya perlu memilih sistem yang cocok untuk Anda.

  • Beberapa unit, bergerak cepat dan tidak menentu melalui input pengguna, latensi sensitif, sinkronisasi tepat di seluruh sistem tidak penting - posisi siaran melalui protokol yang tidak dapat diandalkan (mis. UDP) untuk mendapatkan kecepatan maksimum, dan pesan yang terlewat tidak akan menjadi masalah karena yang baru akan segera datang. Simulasi fisika secara lokal untuk meningkatkan kualitas rendering tetapi perbaiki posisi ketika informasi baru tiba. Baik untuk penembak dan game mengemudi.
  • Banyak unit, tetapi sebagian besar tidak relevan, dan mereka bergerak lambat - hanya mengirim pembaruan untuk unit di dekat penerima, mengirimnya sebagai perubahan daripada keadaan penuh, mengirimnya relatif jarang, dan mengirim melalui protokol yang dapat diandalkan (mis. TCP) untuk menghindari khawatir tentang cara menangani pembaruan yang terlewat. Bagus untuk MMO.
  • Banyak unit, yang digerakkan oleh AI berdasarkan input pengguna sebelumnya, sinkronisasi yang tepat di seluruh sistem sangat penting - mengirim input pengguna yang dicap waktu melalui protokol yang andal dan mengatur ulang secara lokal agar algoritma permainan tetap tersinkronisasi. Baik untuk RTSes dan game berbasis giliran.

4

Teknik utama yang perlu Anda waspadai adalah teknik "1500 pemanah". Itu terkenal digunakan oleh Age of Empires, tetapi juga digunakan dalam game lain seperti (open source) OpenTTD (berdasarkan Transport Tycoon Deluxe).

Agar jelas: menggunakan teknik ini, Anda tidak perlu mengirim status permainan APA SAJA saat bermain. Seluruh kondisi permainan dikirim saat permulaan awal, sambungkan dan sinkronisasi ulang. Satu-satunya hal yang perlu Anda kirim secara teratur adalah sinyal waktu dan cek sinkronisasi. Hanya perintah pemain yang biasanya dikirim dari klien ke server dan sebaliknya. Jika seorang pemain tidak menjalankan perintah (seperti halnya pada sebagian besar kutu), tidak ada data yang perlu dikirim.

Lihat tautan ini.

http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php

Pembaruan: Kylotan menyebut ini "teknik 3" dalam jawabannya.


Yup, saya lupa tautan 1500 Pemanah yang biasa jadi saya senang Anda memberikannya!
Kylotan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.