Megapack: Sut y Datrysodd Factorio y Broblem Aml-chwaraewr 200-Chwaraewr

Megapack: Sut y Datrysodd Factorio y Broblem Aml-chwaraewr 200-Chwaraewr
Ym mis Mai eleni cymerais ran fel chwaraewr Digwyddiadau MMO KatherineOfSky. Sylwais pan fydd nifer y chwaraewyr yn cyrraedd nifer penodol, bob ychydig funudau mae rhai ohonyn nhw'n “syrthio i ffwrdd”. Yn ffodus i chi (ond nid i mi), roeddwn yn un o'r chwaraewyr hynny a ddatgysylltu bob amser, hyd yn oed gyda chysylltiad da. Cymerais hyn fel her bersonol a dechreuais chwilio am achosion y broblem. Ar ôl tair wythnos o ddadfygio, profi a thrwsio, cafodd y byg ei drwsio o'r diwedd, ond nid oedd y daith mor hawdd â hynny.

Mae'n anodd iawn olrhain problemau gyda gemau aml-chwaraewr. Maent fel arfer yn digwydd o dan baramedrau rhwydwaith penodol iawn ac amodau gêm penodol iawn (yn yr achos hwn, gyda mwy na 200 o chwaraewyr). A hyd yn oed pan ellir atgynhyrchu'r broblem, ni ellir ei dadfygio'n iawn oherwydd bod gosod torbwyntiau yn atal y gêm, yn drysu amseryddion, ac fel arfer yn achosi'r cysylltiad i amser allan. Ond diolch i ddyfalbarhad ac offeryn gwych o'r enw trwsgl Llwyddais i ddarganfod beth oedd yn digwydd.

Yn fyr, oherwydd nam a gweithrediad anghyflawn yr efelychiad cyflwr cudd, byddai'r cleient weithiau'n cael ei hun mewn sefyllfa lle roedd yn rhaid iddo anfon pecyn rhwydwaith yn cynnwys gweithredoedd dewis mewnbwn y chwaraewr o tua 400 o endidau gêm mewn un cylch cloc ( rydym yn galw hyn yn "mega-pecyn"). Rhaid i'r gweinydd wedyn nid yn unig dderbyn yr holl weithredoedd mewnbwn hyn yn gywir, ond hefyd eu hanfon at bob cleient arall. Os oes gennych chi 200 o gleientiaid, mae hyn yn dod yn broblem yn gyflym. Mae'r cyswllt â'r gweinydd yn mynd yn rhwystredig yn gyflym, gan arwain at golli pecynnau a rhaeadr o becynnau y gofynnir amdanynt eto. Mae gohirio'r mewnbwn wedyn yn achosi hyd yn oed mwy o gleientiaid i anfon megapacedi, gan achosi i'r eirlithriad ddod yn fwy fyth. Mae cleientiaid lwcus yn llwyddo i wella; mae'r lleill i gyd yn cwympo i ffwrdd.

Megapack: Sut y Datrysodd Factorio y Broblem Aml-chwaraewr 200-Chwaraewr
Roedd y broblem yn eithaf sylfaenol a chymerodd 2 wythnos i mi ei thrwsio. Mae'n eithaf technegol, felly byddaf yn esbonio'r manylion technegol llawn sudd isod. Ond yn gyntaf, mae angen i chi wybod, ers fersiwn 0.17.54, a ryddhawyd ar Fehefin 4, yn wyneb problemau cysylltiad dros dro, mae aml-chwaraewr wedi dod yn fwy sefydlog, ac mae cuddio oedi wedi dod yn llawer llai o fygi (llai o arafu a teleportio). Rwyf hefyd wedi newid y ffordd y mae oedi ymladd yn cael ei guddio ac rwy'n gobeithio y bydd hyn yn ei wneud ychydig yn llyfnach.

Pecyn Mega Multiplayer - Manylion Technegol

Yn syml, mae aml-chwaraewr mewn gêm yn gweithio fel hyn: mae pob cleient yn efelychu cyflwr y gêm, gan dderbyn ac anfon mewnbwn chwaraewr yn unig (a elwir yn “weithredoedd mewnbwn”, Mewnbwn Camau Gweithredu). Prif dasg y gweinydd yw trawsyrru Mewnbwn Camau Gweithredu a rheoli bod pob cleient yn cyflawni'r un gweithredoedd yn yr un cylch cloc. Gallwch ddarllen mwy am hyn yn y post FFF-149.

Gan fod yn rhaid i'r gweinydd wneud penderfyniadau ynghylch pa gamau i'w cyflawni, mae gweithredoedd y chwaraewr yn symud yn fras ar hyd y llwybr hwn: gweithred chwaraewr -> cleient gêm -> rhwydwaith -> gweinydd -> rhwydwaith -> cleient gêm. Mae hyn yn golygu bod gweithred pob chwaraewr yn cael ei berfformio dim ond ar ôl gwneud taith gron ar draws y rhwydwaith. Oherwydd hyn, byddai'r gêm yn ymddangos yn ofnadwy o araf, felly bron yn syth ar ôl cyflwyno aml-chwaraewr yn y gêm, cyflwynwyd mecanwaith i guddio oedi. Mae cuddio oedi yn efelychu mewnbwn chwaraewr heb ystyried gweithredoedd chwaraewyr eraill a phenderfyniadau'r gweinydd.

Megapack: Sut y Datrysodd Factorio y Broblem Aml-chwaraewr 200-Chwaraewr
Mae gan factorio gyflwr gêm Cyflwr Gêm yw cyflwr cyflawn y cerdyn, chwaraewr, endidau a phopeth arall. Mae'n cael ei efelychu'n benderfynol ym mhob cleient yn seiliedig ar y gweithredoedd a dderbyniwyd gan y gweinydd. Mae cyflwr gêm yn gysegredig, ac os bydd byth yn dechrau gwahaniaethu oddi wrth y gweinydd neu unrhyw gleient arall, yna mae dadsyncroneiddio'n digwydd.

Ond Cyflwr Gêm mae gennym gyflwr o oedi Cyflwr Cudd. Mae'n cynnwys is-set bach o gyflwr y ddaear. Cyflwr Cudd ddim yn sanctaidd ac yn syml yn cynrychioli darlun o sut olwg fydd ar gyflwr y gêm yn y dyfodol yn seiliedig ar fewnbynnau chwaraewr Mewnbwn Camau Gweithredu.

At y diben hwn, rydym yn storio copi o'r rhai a grëwyd Mewnbwn Camau Gweithredu yn y ciw oedi.

Megapack: Sut y Datrysodd Factorio y Broblem Aml-chwaraewr 200-Chwaraewr
Hynny yw, ar ddiwedd y broses ar ochr y cleient mae'r llun yn edrych fel hyn:

  1. Rydym yn gwneud cais Mewnbwn Camau Gweithredu holl chwaraewyr i Cyflwr Gêm y ffordd y derbyniwyd y gweithredoedd mewnbwn hyn gan y gweinydd.
  2. Rydyn ni'n tynnu popeth o'r ciw oedi Mewnbwn Camau Gweithredu, sydd, yn ol y gweinydd, eisoes wedi eu cymhwyso i Cyflwr Gêm.
  3. Dileu Cyflwr Cudd a'i ailosod fel ei fod yn edrych yn union yr un fath â Cyflwr Gêm.
  4. Rydym yn gweithredu pob cam o'r ciw oedi i Cyflwr Cudd.
  5. Yn seiliedig ar ddata Cyflwr Gêm и Cyflwr Cudd Rydyn ni'n trosglwyddo'r gêm i'r chwaraewr.

Mae hyn i gyd yn cael ei ailadrodd ym mhob mesur.

Rhy anodd? Peidiwch ag ymlacio, nid dyma'r cyfan. I wneud iawn am gysylltiadau Rhyngrwyd annibynadwy, rydym wedi creu dau fecanwaith:

  • Ticiau a gollwyd: pan fydd y gweinydd yn penderfynu hynny Mewnbwn Camau Gweithredu yn cael ei ddienyddio ar guriad y gêm, yna os na dderbyniodd Mewnbwn Camau Gweithredu rhyw chwaraewr (er enghraifft, oherwydd oedi cynyddol), ni fydd yn aros, ond bydd yn hysbysu'r cleient hwn “Wnes i ddim ystyried eich Mewnbwn Camau Gweithredu, byddaf yn ceisio eu hychwanegu yn y bar nesaf. ” Gwneir hyn fel nad yw diweddariad map yn arafu i bawb arall oherwydd problemau gyda chysylltiad (neu gyfrifiadur) un chwaraewr. Mae'n werth nodi hynny Mewnbwn Camau Gweithredu yn cael eu hanwybyddu, ond yn hytrach eu rhoi o'r neilltu.
  • Cywirdeb taith gron lawn: Mae'r gweinydd yn ceisio dyfalu beth yw'r hwyrni taith gron rhwng y cleient a'r gweinydd ar gyfer pob cleient. Bob 5 eiliad, mae'n negodi hwyrni newydd gyda'r cleient os oes angen (yn seiliedig ar sut mae'r cysylltiad wedi ymddwyn yn y gorffennol), ac yn cynyddu neu'n lleihau'r hwyrni taith gron yn unol â hynny.

Ar eu pen eu hunain, mae'r mecanweithiau hyn yn eithaf syml, ond pan gânt eu defnyddio gyda'i gilydd (sy'n aml yn digwydd gyda phroblemau cysylltiad), mae rhesymeg y cod yn dod yn anodd ei reoli a chyda llawer o achosion ymyl. Yn ogystal, pan ddaw'r mecanweithiau hyn i rym, rhaid i'r gweinydd a'r ciw oedi weithredu'r arbennig yn iawn Mewnbwn Gweithredu o'r enw StopMovementInTheNextTick. Diolch i hyn, os oes problemau gyda'r cysylltiad, ni fydd y cymeriad yn rhedeg ar ei ben ei hun (er enghraifft, o flaen trên).

Nawr mae angen i ni esbonio i chi sut mae dewis endid yn gweithio. Un o'r mathau a drosglwyddir Mewnbwn Gweithredu yn newid yn y cyflwr dethol endid. Mae'n dweud wrth bawb pa endid mae'r chwaraewr yn hofran drosodd. Fel y gallwch ddychmygu, dyma un o'r gweithredoedd mewnbwn mwyaf cyffredin a anfonir gan gleientiaid, felly er mwyn arbed lled band, rydym wedi ei optimeiddio i gymryd cyn lleied o le â phosibl. Y ffordd y mae'n gweithio yw, wrth i bob endid gael ei ddewis, yn lle storio cyfesurynnau map absoliwt, manwl uchel, mae'r gêm yn storio gwrthbwyso cymharol fanwl-isel o'r dewis blaenorol. Mae hyn yn gweithio'n dda oherwydd bod dewisiadau llygoden yn tueddu i fod yn agos iawn at y dewis blaenorol. Mae hyn yn codi dau ofyniad pwysig: Mewnbwn Camau Gweithredu Ni ddylid byth eu hepgor a rhaid eu cwblhau yn y drefn gywir. Bodlonir y gofynion hyn ar gyfer Cyflwr Gêm. Ond ers y dasg Cyflwr latency yn "edrych yn ddigon da" ar gyfer y chwaraewr, nid ydynt yn fodlon yn y cyflwr oedi. Cyflwr Cudd nid yw'n cymryd i ystyriaeth llawer o achosion ymyl, sy'n gysylltiedig â sgipio cylchoedd cloc a newid oedi trosglwyddo rownd-daith.

Gallwch chi eisoes ddyfalu i ble mae hyn yn mynd. Rydym o'r diwedd yn dechrau gweld y rhesymau dros y broblem megapack. Gwraidd y broblem yw bod y rhesymeg dewis endid yn dibynnu ar Cyflwr Cudd, ac nid yw'r cyflwr hwn bob amser yn cynnwys y wybodaeth gywir. Felly, mae megapacket yn cael ei gynhyrchu rhywbeth fel hyn:

  1. Mae gan y chwaraewr broblemau cysylltiad.
  2. Mae mecanweithiau ar gyfer sgipio cylchoedd cloc a rheoleiddio oedi trosglwyddo taith gron yn dod i rym.
  3. Nid yw'r ciw cyflwr oedi yn cymryd y mecanweithiau hyn i ystyriaeth. Mae hyn yn achosi i rai gweithredoedd gael eu tynnu'n gynamserol neu eu perfformio yn y drefn anghywir, gan arwain at anghywir Cyflwr Cudd.
  4. Mae gan y chwaraewr broblem cysylltiad ac, er mwyn dal i fyny â'r gweinydd, mae'n efelychu hyd at 400 o gylchoedd.
  5. Ar bob tic, mae gweithred newydd, sy'n newid y dewis endid, yn cael ei gynhyrchu a'i baratoi i'w anfon at y gweinydd.
  6. Mae'r cleient yn anfon mega-swp o 400+ o newidiadau dewis endid i'r gweinydd (a chyda chamau gweithredu eraill: dywed saethu, gwladwriaethau cerdded, ac ati hefyd yn dioddef o'r broblem hon).
  7. Mae'r gweinydd yn derbyn 400 o gamau mewnbwn. Gan na chaniateir iddo hepgor unrhyw gamau mewnbwn, mae'n gorchymyn i bob cleient gyflawni'r gweithredoedd hynny a'u hanfon ar draws y rhwydwaith.

Yr eironi yw bod mecanwaith a ddyluniwyd i arbed lled band wedi creu pecynnau rhwydwaith enfawr yn y pen draw.

Aethom i'r afael â'r mater hwn trwy drwsio pob achos ymyl o ddiweddariad a chefnogaeth ciw sydd wedi cronni. Er iddo gymryd cryn dipyn o amser, yn y diwedd roedd yn werth ei gael yn iawn yn hytrach na dibynnu ar haciau cyflym.

Ffynhonnell: hab.com

Ychwanegu sylw