Megapack: Wéi Factorio den 200-Spiller Multiplayer Problem geléist huet

Megapack: Wéi Factorio den 200-Spiller Multiplayer Problem geléist huet
Am Mee vun dësem Joer hunn ech als Spiller an MMO Evenementer KatherineOfSky. Ech gemierkt, datt wann d'Zuel vun de Spiller eng gewëssen Zuel erreecht, all puer Minutten e puer vun hinnen "falen ugefaangen". Gléck fir Iech (awer net fir mech), Ech war ee vun deene Spiller déi disconnected all Kéier, och mat enger gudder Verbindung. Ech hunn dëst als eng perséinlech Erausfuerderung geholl an hunn ugefaang no Ursaache vum Problem ze sichen. No dräi Woche vun Debugging, Testen a Fixen ass de Käfer endlech fixéiert, awer d'Rees war net sou einfach.

Probleemer mat Multiplayer Spiller si ganz schwéier ze verfolgen. Si geschéien normalerweis ënner ganz spezifesch Reseau Parameteren a ganz spezifesch Spill Konditiounen (an dësem Fall, mat méi wéi 200 Spiller). An och wann de Problem reproduzéiert ka ginn, kann et net richteg debugged ginn, well d'Aféierung vun Breakpoints d'Spill stoppt, Timer verwiesselt an normalerweis d'Verbindung dauert. Mä merci fir Persistenz an eng wonnerbar Outil genannt Hëllefsbereet Ech hunn et fäerdeg bruecht erauszefannen wat lass war.

Kuerz gesot, wéinst engem Feeler an onkomplett Ëmsetzung vun der Latenzstaatsimulatioun, géif de Client sech heiansdo an enger Situatioun fannen, wou en e Netzwierk Paket muss schécken, besteet aus den Input Selektiounsaktiounen vum Spiller vun ongeféier 400 Spillentitéiten an engem Auerzyklus ( mir nennen dat e "Mega-Packet"). De Server muss dann net nëmmen all dës Inputaktiounen korrekt kréien, mee se och un all aner Clienten schécken. Wann Dir 200 Clienten hutt, gëtt dëst séier e Problem. De Link zum Server gëtt séier verstoppt, wat zu Paketverloscht féiert an eng Kaskade vu nei ugefrote Päckchen. D'Verzögerung vun der Inputaktioun verursaacht dann nach méi Cliente fir Megapackets ze schécken, wouduerch d'Avalanche nach méi grouss gëtt. Gléckleche Clienten verwalten sech ze recuperéieren; all déi aner falen of.

Megapack: Wéi Factorio den 200-Spiller Multiplayer Problem geléist huet
De Problem war ganz fundamental an et huet mech 2 Wochen gedauert fir et ze fixéieren. Et ass zimmlech technesch, also wäert ech déi saftbar technesch Detailer hei ënnen erklären. Awer als éischt musst Dir wëssen datt zënter der Versioun 0.17.54, déi de 4. Juni verëffentlecht gouf, am Gesiicht vun temporäre Verbindungsprobleemer, Multiplayer méi stabil ginn ass, a Verzögerungen verstoppen ass vill manner Buggy ginn (manner Verlängerung an Teleportéieren). Ech hunn och de Wee geännert wéi d'Kampflag verstoppt ass an ech hoffen dat wäert et e bësse méi glatter maachen.

Multiplayer Mega Pack - Technesch Detailer

Fir et einfach ze soen, Multiplayer an engem Spill funktionnéiert esou: all Cliente simuléieren den Zoustand vum Spill, kréien a schécken nëmmen Spillerinput (genannt "Input Actions", Input Aktiounen). D'Haaptaufgab vum Server ass den Transfer Input Aktiounen a kontrolléiert datt all Clienten déiselwecht Aktiounen am selwechte Auerzyklus maachen. Dir kënnt méi iwwer dëst am Post liesen FFF-149.

Well de Server muss Entscheedungen treffen iwwer wat fir Aktiounen ze maachen, beweegen d'Aktiounen vum Spiller ongeféier op dësem Wee: Spilleraktioun -> Spillclient -> Netzwierk -> Server -> Netzwierk -> Spillclient. Dëst bedeit datt d'Aktioun vun all Spiller nëmme gemaach gëtt nodeems se eng Ronn Rees iwwer d'Netz gemaach hunn. Wéinst deem géif d'Spill schrecklech lues schéngen, also bal direkt no der Aféierung vum Multiplayer am Spill gouf e Mechanismus agefouert fir Verspéidungen ze verstoppen. Verstoppt Verspéidung simuléiert Spillerinput ouni d'Aktiounen vun anere Spiller an d'Decisiounen vum Server ze berücksichtegen.

Megapack: Wéi Factorio den 200-Spiller Multiplayer Problem geléist huet
Factorio huet e Spillstaat Spill Staat ass de komplette Staat vun der Kaart, Spiller, Entitéiten an alles anescht. Et gëtt deterministesch simuléiert an all Client baséiert op den Aktiounen, déi vum Server kritt goufen. Spillstaat ass helleg, a wann et jeemools ufänkt vum Server oder engem anere Client ze ënnerscheeden, da geschitt Desync.

ausser Spill Staat mir hunn en Zoustand vun Verspéidungen Latenz Staat. Et enthält e klengen Ënnerdeel vum Grondzoustand. Latenz Staat net helleg a duerstellt einfach e Bild vun deem wat de Spillstaat an Zukunft baséiert op Spillerinputen ausgesäit Input Aktiounen.

Fir dësen Zweck späichere mir eng Kopie vun der erstallt Input Aktiounen an der Verzögerungsschlaang.

Megapack: Wéi Factorio den 200-Spiller Multiplayer Problem geléist huet
Dat ass, um Enn vum Prozess op der Client Säit gesäit d'Bild sou eppes aus:

  1. Bewerbung Input Aktiounen all Spiller ze Spill Staat d'Art a Weis wéi dës Inputaktioune vum Server kritt goufen.
  2. Mir läschen alles aus der Verzögerungsschlaang Input Aktiounen, déi, laut dem Server, schonn applizéiert goufen Spill Staat.
  3. Läschen Latenz Staat a reset et sou datt et genau d'selwecht ausgesäit wéi Spill Staat.
  4. Mir gëllen all Aktiounen aus der Retard Schlaang bis Latenz Staat.
  5. Baséiert op Daten Spill Staat и Latenz Staat Mir maachen d'Spill dem Spiller.

All dëst gëtt an all Mooss widderholl.

Ze schwéier? Relax net, dëst ass net alles. Fir onzouverlässeg Internetverbindungen ze kompenséieren, hu mir zwee Mechanismen erstallt:

  • Verpasst Ticks: wann de Server decidéiert dat Input Aktiounen gëtt am Schlag vum Spill ausgefouert, dann wann hien net kritt huet Input Aktiounen e Spiller (zum Beispill, wéinst verstäerkter Verspéidung), hie wäert net waarden, awer wäert dëse Client informéieren "Ech hunn Är Input Aktiounen, Ech probéieren se an der nächster Bar ze addéieren. Dëst gëtt gemaach fir datt wéinst Probleemer mat der Verbindung (oder Computer) vun engem Spiller de Kaartupdate fir all aner net verlangsamt. Et ass derwäert opgeschriwwen dass Input Aktiounen ginn net ignoréiert, mä einfach op der Säit gesat.
  • Voll Ronn-Rees latency: De Server probéiert ze roden wat d'Ronn-Rees latency tëscht dem Client an Server fir all Client ass. All 5 Sekonnen verhandelt et eng nei Latenz mam Client wann néideg (baséiert op wéi d'Verbindung sech an der Vergaangenheet behuelen huet), an erhéicht oder reduzéiert d'Ronn-Rees Latenz entspriechend.

Eleng sinn dës Mechanismen ganz einfach, awer wann se zesumme benotzt ginn (wat dacks mat Verbindungsprobleemer geschitt), gëtt d'Logik vum Code schwéier ze verwalten a mat vill Randfäll. Zousätzlech, wann dës Mechanismen an d'Spill kommen, muss de Server an d'Verzögerungsschlaang déi speziell ëmsetzen Input Aktioun opgeruff StopMovementInTheNextTick. Dank dësem, wann et Problemer mat der Verbindung ass, wäert de Charakter net eleng lafen (zum Beispill virun engem Zuch).

Elo musse mir Iech erkläre wéi d'Entitéitsauswiel funktionnéiert. Ee vun den iwwerdroenen Typen Input Aktioun ass eng Ännerung am Entity Auswiel Staat. Et seet jidderengem op wéi eng Entitéit de Spiller schwieft. Wéi Dir Iech kënnt virstellen, ass dëst eng vun den heefegsten Inputaktiounen, déi vu Cliente geschéckt ginn, also fir Bandbreedung ze spueren, hu mir et optimiséiert fir sou wéineg Plaz wéi méiglech opzehuelen. De Wee wéi et funktionnéiert ass datt wéi all Entitéit ausgewielt gëtt, amplaz vun der absoluter, héichpräzis Kaart Koordinaten ze späicheren, späichert d'Spill eng niddereg Präzisioun relativ Offset vun der viregter Auswiel. Dëst funktionnéiert gutt well d'Mauswahlen éischter ganz no bei der viregter Auswiel sinn. Dëst stellt zwee wichteg Ufuerderungen op: Input Aktiounen Si sollten ni iwwersprangen a mussen an der korrekter Uerdnung ofgeschloss ginn. Dës Ufuerderunge sinn erfëllt fir Spill Staat. Mä zënter der Aufgab Latenzstaat an "gesinn gutt genuch" fir de Spiller, si sinn net zefridden am Retard Staat. Latenz Staat hëlt net Rechnung vill Rand Fäll, assoziéiert mat Iwwersprangen vun Auerzyklen a verännert Ronn-Rees Transmissioun Verspéidungen.

Dir kënnt scho roden, wou dat geet. Mir fänken endlech un d'Grënn fir de Megapack Problem ze gesinn. D'Wurzel vum Problem ass datt d'Entitéitsauswiel Logik op hänkt Latenz Staat, an dësem Staat enthält net ëmmer déi richteg Informatioun. Dofir gëtt e Megapacket sou eppes generéiert:

  1. D'Spiller huet Verbindung Problemer.
  2. Mechanismen fir d'Auerzyklen ze sprangen an d'Verspéidung vun der Ronn-Rees Iwwerdroung ze regelen kommen an d'Spill.
  3. D'Verspéidungsstaatschlaang hëlt dës Mechanismen net berücksichtegt. Dëst verursaacht datt e puer Aktiounen virzäiteg geläscht ginn oder an der falscher Uerdnung ausgeführt ginn, wat zu falschen Resultat féiert Latenz Staat.
  4. De Spiller huet e Verbindungsproblem an, fir de Server z'erreechen, simuléiert bis zu 400 Zyklen.
  5. Bei all Tick gëtt eng nei Aktioun, déi d'Entitéitsauswiel ännert, generéiert a virbereet fir op de Server ze schécken.
  6. De Client schéckt eng mega-Batch vun 400+ Entitéit Auswiel Ännerungen op de Server (a mat aneren Aktiounen: shooting Staaten, Spadséier- Staaten, etc. och aus dësem Problem leiden).
  7. De Server kritt 400 Inputaktiounen. Well et net erlaabt ass all Inputaktiounen ze iwwersprangen, bestallt et all Clienten dës Aktiounen auszeféieren a schéckt se iwwer d'Netz.

D'Ironie ass datt e Mechanismus entworf fir Bandbreedung ze spueren endlech enorm Netzwierkspäck erstallt huet.

Mir hunn dëst Thema adresséiert andeems mir all Randfäegkeete vun Update- a Backlog Queue Support fixéieren. Och wann et zimmlech vill Zäit gedauert huet, war et um Enn derwäert et richteg ze kréien anstatt op séier Hacks ze vertrauen.

Source: will.com

Setzt e Commentaire