Megapack: Giunsa Pagsulbad sa Factorio ang 200-Player Multiplayer Problem

Megapack: Giunsa Pagsulbad sa Factorio ang 200-Player Multiplayer Problem
Niadtong Mayo ning tuiga miapil ko isip player sa Mga panghitabo sa MMO KatherineOfSky. Namatikdan nako nga kung ang gidaghanon sa mga magdudula moabut sa usa ka piho nga numero, matag pipila ka minuto ang pipila kanila "mahulog". Swerte para nimo (pero dili para nako), usa ko sa mga player nga nadisconnect sa matag higayon, bisan sa maayo nga koneksyon. Giisip nako kini isip usa ka personal nga hagit ug nagsugod sa pagpangita sa mga hinungdan sa problema. Human sa tulo ka semana sa pag-debug, pagsulay, ug pag-ayo, ang bug sa katapusan naayo, apan ang panaw dili kaayo sayon.

Ang mga problema sa multiplayer nga mga dula lisud kaayo nga masubay. Kasagaran kini mahitabo sa ilawom sa piho nga mga parameter sa network ug piho nga mga kondisyon sa dula (sa kini nga kaso, adunay labaw pa sa 200 nga mga magdudula). Ug bisan kung ang problema mahimo nga kopyahon, kini dili ma-debug sa husto tungod kay ang pagsulud sa mga breakpoints mohunong sa dula, makalibog sa mga timer, ug kasagaran hinungdan sa koneksyon sa oras. Apan salamat sa pagpadayon ug usa ka talagsaon nga himan nga gitawag clumsy Nahibal-an nako kung unsa ang nahitabo.

Sa laktud, tungod sa usa ka bug ug dili kompleto nga pagpatuman sa latency state simulation, ang kliyente usahay makit-an ang kaugalingon sa usa ka sitwasyon diin kinahanglan nga magpadala usa ka network packet nga naglangkob sa mga aksyon sa pagpili sa input sa player nga gibana-bana nga 400 nga mga entidad sa dula sa usa ka siklo sa orasan ( gitawag nato kini nga "mega-packet"). Ang server kinahanglan dili lamang makadawat sa tanan niini nga mga aksyon sa pag-input sa husto, apan ipadala usab kini sa tanan nga uban pang mga kliyente. Kung ikaw adunay 200 nga mga kliyente, kini dali nga nahimong problema. Ang link sa server dali nga nabara, nga nagdala sa pagkawala sa pakete ug usa ka kaskad sa gihangyo nga mga pakete. Ang paglangan sa aksyon sa pag-input unya hinungdan sa daghang mga kliyente nga magpadala mga megapacket, hinungdan nga ang avalanche mahimong labi ka dako. Ang mga swerteng kliyente nakahimo sa pag-ayo; ang tanan nga uban nahulog.

Megapack: Giunsa Pagsulbad sa Factorio ang 200-Player Multiplayer Problem
Ang problema kay sukaranan kaayo ug gikuha nako ang 2 ka semana aron ayohon kini. Kini medyo teknikal, mao nga akong ipasabut ang juicy teknikal nga mga detalye sa ubos. Apan una, kinahanglan nimong masayran nga sukad sa bersyon 0.17.54, nga gipagawas kaniadtong Hunyo 4, atubangan sa temporaryo nga mga problema sa koneksyon, ang multiplayer nahimong mas lig-on, ug ang pagtago sa mga paglangan nahimong dili kaayo buggy (dili kaayo hinay ug teleporting). Gibag-o usab nako ang paagi sa pagtago sa combat lag ug nanghinaut ko nga kini makapaayo niini.

Multiplayer Mega Pack - Mga Detalye sa Teknikal

Sa yano nga pagkasulti, ang multiplayer sa usa ka dula molihok sama niini: ang tanan nga mga kliyente nagsundog sa kahimtang sa dula, nakadawat ug nagpadala lamang sa input sa magdudula (gitawag nga "mga aksyon sa pag-input", Mga Aksyon sa Pag-input). Ang nag-unang tahas sa server mao ang pagpadala Mga Aksyon sa Pag-input ug kontrola nga ang tanan nga mga kliyente naghimo sa parehas nga mga aksyon sa parehas nga siklo sa orasan. Mahimo nimong mabasa ang dugang bahin niini sa post FFF-149.

Tungod kay ang server kinahanglan nga mohimo og mga desisyon mahitungod sa unsa nga mga aksyon nga buhaton, ang mga aksyon sa player mobalhin gibana-bana sa niini nga dalan: player aksyon -> duwa kliyente -> network -> server -> network -> duwa kliyente. Kini nagpasabot nga ang aksyon sa matag magdudula gihimo lamang human sa paghimo sa usa ka round trip sa tibuok network. Tungod niini, ang dula ingon og hinay kaayo, mao nga hapit dayon pagkahuman sa pagpaila sa Multiplayer sa dula, usa ka mekanismo ang gipaila aron itago ang mga paglangan. Ang pagtago sa paglangan nagsundog sa input sa magdudula nga wala magtagad sa mga aksyon sa ubang mga magdudula ug sa mga desisyon sa server.

Megapack: Giunsa Pagsulbad sa Factorio ang 200-Player Multiplayer Problem
Ang Factorio adunay usa ka estado sa dula Estado sa Dula mao ang kompleto nga kahimtang sa kard, magdudula, entidad ug uban pa. Deterministiko kini nga simulate sa tanan nga mga kliyente base sa mga aksyon nga nadawat gikan sa server. Ang kahimtang sa dula sagrado, ug kung magsugod kini nga lahi sa server o bisan unsang kliyente, mahitabo ang desync.

gawas Estado sa Dula kita adunay usa ka kahimtang sa mga paglangan Latency State. Naglangkob kini og gamay nga subset sa ground state. Latency State dili sagrado ug yano nga nagrepresentar sa usa ka hulagway kung unsa ang hitsura sa kahimtang sa dula sa umaabot base sa mga input sa player Mga Aksyon sa Pag-input.

Alang niini nga katuyoan, nagtipig kami usa ka kopya sa gibuhat Mga Aksyon sa Pag-input sa delay nga pila.

Megapack: Giunsa Pagsulbad sa Factorio ang 200-Player Multiplayer Problem
Kana mao, sa katapusan sa proseso sa kilid sa kliyente ang hulagway ingon niini:

  1. Nag apply mi Mga Aksyon sa Pag-input tanan players sa Estado sa Dula ang paagi nga kini nga mga aksyon sa pag-input nadawat gikan sa server.
  2. Among tangtangon ang tanan gikan sa delay queue Mga Aksyon sa Pag-input, nga, sumala sa server, na-apply na sa Estado sa Dula.
  3. Pagwagtang Latency State ug i-reset kini aron kini parehas nga hitsura sa Estado sa Dula.
  4. Among i-apply ang tanang aksyon gikan sa delay queue ngadto sa Latency State.
  5. Base sa datos Estado sa Dula ΠΈ Latency State Gihatag namon ang dula sa magdudula.

Kining tanan gisubli sa matag sukod.

Lisod kaayo? Ayaw pagrelaks, dili lang kini. Aron mabayran ang dili kasaligan nga mga koneksyon sa Internet, naghimo kami og duha ka mekanismo:

  • Nawala nga mga ticks: kung ang server nakahukom niana Mga Aksyon sa Pag-input ipatuman sa beat sa duwa, unya kon dili siya makadawat Mga Aksyon sa Pag-input pipila ka magdudula (pananglitan, tungod sa dugang nga paglangan), dili siya maghulat, apan ipahibalo kini nga kliyente "Wala nako gikonsiderar ang imong Mga Aksyon sa Pag-input, sulayan nako nga idugang kini sa sunod nga bar.” Gihimo kini aron tungod sa mga problema sa koneksyon (o kompyuter) sa usa ka magdudula, ang pag-update sa mapa dili mohinay alang sa tanan. Angay nga timan-an kana Mga Aksyon sa Pag-input wala gibalewala, apan gipadaplin lang.
  • Full round-trip latency: Ang server mosulay sa pagtag-an kung unsa ang round-trip latency tali sa kliyente ug server para sa matag kliyente. Matag 5 segundos, kini makigsabot sa usa ka bag-ong latency uban sa kliyente kon gikinahanglan (base sa kon sa unsang paagi ang koneksyon naggawi sa nangagi), ug sa pagdugang o pagkunhod sa round-trip latency sumala niana.

Sa ilang kaugalingon, kini nga mga mekanismo yano ra, apan kung kini gigamit nga magkauban (nga sagad mahitabo sa mga problema sa koneksyon), ang lohika sa code mahimong lisud nga pagdumala ug adunay daghang mga kaso sa sulud. Dugang pa, kung kini nga mga mekanismo moabut, ang server ug ang paglangan sa pila kinahanglan nga husto nga ipatuman ang espesyal Input nga Aksyon gitawag StopMovementInTheNextTick. Salamat niini, kung adunay mga problema sa koneksyon, ang karakter dili modagan sa iyang kaugalingon (pananglitan, atubangan sa tren).

Karon kinahanglan namong ipasabut kanimo kung giunsa ang pagpili sa entidad molihok. Usa sa mga gipasa nga tipo Input nga Aksyon usa ka pagbag-o sa estado sa pagpili sa entidad. Gisultihan niini ang tanan kung unsang entidad ang gipalupad sa magdudula. Sama sa imong mahanduraw, kini usa sa labing kasagaran nga mga aksyon sa pag-input nga gipadala sa mga kliyente, aron makatipig sa bandwidth, gi-optimize namon kini aron makuha ang gamay nga espasyo kutob sa mahimo. Ang paagi sa pagtrabaho niini mao nga samtang ang matag entidad gipili, imbis nga magtipig sa hingpit, taas nga katukma nga mga koordinasyon sa mapa, ang dula nagtipig usa ka ubos nga katukma nga paryente nga gibalanse gikan sa miaging pagpili. Maayo kini tungod kay ang mga pagpili sa mouse lagmit nga duol kaayo sa miaging pagpili. Kini nagpatunghag duha ka importanteng kinahanglanon: Mga Aksyon sa Pag-input Kinahanglang dili kini laktawan ug kinahanglang makompleto sa saktong pagkasunod-sunod. Kini nga mga kinahanglanon gitagbo alang sa Estado sa Dula. Apan sukad sa buluhaton Latency nga kahimtang sa "looking good enough" para sa player, wala sila matagbaw sa delay state. Latency State wala magtagad daghang edge cases, nga nalangkit sa paglaktaw sa mga siklo sa orasan ug pagbag-o sa round-trip nga mga paglangan sa transmission.

Makatag-an na ka kung asa kini padulong. Sa katapusan nagsugod na kami sa pagtan-aw sa mga hinungdan sa problema sa megapack. Ang gamut sa problema mao nga ang lohika sa pagpili sa entidad nagsalig Latency State, ug kini nga estado dili kanunay adunay husto nga kasayuran. Busa, ang usa ka megapacket gihimo sama niini:

  1. Ang magdudula adunay mga problema sa koneksyon.
  2. Ang mga mekanismo sa paglaktaw sa mga siklo sa orasan ug pag-regulate sa paglangan sa round-trip transmission kay mudula.
  3. Ang pila sa estado sa pagkalangan wala magtagad niini nga mga mekanismo. Kini ang hinungdan sa pipila ka mga aksyon nga matangtang sa wala pa sa panahon o gihimo sa sayup nga pagkasunod-sunod, nga nagresulta sa dili husto Latency State.
  4. Ang magdudula adunay problema sa koneksyon ug, aron makaapas sa server, nag-simulate hangtod sa 400 nga mga siklo.
  5. Sa matag tik, usa ka bag-ong aksyon, nga nagbag-o sa pagpili sa entidad, gihimo ug giandam alang sa pagpadala sa server.
  6. Ang kliyente nagpadala usa ka mega-batch sa 400+ nga mga pagbag-o sa pagpili sa entidad sa server (ug uban ang uban pang mga aksyon: mga estado sa pagpamusil, mga estado sa paglakaw, ug uban pa nag-antus usab sa kini nga problema).
  7. Nakadawat ang server og 400 ka mga aksyon sa pag-input. Tungod kay dili gitugotan nga laktawan ang bisan unsang mga aksyon sa pag-input, gimando niini ang tanan nga mga kliyente nga himuon ang mga aksyon ug ipadala kini sa tibuuk nga network.

Ang irony mao nga ang usa ka mekanismo nga gidisenyo aron makadaginot sa bandwidth natapos sa paghimo og dagkong mga pakete sa network.

Gitubag namo kini nga isyu pinaagi sa pag-ayo sa tanang edge nga kaso sa update ug backlog queue nga suporta. Bisan tuod nagkinahanglan kini og gamay nga panahon, sa katapusan kini angayan nga makuha kini nga husto imbes nga magsalig sa dali nga mga hack.

Source: www.habr.com

Idugang sa usa ka comment