Babagan model jaringan ing game kanggo pamula

Babagan model jaringan ing game kanggo pamula
Sajrone rong minggu kepungkur aku wis nggarap mesin jaringan kanggo gameku. Sadurunge, aku ora ngerti apa-apa babagan jaringan ing game, mula aku maca akeh artikel lan nindakake akeh eksperimen kanggo ngerti kabeh konsep lan bisa nulis mesin jaringan dhewe.

Ing pandhuan iki, aku pengin nuduhake karo sampeyan macem-macem konsep sing kudu sampeyan sinau sadurunge nulis mesin game sampeyan dhewe, uga sumber lan artikel sing paling apik kanggo sinau.

Umumé, ana rong jinis arsitektur jaringan utama: peer-to-peer lan client-server. Ing arsitektur peer-to-peer (p2p), data ditransfer antarane pasangan pemain sing disambungake, nalika ing arsitektur klien-server, data ditransfer mung antarane pemain lan server.

Senajan arsitektur peer-to-peer isih digunakake ing sawetara game, klien-server standar: iku luwih gampang kanggo ngleksanakake, mbutuhake jembaré saluran cilik, lan nggampangake kanggo nglindhungi saka mbeling. Mulane, ing pandhuan iki, kita bakal fokus ing arsitektur klien-server.

Utamane, kita paling kasengsem ing server otoriter: ing sistem kasebut, server mesthi bener. Contone, yen pamuter mikir dheweke ana ing (10, 5) lan server ngandhani yen dheweke ana ing (5, 3), banjur klien kudu ngganti posisi karo sing dilaporake dening server, dudu cara liya. Panggunaan server kuoso nggawe luwih gampang kanggo ngenali cheaters.

Ana telung komponen utama ing sistem jaringan game:

  • Protokol transportasi: carane data ditransfer antarane klien lan server.
  • Protokol aplikasi: apa sing dikirim saka klien menyang server lan saka server menyang klien, lan ing format apa.
  • Logika aplikasi: carane data sing dikirim digunakake kanggo nganyari kahanan klien lan server.

Penting banget kanggo ngerti peran saben bagean lan kesulitan sing ana gandhengane.

Protokol transportasi

Langkah pisanan yaiku milih protokol kanggo ngeterake data antarane server lan klien. Ana rong protokol Internet kanggo iki: TCP и UDP. Nanging sampeyan bisa nggawe protokol transportasi dhewe adhedhasar salah siji utawa nggunakake perpustakaan sing digunakake.

Perbandingan TCP lan UDP

Loro-lorone TCP lan UDP adhedhasar IP. IP ngidini paket bisa ditularaké saka sumber menyang panrima, nanging ora njamin yen paket dikirim bakal tekan panrima cepet utawa mengko, sing bakal njaluk menyang paling sapisan, lan urutan paket bakal teka ing. urutan sing bener. Kajaba iku, paket mung bisa ngemot ukuran data sing winates, sing diwenehake dening nilai kasebut WONG.

UDP mung lapisan tipis ing ndhuwur IP. Mula, ana watesan sing padha. Ing kontras, TCP nduweni akeh fitur. Nyedhiyakake sambungan dhawuh sing dipercaya ing antarane rong simpul kanthi mriksa kesalahan. Mulane, TCP trep banget lan digunakake ing akeh protokol liyane, contone, ing HTTP, FTP и SMTP. Nanging kabeh fitur kasebut ana regane: tundha.

Kanggo ngerti sebabe fungsi kasebut bisa nyebabake latensi, kita kudu ngerti cara kerja TCP. Nalika host ngirim ngirim paket menyang host sing nampa, ngarepake nampa pangakuan (ACK). Yen sawise wektu tartamtu ora nampa (amarga paket utawa konfirmasi ilang, utawa kanggo sawetara alesan liyane), banjur ngirim paket maneh. Kajaba iku, TCP njamin yen paket ditampa kanthi urutan sing bener, mula nganti paket ilang ditampa, kabeh paket liyane ora bisa diproses, sanajan wis ditampa dening simpul panampa.

Nanging kaya sing sampeyan ngerteni, latensi ing game multiplier penting banget, utamane ing genre aktif kaya FPS. Mulane akeh game nggunakake UDP kanthi protokol dhewe.

Protokol asli adhedhasar UDP bisa luwih efisien tinimbang TCP amarga macem-macem alasan. Contone, bisa menehi tandha sawetara paket minangka dipercaya lan liyane ora dipercaya. Mula, dheweke ora peduli yen paket sing ora bisa dipercaya wis tekan panampa. Utawa bisa ngolah pirang-pirang aliran data supaya paket sing ilang ing siji aliran ora alon-alon aliran liyane. Contone, bisa uga ana thread kanggo input pamuter lan thread liyane kanggo pesen chatting. Yen pesen chatting sing ora data urgent ilang, banjur ora bakal alon mudhun input sing urgent. Utawa protokol kepemilikan bisa uga ngetrapake linuwih kanthi beda tinimbang TCP supaya luwih efisien ing lingkungan video game.

Dadi, yen TCP nyedot, banjur kita bakal mbangun protokol transportasi dhewe adhedhasar UDP?

Kabeh iku rada rumit. Sanajan TCP meh sub-optimal kanggo sistem jaringan game, bisa uga cukup kanggo game tartamtu lan ngirit wektu sing larang regane. Contone, latensi bisa uga ora dadi masalah kanggo game adhedhasar giliran utawa game sing mung bisa dimainake ing jaringan LAN, ing ngendi latensi lan mundhut paket luwih sithik tinimbang ing Internet.

Akeh game sukses, kalebu World of Warcraft, Minecraft, lan Terraria, nggunakake TCP. Nanging, umume FPS nggunakake protokol adhedhasar UDP dhewe, mula kita bakal ngrembug babagan kasebut ing ngisor iki.

Yen sampeyan milih nggunakake TCP, priksa manawa iku dipateni Algoritma Nagle, amarga buffer paket sadurunge ngirim, kang tegese iku mundhak wektu tundha.

Kanggo mangerteni sing luwih lengkap babagan beda antarane UDP lan TCP ing konteks game bebarengan, sampeyan bisa maca artikel Glenn Fiedler. UDP vs. TCP.

Protokol Proprietary

Dadi sampeyan pengin nggawe protokol transportasi dhewe nanging ora ngerti arep miwiti? Sampeyan beruntung, amarga Glenn Fiedler nulis rong artikel sing apik tenan babagan iki. Sampeyan bakal nemokake akeh gagasan pinter ing wong.

Artikel pisanan Jaringan kanggo Game Programmer 2008, luwih gampang tinimbang sing kapindho Nggawe Protokol Jaringan Game 2016. Aku nyaranake sampeyan miwiti karo sing lawas.

Elinga yen Glenn Fiedler minangka panyengkuyung gedhe kanggo nggunakake protokol sampeyan dhewe adhedhasar UDP. Lan sawise maca artikel-artikel kasebut, sampeyan bisa uga bakal nganggep manawa TCP duwe kekurangan serius ing game video, lan sampeyan pengin ngetrapake protokol sampeyan dhewe.

Nanging yen sampeyan anyar ing jaringan, nindakaken dhewe lan nggunakake TCP utawa perpustakaan. Kanggo sukses ngetrapake protokol transportasi sampeyan dhewe, sampeyan kudu sinau akeh sadurunge.

Pustaka jaringan

Yen sampeyan perlu soko luwih efisien saka TCP, nanging ora pengin keganggu ngleksanakake protokol dhewe lan menyang akèh rincian, sampeyan bisa nggunakake perpustakaan net. Ana akeh:

Aku durung nyoba kabeh, nanging aku luwih seneng ENet amarga gampang digunakake lan dipercaya. Kajaba iku, duwe dokumentasi sing jelas lan tutorial kanggo pamula.

Protokol Transportasi: Kesimpulan

Kanggo ngringkes, ana rong protokol transportasi utama: TCP lan UDP. TCP nduweni akeh fitur migunani: linuwih, pengawetan pesenan paket, deteksi kesalahan. UDP ora duwe kabeh, nanging TCP, kanthi sifate, nduweni latensi dhuwur sing ora bisa ditampa kanggo sawetara game. Tegese, kanggo mesthekake latensi kurang, sampeyan bisa nggawe protokol dhewe adhedhasar UDP utawa nggunakake perpustakaan sing ngleksanakake protokol transportasi ing UDP lan diadaptasi kanggo video game bebarengan.

Pilihan antarane TCP, UDP lan perpustakaan gumantung ing sawetara faktor. Kaping pisanan, saka kabutuhan game: apa butuh latency sing sithik? Kapindho, saka syarat protokol aplikasi: apa perlu protokol sing bisa dipercaya? Kaya sing bakal kita deleng ing bagean sabanjure, bisa uga nggawe protokol aplikasi sing protokol sing ora bisa dipercaya cukup cocog. Pungkasan, sampeyan uga kudu nganggep pengalaman pangembang mesin jaringan.

Aku duwe rong tips:

  • Abstract protokol transportasi sabisane saka aplikasi liyane supaya bisa gampang diganti tanpa nulis kabeh kode.
  • Aja over-optimized. Yen sampeyan ora pakar jaringan lan ora yakin yen sampeyan mbutuhake protokol transportasi basis UDP dhewe, sampeyan bisa miwiti karo TCP utawa perpustakaan sing nyedhiyani linuwih, lan banjur nyoba lan ngukur kinerja. Yen sampeyan nemoni masalah lan sampeyan yakin manawa iki minangka protokol transportasi, bisa uga wektune nggawe protokol transportasi sampeyan dhewe.

Ing pungkasan bagean iki, aku nyaranake sampeyan maca Pambuka kanggo Multiplayer Game Programming Brian Hook, kang isine akeh topik rembugan kene.

Protokol Aplikasi

Saiki kita bisa ngganti data antarane klien lan server, kita kudu mutusake data apa sing bakal ditransfer lan ing format apa.

Skema klasik yaiku klien ngirim input utawa tumindak menyang server, lan server ngirim kahanan game saiki menyang klien.

Server ngirim ora lengkap, nanging negara saring karo entitas sing cedhak pamuter. Dheweke nindakake iki amarga telung alasan. Kaping pisanan, total negara bisa uga gedhe banget kanggo ngirim kanthi frekuensi dhuwur. Sareh, klien utamané kasengsem ing data visual lan audio, amarga paling saka logika game simulasi ing server game. Katelu, ing sawetara game, pemain ora perlu ngerti data tartamtu, kayata posisi mungsuh ing sisih liyane saka peta, amarga digunakake bisa sniff paket lan ngerti persis ngendi kanggo pindhah kanggo matèni wong.

Serialisasi

Langkah pisanan yaiku ngowahi data sing arep dikirim (input utawa negara game) menyang format sing cocog kanggo transmisi. Proses iki diarani serialisasi.

Ide kasebut langsung dipikirake kanggo nggunakake format sing bisa diwaca manungsa, kayata JSON utawa XML. Nanging iki bakal rampung ora efisien lan bakal njupuk munggah paling saluran kanggo apa-apa.

Nanging, disaranake nggunakake format binar, sing luwih kompak. Tegese, paket kasebut mung ngemot sawetara bita. Kene kita kudu njupuk menyang akun masalah urutan byte, sing bisa beda-beda ing komputer sing beda-beda.

Kanggo nggawe serial data, sampeyan bisa nggunakake perpustakaan, contone:

Priksa manawa perpustakaan nggawe arsip portabel lan ngurus endianness.

Solusi alternatif yaiku ngetrapake dhewe, ora angel banget, utamane yen sampeyan nggunakake pendekatan data-sentris ing kode sampeyan. Kajaba iku, bakal ngidini sampeyan nindakake optimasi sing ora bisa ditindakake nalika nggunakake perpustakaan.

Glenn Fiedler wis nulis rong artikel babagan serialisasi: Paket Maca lan Nulis и Sastranegara Serialisasi.

Komprèsi

Jumlah data sing ditransfer antarane klien lan server diwatesi dening bandwidth saluran. Kompresi data bakal ngidini sampeyan nransfer luwih akeh data ing saben snapshot, nambah tingkat refresh, utawa mung nyuda syarat bandwidth.

Bit packing

Teknik pisanan yaiku packing bit. Iku kasusun ing nggunakake persis jumlah bit sing perlu kanggo njlèntrèhaké nilai sing dikarepake. Contone, yen sampeyan duwe enum sing bisa duwe 16 nilai beda, banjur tinimbang bita wutuh (8 bit), sampeyan bisa nggunakake mung 4 bit.

Glenn Fiedler nerangake carane ngetrapake iki ing bagean kapindho artikel kasebut. Paket Maca lan Nulis.

Bit packing bisa digunakake kanthi apik karo diskritisasi, sing bakal dadi topik ing bagean sabanjure.

Sampling

Sampling minangka teknik kompresi lossy sing mung nggunakake subset saka nilai sing bisa dikodekake. Cara paling gampang kanggo ngleksanakake diskretisasi yaiku kanthi ngbunderake angka floating-point.

Glenn Fiedler (maneh!) Nuduhake carane aplikasi discretization ing laku ing artikel kang Kompresi Snapshot.

Algoritma kompresi

Teknik sabanjure yaiku algoritma kompresi lossless.

Ing kene, miturut pendapatku, ana telung algoritma sing paling menarik sing sampeyan kudu ngerti:

  • Huffman coding kanthi kode sing wis diitung, sing cepet banget lan bisa ngasilake asil sing apik. Iki digunakake kanggo ngompres paket ing mesin jaringan Quake3.
  • zlib minangka algoritma kompresi tujuan umum sing ora bakal nambah jumlah data. Carane sampeyan bisa ndeleng kene, wis digunakake ing macem-macem aplikasi. Kanggo nganyari negara, bisa uga keluwih. Nanging bisa migunani yen sampeyan kudu ngirim aset, teks dawa utawa terrain menyang klien saka server.
  • Nyalin dawa roto mbokmenawa algoritma komprèsi sing paling gampang, nanging efisien banget kanggo jinis data tartamtu, lan bisa digunakake minangka langkah pra-proses sadurunge zlib. Iku utamané cocok kanggo compressing terrain dumadi saka kothak utawa voxels kang akeh unsur tetanggan diulang.

kompresi delta

Teknik kompresi pungkasan yaiku kompresi delta. Iku dumunung ing kasunyatan sing mung beda antarane negara game saiki lan negara pungkasan ditampa dening klien ditularaké.

Iki pisanan digunakake ing mesin jaringan Quake3. Ing ngisor iki ana rong artikel sing nerangake carane nggunakake:

Glenn Fiedler uga digunakake ing bagean kapindho artikel kasebut Kompresi Snapshot.

Enkripsi

Kajaba iku, sampeyan bisa uga kudu encrypt transmisi informasi antarane klien lan server. Ana sawetara alasan kanggo iki:

  • privasi / rahasia: pesen mung bisa diwaca dening panampa, lan ora ana wong liya sniffing jaringan bakal bisa maca.
  • bukti asli: wong sing arep kanggo muter peran pemain kudu ngerti tombol.
  • Nyegah ngapusi: iku bakal dadi luwih angel kanggo pemain angkoro nggawe paket ngapusi dhewe, padha kudu tiron rencana enkripsi lan nemokake tombol (sing diganti saben sambungan).

Aku banget nyaranake nggunakake perpustakaan kanggo iki. Aku suggest nggunakake lisodium, amarga iku utamané prasaja lan wis tutorial gedhe. Saka kapentingan tartamtu tutorial ing ijol-ijolan kunci, sing ngidini sampeyan ngasilake kunci anyar ing saben sambungan anyar.

Protokol Aplikasi: Kesimpulan

Iki rampung protokol aplikasi. Aku pracaya sing komprèsi rampung opsional lan kaputusan kanggo nggunakake mung gumantung ing game lan bandwidth dibutuhake. Enkripsi, miturut pendapatku, wajib, nanging ing prototipe pisanan sampeyan bisa nindakake tanpa.

Logika Aplikasi

Saiki kita bisa nganyari negara ing klien, nanging bisa uga ngalami masalah latensi. Pamuter, sawise nggawe input, kudu ngenteni nganyari negara game saka server kanggo ndeleng apa efek wis ing donya.

Kajaba iku, ing antarane rong nganyari negara, jagad iki statis. Yen tingkat nganyari negara kurang, banjur obahe bakal banget jerky.

Ana sawetara teknik kanggo nyuda dampak saka masalah iki, lan aku bakal nutupi ing bagean sabanjure.

Teknik Smoothing Tundha

Kabeh teknik sing diterangake ing bagean iki dibahas kanthi rinci ing seri kasebut Multiplayer kanthi cepet Gabriel Gambetta. Aku banget nyaranake maca seri artikel sing apik banget iki. Iku uga kalebu demo interaktif kanggo ndeleng carane Techniques iki bisa ing laku.

Teknik pisanan yaiku ngetrapake asil input kanthi langsung tanpa ngenteni tanggapan saka server. Iku diarani prakiraan sisih klien. Nanging, nalika klien nampa nganyari saka server, kudu verifikasi manawa prediksi kasebut bener. Yen ora kaya ngono, mula dheweke mung kudu ngganti negarane miturut apa sing ditampa saka server, amarga server kasebut otoriter. Teknik iki pisanan digunakake ing Quake. Sampeyan bisa maca liyane babagan ing artikel. Review kode Quake Engine Fabien Sanglars [jarwan ing Habré].

Teknik kapindho digunakake kanggo lancar gerakan entitas liyane ing antarane rong nganyari negara. Ana rong cara kanggo ngatasi masalah iki: interpolasi lan ekstrapolasi. Ing kasus interpolasi, rong negara pungkasan dijupuk lan transisi saka siji menyang liyane ditampilake. Kerugian kasebut yaiku nyebabake bagean cilik saka wektu tundha, amarga klien tansah ndeleng apa sing kedadeyan ing jaman kepungkur. Ekstrapolasi yaiku babagan prédhiksi endi entitas saiki kudu adhedhasar negara pungkasan sing ditampa dening klien. Kerugian kasebut yaiku yen entitas rampung ngganti arah gerakan, mula bakal ana kesalahan gedhe antarane ramalan lan posisi nyata.

Teknik pungkasan, paling maju, mung migunani ing FPS, yaiku kompensasi lag. Nalika nggunakake kompensasi lag, server njupuk menyang akun telat klien nalika murub ing target. Contone, yen pemain nindakake headshot ing layar, nanging nyatane targete ana ing lokasi sing beda amarga wektu tundha, mula ora adil kanggo nolak pemain kasebut hak mateni amarga wektu tundha. Dadi server mundur maneh nalika pemain murub kanggo simulasi apa sing dideleng ing layar lan mriksa tabrakan antarane tembakan lan target.

Glenn Fiedler (kaya biasane!) nulis artikel ing taun 2004 Fisika Jaringan (2004), ing ngendi dheweke nggawe dhasar kanggo sinkronisasi simulasi fisika antarane server lan klien. Ing 2014 dheweke nulis seri artikel anyar Fisika Jaringan, ing ngendi dheweke nerangake teknik liya kanggo nyinkronake simulasi fisika.

Ana uga rong artikel ing wiki Valve, Sumber Jaringan Multiplayer и Metode Kompensasi Latency ing Desain lan Optimasi Protokol Klien / Server In-game nangani ganti rugi wektu tundha.

Nyegah mbeling

Ana rong teknik pencegahan cheat utama.

Pisanan, nggawe luwih angel kanggo cheaters kanggo ngirim paket angkoro. Kaya sing kasebut ing ndhuwur, cara sing apik kanggo ngetrapake yaiku enkripsi.

Kapindho, server wewenang mung kudu nampa printah / input / tumindak. Klien ngirim ora bisa ngganti negara ing server liyane saka ngirim input. Banjur server, saben nampa input, kudu mriksa validitas sadurunge nglamar.

Logika Aplikasi: Kesimpulan

Aku nyaranake sampeyan ngleksanakake cara kanggo simulasi latensi dhuwur lan tingkat refresh kurang supaya sampeyan bisa nyoba prilaku game ing kahanan ala, malah nalika klien lan server mlaku ing mesin padha. Iki banget nyederhanakake implementasine teknik smoothing tundha.

Sumber daya liyane sing migunani

Yen sampeyan pengin njelajah sumber daya model jaringan liyane, sampeyan bisa nemokake ing kene:

Source: www.habr.com

Add a comment