{"id":37812,"date":"2019-10-31T22:19:55","date_gmt":"2019-10-31T19:19:55","guid":{"rendered":"https:\/\/prohoster.info\/blog\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\/"},"modified":"2019-10-31T22:19:55","modified_gmt":"2019-10-31T19:19:55","slug":"megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","title":{"rendered":"Mega Pachet: cum au reu\u0219it dezvoltatorii Factorio s\u0103 rezolve problema cu multiplayer-ul pentru 200 de juc\u0103tori","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Mega Pachet: cum au reu\u0219it dezvoltatorii Factorio s\u0103 rezolve problema cu multiplayer-ul pentru 200 de juc\u0103tori\" src=\"\/wp-content\/uploads\/2019\/09\/135544365299791de479555734645ef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cen luna mai a acestui an am participat ca juc\u0103tor la <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/d_DlvkTK9hU\">evenimentul MMO KatherineOfSky<\/a><\/noindex>. Am observat c\u0103, atunci c\u00e2nd num\u0103rul juc\u0103torilor atinge o anumit\u0103 limit\u0103, la fiecare c\u00e2teva minute o parte dintre ei \u201ecad\u201d. Din fericire pentru voi (dar nu pentru mine), am fost unul dintre acei juc\u0103tori care s-au deconectat <b>de fiecare dat\u0103<\/b>, chiar \u0219i cu o conexiune bun\u0103. Am perceput acest lucru ca pe o provocare personal\u0103 \u0219i am \u00eenceput s\u0103 caut cauzele problemei. Dup\u0103 trei s\u0103pt\u0103m\u00e2ni de depanare, testare \u0219i solu\u021bion\u0103ri, eroarea a fost \u00een sf\u00e2r\u0219it remediat\u0103, dar aceast\u0103 c\u0103l\u0103torie nu a fost deloc simpl\u0103.<\/p>\n<p>Problemele multiplayer sunt foarte dificile de urm\u0103rit. De obicei, ele apar \u00een condi\u021bii foarte specifice ale re\u021belei \u0219i \u00een st\u0103ri foarte precise ale jocului (\u00een acest caz - cu mai mult de 200 de juc\u0103tori). Chiar \u0219i atunci c\u00e2nd reu\u0219e\u0219ti s\u0103 reproduci problema, nu po\u021bi s\u0103 o depanezi corect, deoarece inserarea punctelor de control opre\u0219te jocul, deruteaz\u0103 temporizatoarele \u0219i de obicei duce la \u00eencheierea conexiunii din cauza expir\u0103rii timpului de a\u0219teptare. Dar datorit\u0103 perseveren\u021bei \u0219i unui instrument minunat numit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jagt\/clumsy\">clumsy<\/a><\/noindex> , am reu\u0219it s\u0103 aflu ce se \u00eent\u00e2mpl\u0103.<\/p>\n<p>Pe scurt: din cauza unei erori \u0219i a implement\u0103rii incomplete a simul\u0103rii st\u0103rii de \u00eent\u00e2rziere, clientul se g\u0103sea uneori \u00eentr-o situa\u021bie \u00een care trebuia s\u0103 trimit\u0103 un pachet de re\u021bea format din ac\u021biunile de input ale juc\u0103torului pentru aproximativ 400 de entit\u0103\u021bi de joc (numim aceasta \u201emega pachet\u201d). Dup\u0103 aceasta, serverul trebuie nu doar s\u0103 primeasc\u0103 corect toate aceste ac\u021biuni de input, ci \u0219i s\u0103 le trimit\u0103 tuturor celorlal\u021bi clien\u021bi. Dac\u0103 ai 200 de clien\u021bi, devine rapid o problem\u0103. Canalul c\u0103tre server se blocheaz\u0103 repede, ceea ce duce la pierderea pachetelor \u0219i la un val de pachete solicitate din nou. \u00cent\u00e2rzierea ac\u021biunilor de input duce apoi la trimiterea de mega pachete de c\u0103tre \u0219i mai mul\u021bi clien\u021bi, iar avalan\u0219a se intensific\u0103. Clien\u021bii noroco\u0219i reu\u0219esc s\u0103 se recupereze, to\u021bi ceilal\u021bi \u201ecad\u201d.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Mega Pachet: cum au reu\u0219it dezvoltatorii Factorio s\u0103 rezolve problema cu multiplayer-ul pentru 200 de juc\u0103tori\" src=\"\/wp-content\/uploads\/2019\/09\/ff1a60d55eb6f5a4dc7be4b826d747f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nProblema a fost destul de fundamental\u0103 \u0219i mi-a luat 2 s\u0103pt\u0103m\u00e2ni pentru a o rezolva. Este destul de tehnic\u0103, a\u0219a c\u0103 mai jos voi explica \u00een detaliu. Dar pentru \u00eenceput, trebuie s\u0103 \u0219ti\u021bi c\u0103, \u00eencep\u00e2nd cu versiunea 0.17.54, lansat\u0103 pe 4 iunie, \u00een condi\u021biile de probleme temporare de conectivitate, multiplayerul a devenit mai stabil, iar ascunderea laten\u021belor mult mai pu\u021bin glitchy (mai pu\u021bine \u00eent\u00e2rzieri \u0219i teleport\u0103ri). De asemenea, am schimbat modul \u00een care se ascund laten\u021bele \u00een lupt\u0103 \u0219i sper c\u0103, gra\u021bie acestui lucru, vor fi ceva mai fluente.<\/p>\n<h3>Detalii tehnice despre mega-pachetul multiplayer<\/h3>\n<p>\nDac\u0103 simplific\u0103m explica\u021bia, multiplayerul din joc func\u021bioneaz\u0103 astfel: toate clien\u021bii simuleaz\u0103 starea jocului, primind \u0219i trimi\u021b\u00e2nd doar inputul juc\u0103torului (numit \u201eac\u021biuni de input\u201d, <i>Input Actions<\/i>). Sarcina principal\u0103 a serverului este transmiterea <i>Input Actions<\/i> \u0219i controlul faptului c\u0103 to\u021bi clien\u021bii efectueaz\u0103 acelea\u0219i ac\u021biuni \u00eentr-un singur ciclu. Pentru mai multe detalii, pute\u021bi citi \u00een postarea <noindex><a rel=\"nofollow\" href=\"https:\/\/www.factorio.com\/blog\/post\/fff-149\">FFF-149<\/a><\/noindex>.<\/p>\n<p>Deoarece serverul trebuie s\u0103 ia decizii cu privire la ce ac\u021biuni trebuie efectuate, ac\u021biunile juc\u0103torului urmeaz\u0103 aproximativ acest traseu: ac\u021biunea juc\u0103torului -&gt; clientul jocului -&gt; re\u021bea -&gt; server -&gt; re\u021bea -&gt; clientul jocului. Aceasta \u00eenseamn\u0103 c\u0103 fiecare ac\u021biune a juc\u0103torului este executat\u0103 doar dup\u0103 ce a parcurs drumul \u00eenapoi prin re\u021bea. Din cauza acestui lucru, jocul ar p\u0103rea extrem de \u00eent\u00e2rziat, a\u0219a c\u0103 aproape imediat dup\u0103 introducerea multiplayer-ului \u00een joc a fost implementat un mecanism de ascundere a laten\u021belor. Ascunderea laten\u021belor imit\u0103 inputul juc\u0103torului f\u0103r\u0103 a lua \u00een considerare ac\u021biunile altor juc\u0103tori \u0219i deciziile serverului.<\/p>\n<p><img decoding=\"async\" alt=\"Mega Pachet: cum au reu\u0219it dezvoltatorii Factorio s\u0103 rezolve problema cu multiplayer-ul pentru 200 de juc\u0103tori\" src=\"\/wp-content\/uploads\/2019\/09\/0b66a3b07d6aa2ab1d2329d782c78615.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cen Factorio exist\u0103 un stat al jocului <i>Game State<\/i> \u2014 acesta este starea complet\u0103 a h\u0103r\u021bii, juc\u0103torului, entit\u0103\u021bilor \u0219i tot ce este altceva. Este determinist simulat \u00een to\u021bi clien\u021bii pe baza ac\u021biunilor primite de la server. Starea jocului este sacr\u0103, \u0219i dac\u0103 aceasta \u00eencepe vreodat\u0103 s\u0103 difere de server sau de orice alt client, apare o desincronizare.<\/p>\n<p>\u00cen plus, <i>Game State<\/i> avem un stat al laten\u021belor <i>Latency State<\/i>. Acesta con\u021bine un subset mic al st\u0103rii principale. <i>Latency State<\/i> nu este sacru \u0219i reprezint\u0103 pur \u0219i simplu o imagine a felului \u00een care va ar\u0103ta starea jocului \u00een viitor pe baza inputului juc\u0103torului. <i>Input Actions<\/i>.<\/p>\n<p>Pentru aceasta, p\u0103str\u0103m o copie a laten\u021belor create <i>Input Actions<\/i> \u00een coada de laten\u021be.<\/p>\n<p><img decoding=\"async\" alt=\"Mega Pachet: cum au reu\u0219it dezvoltatorii Factorio s\u0103 rezolve problema cu multiplayer-ul pentru 200 de juc\u0103tori\" src=\"\/wp-content\/uploads\/2019\/09\/31e43263d1d2bfc79700730978fcd02a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdic\u0103, la finalul procesului, pe partea clientului, imaginea arat\u0103 aproximativ a\u0219a:<\/p>\n<ol>\n<li>Aplic\u0103m <i>Input Actions<\/i> to\u021bi juc\u0103torii la <i>Game State<\/i> astfel \u00eenc\u00e2t aceste ac\u021biuni de introducere au fost primite de la server.<\/li>\n<li>Elimin\u0103m din coada \u00eent\u00e2rzierilor toate <i>Input Actions<\/i>, care, conform datelor serverului, au fost deja aplicate la <i>Game State<\/i>.<\/li>\n<li>\u0218tergem <i>Latency State<\/i> \u0219i \u00eel reset\u0103m, astfel \u00eenc\u00e2t s\u0103 arate exact a\u0219a cum <i>Game State<\/i>.<\/li>\n<li>Aplic\u0103m toate ac\u021biunile din coada \u00eent\u00e2rzierilor la <i>Latency State<\/i>.<\/li>\n<li>Pe baza datelor <i>Game State<\/i> \u0219i <i>Latency State<\/i> red\u0103m jocul juc\u0103torului.<\/li>\n<\/ol>\n<p>\nToate acestea se repet\u0103 \u00een fiecare ciclu.<\/p>\n<p>Prea complicat? Nu v\u0103 relaxa\u021bi, nu este totul. Pentru a compensa fiabilitatea conexiunilor la Internet, am creat dou\u0103 mecanisme:<\/p>\n<ul>\n<li>Cicluri ratate: c\u00e2nd serverul decide c\u0103 <i>Input Actions<\/i> vor fi executate \u00een ciclu de joc, dac\u0103 nu a primit <i>Input Actions<\/i> de la vreun juc\u0103tor (de exemplu, din cauza unei \u00eent\u00e2rzieri crescute), nu va a\u0219tepta, ci va informa acel client \u00abnu \u021bi-am luat \u00een considerare <i>Input Actions<\/i>, voi \u00eencerca s\u0103 le adaug \u00een urm\u0103torul ciclu\u00bb. A fost conceput astfel \u00eenc\u00e2t, din cauza problemelor de conexiune (sau ale computerului) ale unui juc\u0103tor, actualizarea h\u0103r\u021bii s\u0103 nu fie \u00eent\u00e2rziat\u0103 pentru to\u021bi ceilal\u021bi. Merit\u0103 men\u021bionat c\u0103 <i>Input Actions<\/i> nu sunt ignorate, ci pur \u0219i simplu am\u00e2nate.<\/li>\n<li>\u00cent\u00e2rzierea total\u0103 pe calea de \u00eentoarcere: serverul \u00eencearc\u0103 s\u0103 presupun\u0103 care este \u00eent\u00e2rzierea transmiterii datelor de la client la server \u0219i \u00eenapoi pentru fiecare client. La fiecare 5 secunde, el discut\u0103 cu clientul o nou\u0103 \u00eent\u00e2rziere (\u00een func\u021bie de comportamentul conexiunii din trecut) \u0219i, \u00een consecin\u021b\u0103, cre\u0219te sau scade \u00eent\u00e2rzierea transmiterii datelor de la client la server \u0219i \u00eenapoi.<\/li>\n<\/ul>\n<p>\nAceste mecanisme \u00een sine sunt destul de simple, dar atunci c\u00e2nd sunt utilizate \u00eempreun\u0103 (ceea ce se \u00eent\u00e2mpl\u0103 adesea \u00een condi\u021bii de probleme de conexiune), logica codului devine dificil de gestionat \u0219i cu multe cazuri limit\u0103. \u00cen plus, atunci c\u00e2nd aceste mecanisme sunt implicate, serverul \u0219i coada \u00eent\u00e2rzierilor trebuie s\u0103 implementeze corect o <i>Ac\u021biune de intrare<\/i> called <i>StopMovementInTheNextTick<\/i>. Datorit\u0103 acestui fapt, \u00een condi\u021bii de probleme de conexiune, personajul nu va alerga de unul singur (de exemplu, sub tren).<\/p>\n<p>Acum trebuie s\u0103 v\u0103 explic cum func\u021bioneaz\u0103 selec\u021bia entit\u0103\u021bilor. Unul dintre tipurile transmise <i>Ac\u021biune de intrare<\/i> \u2014 aceasta este schimbarea st\u0103rii de selec\u021bie a entit\u0103\u021bii. Aceasta le comunic\u0103 tuturor ce entitate a fost eviden\u021biat\u0103 cu cursorul de c\u0103tre juc\u0103tor. A\u0219a cum se poate \u00een\u021belege, este una dintre cele mai frecvente ac\u021biuni de input trimise de clien\u021bi, de aceea, pentru a economisi l\u0103\u021bimea de band\u0103 a canalului, am optimizat-o astfel \u00eenc\u00e2t s\u0103 ocupe c\u00e2t mai pu\u021bin loc. Aceasta a fost realizat\u0103 astfel: la selectarea fiec\u0103rei entit\u0103\u021bi, \u00een loc s\u0103 salv\u0103m coordonatele absolute, de mare precizie ale h\u0103r\u021bii, jocul salveaz\u0103 un offset relativ de mic\u0103 precizie fa\u021b\u0103 de selec\u021bia anterioar\u0103. Aceasta func\u021bioneaz\u0103 bine deoarece selectarea cu mouse-ul are loc de obicei foarte aproape de selec\u021bia anterioar\u0103. Din acest motiv, exist\u0103 dou\u0103 cerin\u021be importante: <i>Input Actions<\/i> nu trebuie ocolite \u0219i trebuie \u00eendeplinite \u00een ordinea corect\u0103. Aceste cerin\u021be sunt satisf\u0103cute pentru <i>Game State<\/i>. Dar, deoarece sarcina <i>Starea de laten\u021b\u0103<\/i> este de a \u201ear\u0103ta suficient de bine\u201d pentru juc\u0103tor, \u00een starea de laten\u021b\u0103 acestea nu sunt satisf\u0103cute. <i>Latency State<\/i> nu ia \u00een considerare <noindex><a rel=\"nofollow\" href=\"https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-302-megapacket-commit.jpg\">multe cazuri limit\u0103<\/a><\/noindex>, legate de ocolirea ciclic\u0103 \u0219i de modificarea laten\u021bei de transfer bidirec\u021bional.<\/p>\n<p>Probabil c\u0103 deja v\u0103 pute\u021bi da seama \u00eencotro ne \u00eendrept\u0103m. \u00cen sf\u00e2r\u0219it, \u00eencepem s\u0103 vedem cauzele problemei megapugetului. R\u0103d\u0103cina problemei const\u0103 \u00een faptul c\u0103 \u00een luarea deciziei de a transmite ac\u021biunea de modificare a selec\u021biei, logica selec\u021biei entit\u0103\u021bii se bazeaz\u0103 pe <i>Latency State<\/i>, iar aceast\u0103 stare nu con\u021bine \u00eentotdeauna informa\u021bii corecte. Prin urmare, megapugetul este generat \u00een aproximativ urm\u0103torul mod:<\/p>\n<ol>\n<li>Juc\u0103torul are probleme cu conexiunea.<\/li>\n<li>Intr\u0103 \u00een ac\u021biune mecanismele de ocolire ciclic\u0103 \u0219i de gestionare a laten\u021bei de transfer bidirec\u021bional.<\/li>\n<li>Coada st\u0103rii de laten\u021b\u0103 nu ia \u00een considerare aceste mecanisme. Acest lucru duce la faptul c\u0103 unele ac\u021biuni sunt eliminate prematur sau sunt efectuate \u00een ordinea gre\u0219it\u0103, ceea ce duce la o <i>Latency State<\/i>.<\/li>\n<li>Juc\u0103torul \u00ee\u0219i recupereaz\u0103 conexiunea \u0219i, pentru a ajunge din urm\u0103 serverul, simuleaz\u0103 p\u00e2n\u0103 la 400 de cicluri.<\/li>\n<li>\u00cen fiecare ciclu se genereaz\u0103 \u0219i se preg\u0103te\u0219te pentru trimitere c\u0103tre server o nou\u0103 ac\u021biune de modificare a selec\u021biei entit\u0103\u021bii.<\/li>\n<li>Clientul trimite serverului un megapuget de peste 400 de modific\u0103ri ale selec\u021biei entit\u0103\u021bilor (iar alte ac\u021biuni, precum starea de \u00eempu\u0219care, mers etc., au fost de asemenea afectate de aceast\u0103 problem\u0103).<\/li>\n<li>Serverul prime\u0219te 400 de ac\u021biuni de intrare. Deoarece nu i se permite s\u0103 sar\u0103 peste nicio ac\u021biune de intrare, acesta ordon\u0103 tuturor clien\u021bilor s\u0103 execute aceste ac\u021biuni \u0219i s\u0103 le trimit\u0103 prin re\u021bea.<\/li>\n<\/ol>\n<p>\nIronia const\u0103 \u00een faptul c\u0103 mecanismul destinat economisirii l\u0103\u021bimii de band\u0103 a canalului, \u00een cele din urm\u0103, genera pachete de re\u021bea enorme.<\/p>\n<p>Am rezolvat aceast\u0103 problem\u0103 corect\u00e2nd toate cazurile limit\u0103 de actualizare \u0219i sprijin pentru coada de \u00eent\u00e2rzieri. De\u0219i a durat destul de mult, \u00eentr-un final a meritat s\u0103 implement\u0103m totul corect, \u00een loc s\u0103 ne baz\u0103m pe solu\u021bii rapide.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466135\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043c\u0430\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 MMO-\u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0438 KatherineOfSky. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u00ab\u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00bb. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0432\u0430\u0441 (\u043d\u043e \u043d\u0435 \u0434\u043b\u044f \u043c\u0435\u043d\u044f), \u044f \u0431\u044b\u043b \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0435\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042f \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u044f\u043b \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28381,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u0435\u0433\u0430\u043f\u0430\u043a\u0435\u0442: \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Factorio \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u043e\u043c \u043d\u0430 200 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:19:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:19:55+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Mega-pachet: cum au reu\u0219it dezvoltatorii Factorio s\u0103 rezolve problema multiplayer-ului pentru 200 de juc\u0103tori | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u0435\u0433\u0430\u043f\u0430\u043a\u0435\u0442: \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Factorio \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u043e\u043c \u043d\u0430 200 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:19:55+00:00","article:modified_time":"2019-10-31T19:19:55+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37812","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 19:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:20:22","updated":"2026-01-23 19:22:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/37812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=37812"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/37812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/28381"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=37812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=37812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=37812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}