Megapack: Hvernig Factorio leysti 200 spila fjölspilunarvandann

Megapack: Hvernig Factorio leysti 200 spila fjölspilunarvandann
Í maí á þessu ári tók ég þátt sem leikmaður í MMO viðburðir KatherineOfSky. Ég tók eftir því að þegar fjöldi leikmanna nær ákveðnum fjölda, þá „falla“ sumir af þeim á nokkurra mínútna fresti. Til allrar hamingju fyrir þig (en ekki fyrir mig) var ég einn af þessum leikmönnum sem aftengdu í hvert skipti, jafnvel með góðri tengingu. Ég tók þessu sem persónulegri áskorun og fór að leita að orsökum vandans. Eftir þrjár vikur af villuleit, prófunum og lagfæringum var villan loksins lagfærð, en ferðin var ekki svo auðveld.

Vandamál með fjölspilunarleiki eru mjög erfitt að elta uppi. Þeir eiga sér stað venjulega undir mjög sérstökum netbreytum og mjög sérstökum leikskilyrðum (í þessu tilfelli, með fleiri en 200 leikmenn). Og jafnvel þegar hægt er að endurskapa vandamálið er ekki hægt að kemba það almennilega vegna þess að innsetning brotpunkta stoppar leikinn, ruglar tímamæla og veldur venjulega því að tengingin hættir. En þökk sé þrautseigju og dásamlegt tól sem heitir klaufalegur Mér tókst að komast að því hvað var í gangi.

Í stuttu máli, vegna villu og ófullkominnar útfærslu á leyndstöðuhermun, lendir viðskiptavinurinn stundum í aðstæðum þar sem hann þurfti að senda netpakka sem samanstóð af inntaksvalsaðgerðum leikmannsins á um það bil 400 leikeiningum í einni klukkulotu ( við köllum þetta „mega-pakka“). Miðlarinn verður þá ekki aðeins að taka á móti öllum þessum inntaksaðgerðum á réttan hátt, heldur einnig að senda þær til allra annarra viðskiptavina. Ef þú ert með 200 viðskiptavini verður þetta fljótt vandamál. Hlekkurinn á netþjóninn stíflast fljótt, sem leiðir til pakkataps og flæðis af pökkum sem beðið er um aftur. Að seinka inntaksaðgerðinni veldur því að enn fleiri viðskiptavinir senda megapakka, sem veldur því að snjóflóðið verður enn stærra. Heppnir viðskiptavinir ná að jafna sig; allir hinir detta af.

Megapack: Hvernig Factorio leysti 200 spila fjölspilunarvandann
Vandamálið var mjög grundvallaratriði og það tók mig 2 vikur að laga það. Það er frekar tæknilegt, svo ég mun útskýra safaríkar tæknilegar upplýsingar hér að neðan. En fyrst þarftu að vita að síðan útgáfa 0.17.54, gefin út 4. júní, í ljósi tímabundinna tengingarvandamála, hefur fjölspilunin orðið stöðugri og tafir í felum hafa orðið mun minna gallalausar (minna hægagangur og fjarflutningur). Ég hef líka breytt því hvernig bardagatöf er falin og ég vona að þetta muni gera það aðeins sléttara.

Multiplayer Mega Pakki - Tæknilegar upplýsingar

Til að setja það einfaldlega, fjölspilun í leik virkar svona: allir viðskiptavinir líkja eftir stöðu leiksins, taka á móti og senda aðeins inntak frá spilara (kallaðar „inntaksaðgerðir“, Inntaksaðgerðir). Aðalverkefni þjónsins er að flytja Inntaksaðgerðir og stjórna því að allir viðskiptavinir framkvæmi sömu aðgerðir í sömu klukkulotu. Þú getur lesið meira um þetta í færslunni FFF-149.

Þar sem þjónninn verður að taka ákvarðanir um hvaða aðgerðir á að framkvæma, fara aðgerðir leikmannsins um það bil eftir þessari braut: spilaraaðgerð -> leikjaviðskiptavinur -> net -> netþjónn -> net -> leikjaviðskiptavinur. Þetta þýðir að aðgerð hvers leikmanns er aðeins framkvæmd eftir að hafa farið hringferð um netið. Vegna þessa virtist leikurinn hræðilega hægur, þannig að næstum strax eftir að fjölspilunarleikurinn var kynntur í leiknum var komið á kerfi til að fela tafir. Að fela seinkun líkir eftir inntaki leikmanna án þess að taka tillit til aðgerða annarra leikmanna og ákvarðana þjónsins.

Megapack: Hvernig Factorio leysti 200 spila fjölspilunarvandann
Factorio er með leikástand Leikríki er heildarástand kortsins, leikmannsins, aðila og alls annars. Það er hermt eftir ákveðnum hætti í öllum viðskiptavinum byggt á aðgerðum sem berast frá þjóninum. Leikjaástand er heilagt og ef það byrjar einhvern tíma að vera frábrugðið þjóninum eða öðrum viðskiptavinum, þá á sér stað samstilling.

En Leikríki við erum með tafir Biðtími. Það inniheldur lítið hlutmengi af grunnástandi. Biðtími ekki heilagt og táknar einfaldlega mynd af því hvernig ástand leiksins mun líta út í framtíðinni byggt á inntakum leikmanna Inntaksaðgerðir.

Í þessu skyni geymum við afrit af búið Inntaksaðgerðir í biðröð.

Megapack: Hvernig Factorio leysti 200 spila fjölspilunarvandann
Það er að segja að í lok ferlisins á viðskiptavini megin lítur myndin eitthvað svona út:

  1. Sækja um Inntaksaðgerðir allir leikmenn til Leikríki hvernig þessar inntaksaðgerðir voru mótteknar frá þjóninum.
  2. Við fjarlægjum allt úr biðröðinni Inntaksaðgerðir, sem samkvæmt þjóninum hefur þegar verið beitt á Leikríki.
  3. Eyða Biðtími og endurstilla það þannig að það líti nákvæmlega eins út og Leikríki.
  4. Við beitum öllum aðgerðum frá biðröð til Biðtími.
  5. Byggt á gögnum Leikríki и Biðtími Við gefum leikmanninum leikinn.

Allt þetta er endurtekið í hverjum mæli.

Of erfitt? Ekki slaka á, þetta er ekki allt. Til að bæta upp fyrir óáreiðanlegar nettengingar höfum við búið til tvær leiðir:

  • Misst af merkjum: þegar þjónninn ákveður það Inntaksaðgerðir verður framkvæmt á slagi leiksins, þá ef hann fékk ekki Inntaksaðgerðir einhver leikmaður (td vegna aukinnar seinkun), mun hann ekki bíða, heldur mun hann láta þennan viðskiptavin vita: „Ég tók ekki tillit til þín Inntaksaðgerðir, ég mun reyna að bæta þeim við í næstu stiku.“ Þetta er gert til þess að vegna vandamála með tengingu (eða tölvu) eins spilara hægist ekki á kortauppfærslunni hjá öllum öðrum. Það er rétt að taka það fram Inntaksaðgerðir eru ekki hunsuð, heldur einfaldlega lögð til hliðar.
  • Full töf fram og til baka: Miðlarinn reynir að giska á hver töfin fram og til baka á milli biðlara og netþjóns er fyrir hvern viðskiptavin. Á 5 sekúndna fresti semur það um nýja leynd við viðskiptavininn ef nauðsyn krefur (miðað við hvernig tengingin hefur hegðað sér áður) og eykur eða minnkar biðtímann fram og til baka í samræmi við það.

Ein og sér eru þessi kerfi frekar einföld, en þegar þau eru notuð saman (sem gerist oft með tengingarvandamálum) verður rökfræði kóðans erfið í stjórnun og með mikið af brúntilfellum. Að auki, þegar þessir aðferðir koma við sögu, verða þjónninn og seinkunarröðin að útfæra sérstakan rétt Inntaksaðgerð kallað StopMovementInTheNextTick. Þökk sé þessu, ef það eru vandamál með tenginguna, mun persónan ekki keyra á eigin spýtur (til dæmis fyrir framan lest).

Nú þurfum við að útskýra fyrir þér hvernig einingarval virkar. Ein af sendum gerðum Inntaksaðgerð er breyting á stöðu einingarvals. Það segir öllum hvaða aðila spilarinn sveimar yfir. Eins og þú getur ímyndað þér er þetta ein algengasta inntaksaðgerðin sem send er af viðskiptavinum, svo til að spara bandbreidd höfum við fínstillt hana til að taka eins lítið pláss og mögulegt er. Leiðin sem það virkar er að þar sem hver eining er valin, í stað þess að geyma alger, hárnákvæm kortahnit, geymir leikurinn lágnákvæma hlutfallslega offset frá fyrra vali. Þetta virkar vel vegna þess að músaval hefur tilhneigingu til að vera mjög nálægt fyrra vali. Þetta vekur upp tvær mikilvægar kröfur: Inntaksaðgerðir Aldrei má sleppa þeim og þarf að fylla út í réttri röð. Þessar kröfur eru uppfylltar fyrir Leikríki. En þar sem verkefnið Biðtími þegar þeir „líta nógu vel út“ fyrir leikmanninn eru þeir ekki sáttir í seinkuninni. Biðtími tekur ekki tillit til mörg kantmál, sem tengist því að sleppa klukkulotum og breyta seinkun á sendingu fram og til baka.

Þú getur nú þegar giskað á hvert þetta stefnir. Við erum loksins farin að sjá ástæðurnar fyrir megapack vandamálinu. Rót vandans er sú að rökfræði einingavals byggir á Biðtími, og þetta ástand inniheldur ekki alltaf réttar upplýsingar. Þess vegna er megapakki búið til eitthvað á þessa leið:

  1. Spilarinn á við tengingarvandamál að stríða.
  2. Aðferðir til að sleppa klukkulotum og stjórna seinkun á sendingu fram og til baka koma við sögu.
  3. Seinkunarstaðaröðin tekur ekki tillit til þessara aðferða. Þetta veldur því að sumar aðgerðir eru fjarlægðar of snemma eða gerðar í rangri röð, sem leiðir til rangra Biðtími.
  4. Spilarinn á við tengingarvandamál að stríða og líkir eftir allt að 400 lotum til að ná í netþjóninn.
  5. Við hverja hak er ný aðgerð, sem breytir vali eininga, búin til og undirbúin til sendingar á netþjóninn.
  6. Viðskiptavinurinn sendir mega-lotu af 400+ einingarvalsbreytingum á netþjóninn (og með öðrum aðgerðum: myndatökuástand, gangandi ástand osfrv. Þjáðist einnig af þessu vandamáli).
  7. Miðlarinn fær 400 inntaksaðgerðir. Þar sem það er ekki heimilt að sleppa neinum innsláttaraðgerðum skipar það öllum viðskiptavinum að framkvæma þessar aðgerðir og sendir þær yfir netið.

Kaldhæðnin er sú að vélbúnaður sem er hannaður til að spara bandbreidd endaði með því að búa til risastóra netpakka.

Við tókum á þessu vandamáli með því að laga öll jaðartilfelli af uppfærslu- og baksíðustuðningi. Þrátt fyrir að það hafi tekið töluverðan tíma, þá var á endanum þess virði að gera það rétt frekar en að reiða sig á fljótleg innbrot.

Heimild: www.habr.com

Bæta við athugasemd