Iwwer de Netzwierkmodell a Spiller fir Ufänger

Iwwer de Netzwierkmodell a Spiller fir Ufänger
Fir déi lescht zwou Wochen hunn ech um Online-Motor fir mäi Spill geschafft. Virdru wousst ech guer näischt iwwer Vernetzung a Spiller, also hunn ech vill Artikelen gelies a vill Experimenter gemaach fir all d'Konzepter ze verstoen a fäeg sinn meng eegen Netzwierkmotor ze schreiwen.

An dësem Guide wëll ech mat Iech déi verschidde Konzepter deelen déi Dir musst léieren ier Dir Ären eegene Spillmotor schreift, souwéi déi bescht Ressourcen an Artikelen fir se ze léieren.

Am Allgemengen ginn et zwou Haaptarten vun Netzwierkarchitekturen: Peer-to-Peer a Client-Server. An enger Peer-to-Peer (p2p) Architektur ginn Daten tëscht all Pair vu verbonne Spiller transferéiert, während an enger Client-Server Architektur Daten nëmmen tëscht Spiller an dem Server transferéiert ginn.

Och wann d'Peer-to-Peer Architektur nach ëmmer an e puer Spiller benotzt gëtt, ass Client-Server de Standard: et ass méi einfach ze implementéieren, erfuerdert eng méi kleng Kanalbreet, a mécht et méi einfach ze schützen géint Bedruch. Dofir, an dësem Tutorial konzentréiere mir eis op d'Client-Server Architektur.

Besonnesch, mir sinn am meeschte interesséiert autoritär Serveren: an esou Systemer, ass de Server ëmmer Recht. Zum Beispill, wann e Spiller mengt datt hien op Koordinaten ass (10, 5), an de Server seet him datt hien op (5, 3) ass, da soll de Client seng Positioun ersetzen duerch déi vum Server gemellt, an net Vize versa. D'Benotzung vun autoritäre Serveren mécht et méi einfach Cheaters z'identifizéieren.

Network Gaming Systemer hunn dräi Haaptkomponenten:

  • Transportprotokoll: wéi Daten tëscht Clienten a Server transferéiert ginn.
  • Applikatiounsprotokoll: wat gëtt vu Clienten op de Server a vum Server op Clienten iwwerdroen an a wéi engem Format.
  • Applikatiounslogik: wéi déi transferéiert Donnéeën benotzt gi fir den Zoustand vun de Clienten a Server ze aktualiséieren.

Et ass ganz wichteg d'Roll vun all Deel ze verstoen an d'Erausfuerderunge mat hinnen verbonnen.

Transport Protokoll

Den éischte Schrëtt ass e Protokoll ze wielen fir Daten tëscht dem Server a Clienten ze transportéieren. Et ginn zwou Internetprotokoller fir dëst: TCP и UDP. Awer Dir kënnt Ären eegene Transportprotokoll erstellen op Basis vun engem vun hinnen oder eng Bibliothéik benotzen déi se benotzt.

Verglach vun TCP an UDP

Béid TCP an UDP baséieren op IP. IP erlaabt e Paket vun enger Quell un en Empfänger ze iwwerdroen, awer garantéiert net datt de geschéckte Paket fréier oder spéider den Empfänger erreechen, datt et op d'mannst eemol kënnt an datt d'Sequenz vun de Pakete richteg ukommen bestellen. Ausserdeem kann e Paket nëmmen eng limitéiert Quantitéit un Daten enthalen, uginn vum Wäert Jonge.

UDP ass just eng dënn Schicht uewen op IP. Dofir huet et déiselwecht Aschränkungen. Am Géigesaz huet TCP vill Features. Et bitt eng zouverlässeg, uerdentlech Verbindung tëscht zwee Wirbelen mat Fehlerprüfung. Dofir ass TCP ganz bequem a gëtt a villen anere Protokoller benotzt, z. HTTP, FTP и Simple. Awer all dës Feature kommen zu engem Präis: Verzögerung.

Fir ze verstoen firwat dës Funktiounen latency verursaachen, musse mir verstoen wéi TCP funktionnéiert. Wann e Sendende Node e Paket op en Empfangsknuet iwwerdréit, erwaart et eng Unerkennung (ACK) ze kréien. Wann et no enger gewësser Zäit et net kritt (well de Paket oder d'Unerkennung verluer ass, oder aus engem anere Grond), da schéckt se de Paket erëm. Ausserdeem garantéiert TCP datt Päckchen an der korrekter Uerdnung opgeholl ginn, also bis de verluerene Paket kritt ass, kënnen all aner Päck net veraarbecht ginn, och wa se scho vum Empfangshost kritt hunn.

Awer wéi Dir Iech wahrscheinlech virstellen kënnt, ass Latenz a Multiplayer Spiller ganz wichteg, besonnesch an actiongepackte Genren wéi FPS. Dofir benotze vill Spiller UDP mat hirem eegene Protokoll.

En gebierteg UDP-baséiert Protokoll ka méi effizient sinn wéi TCP aus verschiddene Grënn. Zum Beispill kann et e puer Pakete als vertraut markéieren an anerer als net vertraut. Dofir ass et egal ob den net vertraute Paket den Empfänger erreecht. Oder et kann méi Datenstroum veraarbecht ginn, sou datt e verluerene Paket an engem Stroum déi verbleiwen Streamen net verlangsamt. Zum Beispill kann et e Fuedem fir Spillerinput ginn an en anere Fuedem fir Chat Messagen. Wann e Chat Message deen net dréngend ass verluer ass, wäert et den Input net verlangsamen deen dréngend ass. Oder e propriétaire Protokoll kéint Zouverlässegkeet anescht implementéieren wéi TCP fir méi effizient an engem Videospillëmfeld ze sinn.

Also, wann TCP sou vill suckelt, da kreéiere mir eisen eegene Transportprotokoll baséiert op UDP?

Et ass e bësse méi komplizéiert. Och wann TCP bal suboptimal ass fir Gaming Netzwierksystemer, kann et ganz gutt fir Äert spezifescht Spill funktionnéieren an Iech wäertvoll Zäit spueren. Zum Beispill kann d'Latenz net e Problem sinn fir e Turn-baséiert Spill oder e Spill dat nëmmen op LAN Netzwierker gespillt ka ginn, wou Latenz a Paketverloscht vill méi niddereg sinn wéi um Internet.

Vill erfollegräich Spiller, dorënner World of Warcraft, Minecraft an Terraria, benotzen TCP. Wéi och ëmmer, déi meescht FPSs benotzen hir eege UDP-baséiert Protokoller, also wäerte mir méi iwwer se drënner schwätzen.

Wann Dir decidéiert TCP ze benotzen, vergewëssert Iech datt et behënnert ass Nagle's Algorithmus, well et Puffer Päck virum Verschécken, dat heescht datt et d'Latenz erhéicht.

Fir méi iwwer d'Ënnerscheeder tëscht UDP an TCP am Kontext vu Multiplayer Spiller ze léieren, kënnt Dir dem Glenn Fiedler säin Artikel liesen UDP vs. TCP.

Eege Protokoll

Also Dir wëllt Ären eegene Transportprotokoll erstellen, awer wësst net wou ufänken? Dir hutt Gléck well de Glenn Fiedler zwee erstaunlech Artikelen iwwer dëst geschriwwen huet. Dir fannt vill intelligent Gedanken an hinnen.

Den éischten Artikel Vernetzung fir Spill Programmer 2008, méi einfach wéi déi zweet, Bauen e Spill Network Protokoll 2016. Ech recommandéieren, datt Dir mat der eeler ufänken.

Notéiert datt de Glenn Fiedler e grousse Proponent ass fir e personaliséierte Protokoll baséiert op UDP ze benotzen. An nodeems Dir seng Artikelen gelies hutt, wäert Dir wahrscheinlech seng Meenung adoptéieren datt TCP sérieux Mängel a Videospiller huet, an Dir wëllt Ären eegene Protokoll ëmsetzen.

Awer wann Dir nei sidd mat Netzwierker, maacht Iech selwer eng Faveur a benotzt TCP oder eng Bibliothéik. Fir Ären eegene Transportprotokoll erfollegräich ëmzesetzen, musst Dir virdru vill léieren.

Reseau Bibliothéiken

Wann Dir eppes méi effizient braucht wéi TCP, awer wëllt net duerch d'Iwwerleeung vun Ärem eegene Protokoll goen an a vill Detailer goen, kënnt Dir eng Netzwierkbibliothéik benotzen. Et gi vill vun hinnen:

Ech hunn se net all probéiert, mee ech léiwer ENet well et einfach ze benotzen an zouverlässeg ass. Zousätzlech huet et kloer Dokumentatioun an en Tutorial fir Ufänger.

Transport Protokoll: Conclusioun

Fir ze resuméieren: et ginn zwee Haapttransportprotokoller: TCP an UDP. TCP huet vill nëtzlech Funktiounen: Zouverlässegkeet, Paketuerdnungskonservatioun, Feelererkennung. UDP huet dëst net alles, awer TCP duerch seng Natur huet d'Latenz erhéicht, wat fir e puer Spiller inakzeptabel ass. Dat ass, fir geréng latency ze garantéieren, kënnt Dir Ären eegene Protokoll op UDP erstellen oder eng Bibliothéik benotzen déi en Transportprotokoll op UDP implementéiert an fir Multiplayer Videospiller adaptéiert ass.

D'Wiel tëscht TCP, UDP an der Bibliothéik hänkt vu verschiddene Faktoren of. Als éischt, vun de Bedierfnesser vum Spill: brauch et niddereg latency? Zweetens, vun den Ufuerderunge vum Applikatiounsprotokoll: brauch et en zouverléissege Protokoll? Wéi mir am nächsten Deel gesinn, ass et méiglech en Applikatiounsprotokoll ze kreéieren fir deen en net zouverléissege Protokoll ganz gëeegent ass. Schlussendlech musst Dir och d'Erfahrung vum Netzmotorentwéckler berücksichtegen.

Ech hunn zwee Rotschléi:

  • Abstrakt den Transportprotokoll aus dem Rescht vun der Applikatioun sou vill wéi méiglech sou datt et einfach ersat ka ginn ouni de ganze Code nei ze schreiwen.
  • Net iwweroptimiséieren. Wann Dir net en Netzwierksexpert sidd an net sécher sidd ob Dir e personaliséierten UDP-baséiert Transportprotokoll braucht, kënnt Dir mat TCP oder enger Bibliothéik ufänken déi Zouverlässegkeet ubitt, an dann d'Performance testen a moossen. Wann Probleemer entstinn an Dir sidd zouversiichtlech datt d'Ursaach den Transportprotokoll ass, da kann et Zäit sinn Ären eegene Transportprotokoll ze kreéieren.

Um Enn vun dësem Deel recommandéieren ech Iech ze liesen Aféierung fir Multiplayer Spill Programméierung vum Brian Hook, déi vill vun den Themen déi hei diskutéiert deckt.

Applikatioun Protokoll

Elo wou mir Daten tëscht Clienten a Server austausche kënnen, musse mir entscheeden wéi eng Donnéeën ze transferéieren an a wéi engem Format.

Déi klassesch Schema ass datt Clienten Input oder Aktiounen op de Server schécken, an de Server schéckt den aktuellen Spillzoustand un d'Clienten.

De Server schéckt net de vollen Zoustand, awer e gefilterte Staat mat Entitéiten déi no beim Spiller sinn. Hien mécht dat aus dräi Grënn. Als éischt kann de komplette Staat ze grouss sinn fir op héijer Frequenz iwwerdroen ze ginn. Zweetens sinn d'Clienten haaptsächlech u visuellen an audiodaten interesséiert, well déi meescht vun der Spilllogik um Spillserver simuléiert gëtt. Drëttens, an e puer Spiller brauch de Spiller net bestëmmten Donnéeën ze wëssen, zum Beispill, d'Positioun vum Feind op der anerer Säit vun der Kaart, soss kann hien Pakete sniff a wësse genee wou hie plënnert fir hien ëmzebréngen.

Serialiséierung

Den éischte Schrëtt ass d'Daten ze konvertéieren déi mir wëllen schécken (Input oder Spillzoustand) an e Format dat gëeegent ass fir d'Transmissioun. Dëse Prozess gëtt genannt serialization.

De Gedanke deen direkt am Kapp kënnt ass e mënschlech liesbare Format ze benotzen, wéi JSON oder XML. Awer dëst wäert komplett ineffektiv sinn a wäert de gréissten Deel vum Kanal verschwenden.

Et ass recommandéiert amplaz de binäre Format ze benotzen, wat vill méi kompakt ass. Dat ass, d'Päckchen enthalen nëmmen e puer Bytes. Et gëtt e Problem hei ze berücksichtegen byte Uerdnung, déi op verschiddene Computeren ënnerscheeden kënnen.

Fir Daten ze serialiséieren, kënnt Dir eng Bibliothéik benotzen, zum Beispill:

Gitt sécher datt d'Bibliothéik portable Archiven erstellt a sech ëm Endianness këmmert.

Eng alternativ Léisung ass et selwer ëmzesetzen; et ass net besonnesch schwéier, besonnesch wann Dir eng datenzentresch Approche fir Äre Code benotzt. Zousätzlech wäert et Iech erlaben Optimisatiounen auszeféieren déi net ëmmer méiglech sinn wann Dir d'Bibliothéik benotzt.

De Glenn Fiedler huet zwee Artikelen iwwer Serialiséierung geschriwwen: Liesen a Schreiwen Pakete и Serialiséierung Strategien.

Kompressioun

D'Quantitéit vun Daten, déi tëscht Clienten a Server transferéiert ginn, ass limitéiert duerch d'Bandbreedung vum Kanal. Datekompressioun erlaabt Iech méi Daten an all Snapshot ze transferéieren, d'Aktualiséierungsfrequenz erhéijen oder einfach d'Kanalfuerderunge reduzéieren.

Bit Verpackung

Déi éischt Technik ass Bit Packing. Et besteet aus der Benotzung vun der exakt Unzuel u Bits déi néideg sinn fir de gewënschten Wäert ze beschreiwen. Zum Beispill, wann Dir en Enum hutt, deen 16 verschidde Wäerter kann hunn, da kënnt Dir amplaz vun engem ganze Byte (8 Bits) just 4 Bits benotzen.

Wéi een dat ëmsetzt erkläert de Glenn Fiedler am zweeten Deel vum Artikel Liesen a Schreiwen Pakete.

Bit Packing funktionnéiert besonnesch gutt mat Sampling, wat d'Thema vun der nächster Sektioun wäert sinn.

Echantillon

Echantillon ass eng lossy Kompressiounstechnik déi nëmmen e Subset vu méigleche Wäerter benotzt fir e Wäert ze codéieren. Deen einfachste Wee fir d'Diskretiséierung ëmzesetzen ass duerch d'Ronn vun der Schwämmpunktzuelen.

De Glenn Fiedler (erëm!) weist a sengem Artikel, wéi een Sampling an der Praxis ëmsetzt Snapshot Kompressioun.

Kompressioun Algorithmen

Déi nächst Technik wäert lossless Kompressioun Algorithmen sinn.

Hei, menger Meenung no, sinn déi dräi interessantst Algorithmen déi Dir wësse musst:

  • Huffman coding mat virberechent Code, déi extrem séier ass a gutt Resultater produzéiere kann. Et gouf benotzt fir Pakete am Quake3 Netzwierkmotor ze kompriméieren.
  • zlib ass en allgemeng Zweck Kompressiounsalgorithmus deen d'Quantitéit vun Daten ni erhéicht. Wéi kënnt Dir gesinn hei, et gouf a ville Applikatiounen benotzt. Et kann iwwerflësseg sinn fir Staaten ze aktualiséieren. Awer et kann nëtzlech sinn wann Dir Verméigen, laang Texter oder Terrain fir Cliente vum Server schécken musst.
  • Copie vun Run Längt - Dëst ass wahrscheinlech den einfachsten Kompressiounsalgorithmus, awer et ass ganz effektiv fir verschidden Aarte vun Daten, a kann als Virveraarbechtungsschrëtt virum zlib benotzt ginn. Et ass besonnesch gëeegent fir Terrainen aus Plättercher oder Voxelen ze kompriméieren, an deenen vill ugrenzend Elementer widderholl ginn.

Delta Kompressioun

Déi lescht Kompressiounstechnik ass Delta Kompressioun. Et besteet aus der Tatsaach datt nëmmen d'Ënnerscheeder tëscht dem aktuellen Spillzoustand an dem leschte Staat vum Client iwwerdroen ginn.

Et gouf fir d'éischt am Quake3 Netzwierkmotor benotzt. Hei sinn zwee Artikelen déi erkläre wéi Dir et benotzt:

De Glenn Fiedler huet et och am zweeten Deel vu sengem Artikel benotzt Snapshot Kompressioun.

Verschlësselung

Zousätzlech musst Dir den Transfer vun Informatioun tëscht Clienten an dem Server verschlësselen. Et gi verschidde Grënn dofir:

  • Privatsphär / Confidentialitéit: Messagen kënnen nëmme vum Empfänger gelies ginn, a keng aner Persoun, déi d'Netzwierk snifft, kann se liesen.
  • Authentifikatioun: eng Persoun déi d'Roll vun engem Spiller spille wëll, muss säi Schlëssel wëssen.
  • Cheat Präventioun: Et gëtt vill méi schwéier fir béisaarteg Spiller hir eege Cheat Packagen ze kreéieren, si mussen d'Verschlësselungsschema reproduzéieren an de Schlëssel fannen (dee mat all Verbindung ännert).

Ech recommandéieren staark eng Bibliothéik fir dëst ze benotzen. Ech proposéieren ze benotzen libsodium, well et ass besonnesch einfach an huet excellent Tutorials. Besonnesch interessant ass den Tutorial iwwer Schlësselaustausch, wat Iech erlaabt nei Schlësselen mat all neie Verbindung ze generéieren.

Applikatioun Protokoll: Conclusioun

Dëst schléisst eisen Applikatiounsprotokoll of. Ech gleewen datt d'Kompressioun komplett fakultativ ass an d'Entscheedung se ze benotzen hänkt nëmmen vum Spill an der erfuerderter Bandbreedung of. Verschlësselung, menger Meenung no, ass obligatoresch, awer am éischte Prototyp kënnt Dir ouni et maachen.

Applikatioun Logik

Mir kënnen elo den Zoustand am Client aktualiséieren, awer kënne mat Latenzprobleemer lafen. De Spiller, nodeems hien den Input ofgeschloss huet, muss waarden bis de Spillstat vum Server aktualiséiert gëtt fir ze kucken wéi en Impakt et op d'Welt hat.

Ausserdeem, tëscht zwee Staatsupdates, ass d'Welt komplett statesch. Wann de Staat Update Taux niddereg ass, da wäerten d'Beweegunge ganz ruckeleg sinn.

Et gi verschidde Techniken fir den Impakt vun dësem Problem ze reduzéieren, an ech wäert se an der nächster Rubrik ofdecken.

Latenz Smoothing Techniken

All Techniken an dëser Rubrik beschriwwe ginn am Detail an der Serie diskutéiert Fast-Paced Multiplayer Gabriel Gambetta. Ech recommandéieren dës exzellent Serie vun Artikelen ze liesen. Et enthält och eng interaktiv Demo déi Iech léisst gesinn wéi dës Techniken an der Praxis funktionnéieren.

Déi éischt Technik ass d'Input Resultat direkt z'applizéieren ouni op eng Äntwert vum Server ze waarden. Et gëtt genannt Client-Säit Prognosen. Wéi och ëmmer, wann de Client en Update vum Server kritt, muss et verifizéieren datt seng Prognose richteg war. Wann dat net de Fall ass, da muss hien just säin Zoustand änneren no deem wat hien vum Server kritt huet, well de Server ass autoritär. Dës Technik gouf fir d'éischt am Quake benotzt. Dir kënnt méi doriwwer am Artikel liesen Quake Engine Code Bewäertung Fabien Sanglars [Iwwersetzung op Habré].

Déi zweet Set vun Techniken gëtt benotzt fir d'Bewegung vun aneren Entitéiten tëscht zwee Staatsupdates ze gläichen. Et ginn zwou Weeër fir dëse Problem ze léisen: Interpolatioun an Extrapolatioun. Am Fall vun Interpolatioun ginn déi lescht zwee Staate geholl an den Iwwergang vun engem op deen aneren gëtt gewisen. Säin Nodeel ass datt et e klenge Verspéidung verursaacht well de Client ëmmer gesäit wat an der Vergaangenheet geschitt ass. Extrapolatioun geet iwwer virauszesoen wou Entitéite solle baséieren op de leschte Staat dee vum Client kritt. Säin Nodeel ass datt wann d'Entitéit d'Bewegungsrichtung komplett ännert, da gëtt et e grousse Feeler tëscht der Prognose an der aktueller Positioun.

Déi lescht, meescht fortgeschratt Technik nëmme nëtzlech am FPS ass lags Kompensatioun. Wann Dir Lag Kompensatioun benotzt, berücksichtegt de Server d'Verzögerungen vum Client wann en op d'Zil schéisst. Zum Beispill, wann e Spiller e Headshot op hirem Écran gemaach huet, awer a Wierklechkeet war hiren Zil op enger anerer Plaz wéinst Verzögerung, da wier et ongerecht de Spiller d'Recht ze refuséieren wéinst Verzögerung ëmzebréngen. Dofir réckelt de Server d'Zäit zréck op de Moment wou de Spiller geschoss huet fir ze simuléieren wat de Spiller op hirem Bildschierm gesinn huet a fir eng Kollisioun tëscht hirem Schoss an dem Zil ze kontrolléieren.

De Glenn Fiedler (wéi ëmmer!) huet 2004 en Artikel geschriwwen Network Physics (2004), an deem hien d'Basis fir d'Synchroniséierung vun der Physik Simulatioune tëscht Server a Client geluecht huet. 2014 huet hien eng nei Serie vun Artikelen geschriwwen Netzwierk Physik, déi aner Techniken fir d'Synchroniséierung vun der Physik Simulatioune beschriwwen hunn.

Et ginn och zwee Artikelen op der Valve Wiki, Quell Multiplayer Networking и Latenzkompensatiounsmethoden am Client / Server In-Game Protocol Design and Optimization déi Kompensatioun fir Verspéidungen betruecht.

Vermeiden vun Bedruch

Et ginn zwou Haapttechnike fir Bedruch ze vermeiden.

Als éischt: et méi schwéier maachen fir Cheaters béiswëlleg Päck ze schécken. Wéi uewen ernimmt, e gudde Wee fir dëst ëmzesetzen ass Verschlësselung.

Zweetens: en autoritäre Server soll nëmmen Kommandoen / Input / Aktiounen kréien. De Client soll net fäeg sinn den Zoustand um Server z'änneren anescht wéi andeems en Input schéckt. Dann, all Kéier wann de Server Input kritt, muss e kontrolléieren ob et gëlteg ass ier e se benotzt.

Applikatioun Logik: Conclusioun

Ech recommandéieren datt Dir e Wee implementéiert fir héich latencies an niddreg Erfrëschungsraten ze simuléieren, sou datt Dir d'Behuele vun Ärem Spill an aarme Konditiounen testen kann, och wann de Client an de Server um selwechte Computer lafen. Dëst wäert d'Ëmsetzung vun Verzögerungsglattechniken staark vereinfachen.

Aner hëllefräich Ressourcen

Wann Dir aner Ressourcen op Netzwierkmodeller wëllt entdecken, kënnt Dir se hei fannen:

Source: will.com

Setzt e Commentaire