Megapack: Kif Factorio Solva l-Problema Multiplayer ta' 200 plejer

Megapack: Kif Factorio Solva l-Problema Multiplayer ta' 200 plejer
F’Mejju ta’ din is-sena, ipparteċipajt bħala plejer KatherineOfSky MMO Avvenimenti. Innutajt li meta n-numru ta’ plejers jilħaq ċertu numru, kull ftit minuti xi wħud minnhom “jaqgħu”. Fortunatament għalik (imma mhux għalija), kont wieħed minn dawk il-plejers kull darbaanke b'konnessjoni tajba. Ħadtha bħala sfida personali u bdejt infittex il-kawżi tal-problema. Wara tliet ġimgħat ta 'debugging, ittestjar, u l-iffissar, il-bug huwa finalment iffissat, iżda l-vjaġġ ma kienx daqshekk faċli.

Problemi fil-logħob multiplayer huma diffiċli ħafna biex jintraċċaw. Normalment iseħħu taħt parametri tan-netwerk speċifiċi ħafna u taħt stati tal-logħob speċifiċi ħafna (f'dan il-każ, aktar minn 200 plejer). U anki meta problema tista 'tiġi riprodotta, ma tistax tiġi debugged kif suppost minħabba li ddaħħal breakpoints twaqqaf il-logħba, tħawwad it-tajmers, u ġeneralment tikkawża l-konnessjoni għal time out minħabba timeout. Iżda grazzi għall-perseveranza u għodda mill-isbaħ imsejħa goff Stajt nifhem x’inhu għaddej.

Fil-qosor, minħabba bug u implimentazzjoni mhux kompluta tas-simulazzjoni tal-istat tad-dewmien, il-klijent kultant sab ruħu f'sitwazzjoni fejn kellu jibgħat pakkett tan-netwerk f'ċiklu wieħed tal-arloġġ, li jikkonsisti f'azzjonijiet ta' input tal-plejer għall-għażla ta' madwar 400 entità tal-logħob ( nsejħulha "megapacket"). Wara dan, is-server mhux biss jeħtieġ li jirċievi b'mod korrett dawn l-azzjonijiet kollha ta 'input, iżda wkoll jibgħathom lill-klijenti l-oħra kollha. Jekk għandek 200 klijent, dan malajr isir problema. Il-kanal għas-server malajr isir misdud, li jirriżulta f'pakketti mitlufa u kaskata ta 'pakketti mitluba mill-ġdid. Il-posponiment ta 'azzjonijiet ta' input imbagħad jikkawża li aktar klijenti jibdew jibagħtu megapakketti, u l-valanga tagħhom issir saħansitra aktar b'saħħitha. Klijenti ta 'suċċess jirnexxilhom jirkupraw, il-bqija kollha jaqgħu barra.

Megapack: Kif Factorio Solva l-Problema Multiplayer ta' 200 plejer
Il-problema kienet pjuttost fundamentali, u ħadt ġimagħtejn biex nirranġaha. Huwa pjuttost tekniku, għalhekk nispjega d-dettalji tekniċi mmerraq hawn taħt. Imma l-ewwel, trid tkun taf li mill-verżjoni 2, rilaxxata fl-0.17.54 ta 'Ġunju, quddiem problemi temporanji ta' konnessjoni, multiplayer sar aktar stabbli, u l-ħabi ta 'dewmien huwa ħafna inqas buggy (inqas ibbrejkjar u teleporting). Barra minn hekk, biddilt il-mod kif id-dewmien fil-ġlieda kontra huwa moħbi, u nisperaw li dan jagħmilhom ftit aktar faċli.

Multiplayer Mega Pack - Dettalji Tekniċi

Fi kliem sempliċi, multiplayer f'logħba jaħdem bħal dan: il-klijenti kollha jissimulaw l-istat tal-logħba billi jirċievu u jibagħtu biss input tal-plejers (imsejħa "azzjonijiet ta' input" Azzjonijiet ta' Input). Il-kompitu ewlieni tas-server huwa li jittrasferixxi Azzjonijiet ta' Input u l-iżgurar li l-klijenti kollha jwettqu l-istess azzjonijiet fl-istess ċiklu. Tista' taqra aktar dwar dan fil-post. FFF-149.

Peress li s-server irid jieħu deċiżjonijiet dwar liema azzjonijiet għandu jieħu, l-azzjonijiet tal-plejer jimxu tul it-triq li ġejja: azzjoni tal-plejer -> klijent tal-logħob -> netwerk -> server -> netwerk -> klijent tal-logħob. Dan ifisser li kull azzjoni tal-plejer titwettaq biss wara li jkun għamel triq bir-ritorn min-netwerk. Minħabba dan, il-logħba kienet tidher bil-mod terriblement, għalhekk kważi immedjatament wara l-apparenza ta 'multiplayer fil-logħba, ġie introdott mekkaniżmu għall-ħabi tad-dewmien. Il-ħabi tal-latency jissimula l-input tal-plejer mingħajr ma jiġu kkunsidrati l-azzjonijiet ta 'plejers oħra u t-teħid tad-deċiżjonijiet tas-server.

Megapack: Kif Factorio Solva l-Problema Multiplayer ta' 200 plejer
Factorio għandu stat ta' logħba stat tal-logħba huwa l-istat sħiħ tal-mappa, plejer, entitajiet, u kull ħaġa oħra. Huwa simulat b'mod deterministiku fil-klijenti kollha bbażati fuq azzjonijiet riċevuti mis-server. L-istat tal-logħba huwa sagru, u jekk qatt jibda jvarja mis-server jew kwalunkwe klijent ieħor, allura sseħħ desinkronizzazzjoni.

Imma stat tal-logħba għandna stat ta' dewmien Stat ta' latenza. Fiha subsett żgħir tal-istat prinċipali. Stat ta' latenza mhix sagra u tirrappreżenta biss stampa ta' kif se tidher l-istat tal-logħba fil-futur ibbażata fuq l-inputs mill-plejer Azzjonijiet ta' Input.

Biex tagħmel dan, inżommu kopja tal-ġenerat Azzjonijiet ta' Input fil-kju tad-dewmien.

Megapack: Kif Factorio Solva l-Problema Multiplayer ta' 200 plejer
Jiġifieri, fl-aħħar tal-proċess fuq in-naħa tal-klijent, l-istampa tidher xi ħaġa bħal din:

  1. Applika Azzjonijiet ta' Input plejers kollha biex stat tal-logħba il-mod kif dawn l-azzjonijiet ta' input ġew riċevuti mis-server.
  2. Neħħi kollox mill-kju tad-dewmien Azzjonijiet ta' Input, li, skont is-server, diġà ġew applikati għalihom stat tal-logħba.
  3. Ħassar Stat ta' latenza u reset hekk jidher eżattament l-istess bħal stat tal-logħba.
  4. Applika l-azzjonijiet kollha mill-kju tad-dewmien għal Stat ta' latenza.
  5. Ibbażat fuq data stat tal-logħba и Stat ta' latenza jagħti l-logħba lill-plejer.

Dan kollu huwa ripetut f'kull miżura.

Wisq diffiċli? Tirrilassax, dan mhux kollox. Biex nikkumpensaw għal konnessjonijiet tal-Internet mhux affidabbli, ħloqna żewġ mekkaniżmi:

  • Qurdien maqbuża: meta s-server jiddeċiedi li Azzjonijiet ta' Input se jiġi esegwit fil-tatt tal-logħba, allura jekk ma jkunx irċieva Azzjonijiet ta' Input xi plejer (pereżempju, minħabba dewmien akbar), mhux se jistenna, iżda jinforma lil dan il-klijent "Ma qistx tiegħek Azzjonijiet ta' Input, ser nipprova nżidhom fil-bar li jmiss. Dan isir sabiex minħabba problemi bil-konnessjoni (jew mal-kompjuter) ta 'plejer wieħed, l-aġġornament tal-mappa ma jonqosx għal kulħadd. Ta’ min jinnota li Azzjonijiet ta' Input mhumiex injorati, iżda sempliċement posposti.
  • Latenza sħiħa ta 'round-trip: Is-server jipprova raden x'inhi l-latency ta' round-trip bejn il-klijent u s-server għal kull klijent. Kull 5 sekondi, tinnegozja dewmien ġdid mal-klijent kif meħtieġ (skond kif il-konnessjoni ġabet ruħha fil-passat), u żżid jew tnaqqas id-dewmien tal-vjaġġ bir-ritorn kif xieraq.

Waħedhom, dawn il-mekkaniżmi huma pjuttost sempliċi, iżda meta jintużaw flimkien (li spiss jiġri bi problemi ta 'konnessjoni), il-loġika tal-kodiċi ssir diffiċli biex timmaniġġjaha u b'ħafna każijiet edge. Barra minn hekk, meta dawn il-mekkaniżmi jidħlu fis-seħħ, is-server u l-kju tad-dewmien għandhom jimplimentaw b'mod korrett speċjali Azzjoni ta' Input taħt l-isem StopMovementInTheNextTick. Grazzi għal dan, f'każ ta 'problemi ta' konnessjoni, il-karattru mhux se jimxi waħdu (per eżempju, taħt ferrovija).

Issa għandi bżonn nispjegalek kif taħdem l-għażla tal-entità. Wieħed mit-tipi mgħoddija Azzjoni ta' Input hija bidla fl-istat tal-għażla ta' entità. Jgħid lil kulħadd fuq liema entità l-plejer mexxa bil-maws. Kif tistgħu taraw, din hija waħda mill-azzjonijiet ta 'input l-aktar frekwenti mibgħuta mill-klijenti, għalhekk biex tiffranka l-bandwidth, ottimizzajna biex tieħu l-inqas spazju possibbli. Dan huwa implimentat hekk: meta tintgħażel kull entità, minflok taħżen koordinati assoluti tal-mappa ta 'preċiżjoni għolja, il-logħba taħżen offset relattiv ta' preċiżjoni baxxa mill-għażla preċedenti. Dan jaħdem tajjeb minħabba li l-għażla tal-maws normalment isseħħ qrib ħafna tal-għażla preċedenti. Dan jagħti lok għal żewġ rekwiżiti importanti: Azzjonijiet ta' Input qatt m'għandu jinqabeż u għandu jsir fl-ordni korretta. Dawn ir-rekwiżiti huma sodisfatti għal stat tal-logħba. Iżda peress li l-kompitu stat ta' latenza fil-"looking tajba biżżejjed" għall-plejer, ma jkunux sodisfatti fl-istat ta 'dewmien. Stat ta' latenza ma jqisx ħafna każijiet tal-fruntieraassoċjati ma' jaqbeż l-arloġġi u jinbidlu d-dewmien tat-trażmissjoni bir-ritorn.

Inti tista 'diġà raden fejn dan sejjer. Fl-aħħarnett, qed nibdew naraw il-kawżi tal-problema tal-megapackage. L-għerq tal-problema hija li l-loġika tal-għażla tal-entità tiddependi fuqha Stat ta' latenza, u dan l-istat mhux dejjem ikun fih l-informazzjoni korretta. Allura l-megapacket huwa ġġenerat bħal dan:

  1. Il-plejer qed jesperjenza problemi ta 'konnessjoni.
  2. Jidħlu fis-seħħ il-mekkaniżmi biex taqbeż iċ-ċikli u r-regolazzjoni tad-dewmien tat-trażmissjoni bir-ritorn.
  3. Il-kju tal-istat tad-dewmien ma jagħtix kont għal dawn il-mekkaniżmi. Dan jikkawża li xi azzjonijiet jitneħħew qabel iż-żmien jew jitmexxew f'ordni ħażina, u dan jirriżulta f'mod żbaljat Stat ta' latenza.
  4. Il-plejer m'għandu l-ebda problema ta 'konnessjoni u jissimula sa 400 ċiklu biex ilaħħaq mas-server.
  5. F'kull ċiklu, azzjoni ġdida tiġi ġġenerata u ppreparata biex tintbagħat lis-server, u tibdel l-għażla tal-entità.
  6. Il-klijent jibgħat megapacket ta '400+ tibdil ta' għażla ta 'entità lis-server (u ma' azzjonijiet oħra: stat ta 'sparar, stat ta' mixi, eċċ ukoll sofrew minn din il-problema).
  7. Is-server jirċievi 400 azzjoni ta 'input. Peress li mhux permess li taqbeż azzjoni waħda ta 'input, tagħti struzzjonijiet lill-klijenti kollha biex iwettqu dawn l-azzjonijiet u tibgħathom fuq in-netwerk.

L-ironija hija li mekkaniżmu ddisinjat biex jikkonserva bandwidth irriżulta f'pakketti tan-netwerk enormi.

Aħna solvejna din il-kwistjoni billi rranġajna l-każijiet kollha tat-tarf tal-aġġornament u l-appoġġ tad-dewmien tal-kju. Għalkemm ħadu żmien mhux ħażin, kien ta 'min iġibu tajjeb fl-aħħar aktar milli tiddependi fuq hacks ta' malajr.

Sors: www.habr.com

Żid kumment