{"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\/pl\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","title":{"rendered":"Mega pakiet: jak deweloperzy Factorio zdo\u0142ali rozwi\u0105za\u0107 problem z multiplayerem dla 200 graczy","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Mega pakiet: jak deweloperzy Factorio zdo\u0142ali rozwi\u0105za\u0107 problem z multiplayerem dla 200 graczy\" src=\"\/wp-content\/uploads\/2019\/09\/135544365299791de479555734645ef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW maju tego roku wzi\u0105\u0142em udzia\u0142 jako gracz w <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/d_DlvkTK9hU\">wydarzeniu MMO KatherineOfSky<\/a><\/noindex>. Zauwa\u017cy\u0142em, \u017ce kiedy liczba graczy osi\u0105ga pewien pr\u00f3g, co kilka minut cz\u0119\u015b\u0107 z nich \"od\u0142\u0105cza si\u0119\". Na szcz\u0119\u015bcie dla was (ale nie dla mnie), by\u0142em jednym z tych graczy, kt\u00f3rzy od\u0142\u0105czali si\u0119 <b>za ka\u017cdym razem<\/b>, nawet przy dobrej \u0142\u0105czno\u015bci. Przyj\u0105\u0142em to jako osobiste wyzwanie i zacz\u0105\u0142em szuka\u0107 przyczyn problemu. Po trzech tygodniach debugowania, testowania i poprawek b\u0142\u0105d w ko\u0144cu zosta\u0142 usuni\u0119ty, ale ta podr\u00f3\u017c nie by\u0142a wcale \u0142atwa.<\/p>\n<p>Problemy w grach wieloosobowych s\u0105 bardzo trudne do zidentyfikowania. Zwykle wyst\u0119puj\u0105 w bardzo specyficznych warunkach ustawie\u0144 sieciowych i przy bardzo szczeg\u00f3lnych stanach gry (w tym przypadku - przy ponad 200 graczach). I nawet gdy uda si\u0119 odtworzy\u0107 problem, trudno go odpowiednio debugowa\u0107, poniewa\u017c wstawienie punkt\u00f3w kontrolnych zatrzymuje gr\u0119, myli timery i zwykle prowadzi do zako\u0144czenia po\u0142\u0105czenia z powodu przekroczenia limitu czasu. Ale dzi\u0119ki wytrwa\u0142o\u015bci i niesamowitemu narz\u0119dziu o nazwie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jagt\/clumsy\">clumsy<\/a><\/noindex> uda\u0142o mi si\u0119 ustali\u0107, co si\u0119 dzieje.<\/p>\n<p>Pok kr\u00f3tce: z powodu b\u0142\u0119du i niepe\u0142nej implementacji symulacji op\u00f3\u017anienia klient czasami znajdowa\u0142 si\u0119 w sytuacji, w kt\u00f3rej musia\u0142 w jednym takcie wys\u0142a\u0107 pakiet sieciowy sk\u0142adaj\u0105cy si\u0119 z dzia\u0142a\u0144 wprowadzanych przez gracza dotycz\u0105cych oko\u0142o 400 byt\u00f3w w grze (nazywamy to \"megapakietem\"). Po tym serwer musi nie tylko prawid\u0142owo odebra\u0107 wszystkie te dzia\u0142ania wprowadzania, ale tak\u017ce wys\u0142a\u0107 je wszystkim innym klientom. Je\u015bli masz 200 klient\u00f3w, szybko staje si\u0119 to problemem. Kana\u0142 do serwera szybko si\u0119 zatyka, co prowadzi do utraty pakiet\u00f3w i kaskady ponownie \u017c\u0105danych pakiet\u00f3w. Op\u00f3\u017anienie dzia\u0142a\u0144 wprowadzania prowadzi do tego, \u017ce jeszcze wi\u0119cej klient\u00f3w zaczyna wysy\u0142a\u0107 megapakiety, a ich lawina staje si\u0119 jeszcze silniejsza. Szcz\u0119\u015bliwi klienci udaje si\u0119 zregenerowa\u0107, a wszyscy inni \"od\u0142\u0105czaj\u0105 si\u0119\".<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Mega pakiet: jak deweloperzy Factorio zdo\u0142ali rozwi\u0105za\u0107 problem z multiplayerem dla 200 graczy\" src=\"\/wp-content\/uploads\/2019\/09\/ff1a60d55eb6f5a4dc7be4b826d747f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nProblem by\u0142 do\u015b\u0107 fundamentalny i zaj\u0119\u0142o mi 2 tygodnie, aby go naprawi\u0107. Jest do\u015b\u0107 techniczny, wi\u0119c poni\u017cej wyja\u015bni\u0119 szczeg\u00f3\u0142owe aspekty techniczne. Ale najpierw musicie wiedzie\u0107, \u017ce od wersji 0.17.54, wydanej 4 czerwca, w warunkach problem\u00f3w z po\u0142\u0105czeniem wieloosobowy sta\u0142 si\u0119 znacznie bardziej stabilny, a ukrywanie op\u00f3\u017anie\u0144 \u2013 znacznie mniej zaci\u0119te (mniej lag\u00f3w i teleportacji). Poza tym zmieni\u0142em spos\u00f3b, w jaki ukrywane s\u0105 op\u00f3\u017anienia w bitwie i mam nadziej\u0119, \u017ce dzi\u0119ki temu b\u0119d\u0105 one nieco p\u0142ynniejsze.<\/p>\n<h3>Wieloosobowy Mega Pakiet \u2013 szczeg\u00f3\u0142y techniczne<\/h3>\n<p>\nJe\u015bli wyt\u0142umaczy\u0107 to w prosty spos\u00f3b, to tryb wieloosobowy w grze dzia\u0142a w nast\u0119puj\u0105cy spos\u00f3b: wszyscy klienci symuluj\u0105 stan gry, odbieraj\u0105c i wysy\u0142aj\u0105c tylko dane wprowadzone przez gracza (nazywane \"dzia\u0142aniami wej\u015bcia\", <i>Input Actions<\/i>). G\u0142\u00f3wnym zadaniem serwera jest przekazywanie <i>Input Actions<\/i> i kontrolowanie, czy wszyscy klienci wykonuj\u0105 te same dzia\u0142ania w jednej turze. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w po\u015bcie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.factorio.com\/blog\/post\/fff-149\">FFF-149<\/a><\/noindex>.<\/p>\n<p>Poniewa\u017c serwer musi podejmowa\u0107 decyzje o tym, jakie dzia\u0142ania nale\u017cy wykona\u0107, dzia\u0142ania gracza przechodz\u0105 mniej wi\u0119cej tak\u0105 drog\u0119: dzia\u0142anie gracza -&gt; klient gry -&gt; sie\u0107 -&gt; serwer -&gt; sie\u0107 -&gt; klient gry. Oznacza to, \u017ce ka\u017cde dzia\u0142anie gracza jest wykonywane dopiero po przej\u015bciu tam i z powrotem przez sie\u0107. Z tego powodu gra wydawa\u0142aby si\u0119 strasznie zaci\u0119ta, dlatego zaraz po wprowadzeniu trybu wieloosobowego w grze wprowadzono mechanizm ukrywania op\u00f3\u017anie\u0144. Ukrywanie op\u00f3\u017anie\u0144 symuluje wprowadzenie gracza bez uwzgl\u0119dniania dzia\u0142a\u0144 innych graczy i decyzji serwera.<\/p>\n<p><img decoding=\"async\" alt=\"Mega pakiet: jak deweloperzy Factorio zdo\u0142ali rozwi\u0105za\u0107 problem z multiplayerem dla 200 graczy\" src=\"\/wp-content\/uploads\/2019\/09\/0b66a3b07d6aa2ab1d2329d782c78615.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW Factorio istnieje stan gry <i>Game State<\/i> \u2013 to pe\u0142ny stan mapy, gracza, jednostek i wszystkiego innego. Jest deterministycznie symulowany we wszystkich klientach na podstawie dzia\u0142a\u0144 otrzymanych od serwera. Stan gry jest \u015bwi\u0119ty i je\u015bli kiedykolwiek zacznie r\u00f3\u017cni\u0107 si\u0119 od serwera lub jakiegokolwiek innego klienta, to dochodzi do desynchronizacji.<\/p>\n<p>Opr\u00f3cz <i>Game State<\/i> mamy stan op\u00f3\u017anie\u0144 <i>Latency State<\/i>. Zawiera on ma\u0142e podzbi\u00f3r g\u0142\u00f3wnego stanu. <i>Latency State<\/i> nie jest \u015bwi\u0119ty i po prostu przedstawia obraz tego, jak wygl\u0105da\u0107 b\u0119dzie stan gry w przysz\u0142o\u015bci na podstawie wprowadzonych przez gracza <i>Input Actions<\/i>.<\/p>\n<p>W tym celu przechowujemy kopi\u0119 tworzonych <i>Input Actions<\/i> w kolejce op\u00f3\u017anie\u0144.<\/p>\n<p><img decoding=\"async\" alt=\"Mega pakiet: jak deweloperzy Factorio zdo\u0142ali rozwi\u0105za\u0107 problem z multiplayerem dla 200 graczy\" src=\"\/wp-content\/uploads\/2019\/09\/31e43263d1d2bfc79700730978fcd02a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa ko\u0144cu procesu obraz po stronie klienta wygl\u0105da mniej wi\u0119cej tak:<\/p>\n<ol>\n<li>Zastosuj <i>Input Actions<\/i> wszystkich graczy do <i>Game State<\/i> tak, jak te dzia\u0142ania wej\u015bciowe zosta\u0142y otrzymane od serwera.<\/li>\n<li>Usuwamy z kolejki op\u00f3\u017anie\u0144 wszystkie <i>Input Actions<\/i>, kt\u00f3re, wed\u0142ug danych serwera, zosta\u0142y ju\u017c zastosowane do <i>Game State<\/i>.<\/li>\n<li>Usuwamy <i>Latency State<\/i> i resetujemy go, aby wygl\u0105da\u0142 dok\u0142adnie tak samo, jak <i>Game State<\/i>.<\/li>\n<li>Zastosuj wszystkie dzia\u0142ania z kolejki op\u00f3\u017anie\u0144 do <i>Latency State<\/i>.<\/li>\n<li>Na podstawie danych <i>Game State<\/i> i <i>Latency State<\/i> renderujemy gr\u0119 dla gracza.<\/li>\n<\/ol>\n<p>\nCa\u0142y ten proces powtarza si\u0119 w ka\u017cdym takcie.<\/p>\n<p>Za du\u017co? Nie martw si\u0119, to jeszcze nie wszystko. Aby zrekompensowa\u0107 niestabilno\u015b\u0107 po\u0142\u0105cze\u0144 internetowych, stworzyli\u015bmy dwa mechanizmy:<\/p>\n<ul>\n<li>Zgubione takty: gdy serwer decyduje, \u017ce <i>Input Actions<\/i> zostan\u0105 wykonane w takcie gry, a je\u015bli nie otrzyma <i>Input Actions<\/i> jakiego\u015b gracza (na przyk\u0142ad z powodu zwi\u0119kszonego op\u00f3\u017anienia), to nie b\u0119dzie czeka\u0107, tylko powie temu klientowi \u201enie uwzgl\u0119dni\u0142em twoich <i>Input Actions<\/i>, postaram si\u0119 doda\u0107 je w nast\u0119pnym takcie\u201d. Zrobiono to, aby przez problemy z po\u0142\u0105czeniem (lub komputerem) jednego gracza aktualizacja mapy nie spowalnia\u0142a wszystkich innych. Warto zauwa\u017cy\u0107, \u017ce <i>Input Actions<\/i> nie s\u0105 ignorowane, a jedynie odk\u0142adane.<\/li>\n<li>Op\u00f3\u017anienie pe\u0142nej drogi tam i z powrotem: serwer pr\u00f3buje oszacowa\u0107, jakie jest op\u00f3\u017anienie transmisji danych tam i z powrotem mi\u0119dzy klientem a serwerem dla ka\u017cdego klienta. Co 5 sekund omawia z klientem nowe op\u00f3\u017anienie (w zale\u017cno\u015bci od tego, jak zachowa\u0142o si\u0119 po\u0142\u0105czenie w przesz\u0142o\u015bci) i odpowiednio zwi\u0119ksza lub zmniejsza op\u00f3\u017anienie transmisji danych tam i z powrotem.<\/li>\n<\/ul>\n<p>\nSame te mechanizmy s\u0105 do\u015b\u0107 proste, ale gdy s\u0105 stosowane razem (co cz\u0119sto wydarza si\u0119 w przypadku problem\u00f3w z po\u0142\u0105czeniem), logika kodu staje si\u0119 trudna do zarz\u0105dzania i zawiera wiele przypadk\u00f3w granicznych. Ponadto, gdy te mechanizmy wchodz\u0105 w gr\u0119, serwer i kolejka op\u00f3\u017anie\u0144 musz\u0105 prawid\u0142owo wdra\u017ca\u0107 specjalne <i>Input Action<\/i> o nazwie <i>StopMovementInTheNextTick<\/i>. Dzi\u0119ki temu w przypadku problem\u00f3w z po\u0142\u0105czeniem posta\u0107 nie b\u0119dzie biega\u0107 sama (na przyk\u0142ad pod poci\u0105g).<\/p>\n<p>Teraz musz\u0119 wyja\u015bni\u0107, jak dzia\u0142a wyb\u00f3r byt\u00f3w. Jeden z przesy\u0142anych typ\u00f3w <i>Input Action<\/i> \u2014 to zmiana stanu wyboru encji. Informuje wszystkich, na kt\u00f3r\u0105 encj\u0119 gracz najecha\u0142 kursorem. Jak mo\u017cna si\u0119 domy\u015bli\u0107, to jedna z najcz\u0119\u015bciej przesy\u0142anych akcji wej\u015bciowych przez klient\u00f3w, dlatego w celu oszcz\u0119dno\u015bci przepustowo\u015bci kana\u0142u zoptymalizowali\u015bmy j\u0105, aby zajmowa\u0142a jak najmniej miejsca. Zrealizowano to w ten spos\u00f3b: podczas wyboru ka\u017cdej encji, zamiast zapisywania absolutnych, precyzyjnych wsp\u00f3\u0142rz\u0119dnych mapy, gra zapisuje niskoprecyzyjne, wzgl\u0119dne przesuni\u0119cie od poprzedniego wyboru. Dzia\u0142a to dobrze, poniewa\u017c zazwyczaj zaznaczenie myszk\u0105 wyst\u0119puje bardzo blisko poprzedniego zaznaczenia. Z tego powodu powstaj\u0105 dwa wa\u017cne wymagania: <i>Input Actions<\/i> nigdy nie mo\u017cna ich pomin\u0105\u0107 i musz\u0105 by\u0107 wykonywane w poprawnej kolejno\u015bci. Te wymagania s\u0105 spe\u0142nione dla <i>Game State<\/i>. Ale poniewa\u017c zadanie <i>Stanu op\u00f3\u017anienia<\/i> polega na tym, aby 'wygl\u0105da\u0142o wystarczaj\u0105co dobrze' dla gracza, w stanie op\u00f3\u017anie\u0144 nie s\u0105 spe\u0142niane. <i>Latency State<\/i> nie uwzgl\u0119dnia <noindex><a rel=\"nofollow\" href=\"https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-302-megapacket-commit.jpg\">wielu przypadk\u00f3w brzegowych<\/a><\/noindex>, kt\u00f3re s\u0105 zwi\u0105zane z pomini\u0119ciem cykli i zmian\u0105 op\u00f3\u017anie\u0144 przesy\u0142u w obie strony.<\/p>\n<p>Ju\u017c mo\u017cesz domy\u015bli\u0107 si\u0119, do czego to wszystko zmierza. W ko\u0144cu zaczynamy dostrzega\u0107 przyczyny problemu megapakietu. Korze\u0144 problemu polega na tym, \u017ce w podejmowaniu decyzji o tym, czy nale\u017cy przesy\u0142a\u0107 akcj\u0119 zmiany wyboru, logika wyboru encji polega na <i>Latency State<\/i>, a to stan nie zawsze zawiera prawid\u0142owe informacje. Dlatego megapakiet generowany jest mniej wi\u0119cej w ten spos\u00f3b:<\/p>\n<ol>\n<li>Gracz ma problemy z po\u0142\u0105czeniem.<\/li>\n<li>Wchodz\u0105 w gr\u0119 mechanizmy pomijania cykli i regulacji op\u00f3\u017anienia przesy\u0142u w obie strony.<\/li>\n<li>Kolejka stanu op\u00f3\u017anie\u0144 nie uwzgl\u0119dnia tych mechanizm\u00f3w. Prowadzi to do tego, \u017ce niekt\u00f3re akcje s\u0105 usuwane przedwcze\u015bnie lub wykonywane w niew\u0142a\u015bciwej kolejno\u015bci, co prowadzi do b\u0142\u0119dnego <i>Latency State<\/i>.<\/li>\n<li>Gracz przestaje mie\u0107 problem z po\u0142\u0105czeniem i aby nadrobi\u0107 zaleg\u0142o\u015bci z serwerem, symuluje do 400 cykli.<\/li>\n<li>W ka\u017cdym cyklu generowana jest i przygotowywana do wys\u0142ania na serwer nowa akcja zmiany wyboru encji.<\/li>\n<li>Klient wysy\u0142a do serwera megapakiet zawieraj\u0105cy ponad 400 zmian wyboru encji (i inne dzia\u0142ania: stan strzelania, chodzenia itd. r\u00f3wnie\u017c cierpia\u0142y z tego powodu).<\/li>\n<li>Serwer wykonuje 400 dzia\u0142a\u0144 wej\u015bciowych. Poniewa\u017c nie ma pozwolenia na pomini\u0119cie \u017cadnego dzia\u0142ania wej\u015bciowego, nakazuje wszystkim klientom wykona\u0107 te dzia\u0142ania i wysy\u0142a je przez sie\u0107.<\/li>\n<\/ol>\n<p>\nIronia polega na tym, \u017ce mechanizm maj\u0105cy na celu oszcz\u0119dno\u015b\u0107 przepustowo\u015bci kana\u0142u w rezultacie generowa\u0142 ogromne pakiety sieciowe.<\/p>\n<p>Rozwi\u0105zali\u015bmy ten problem, poprawiaj\u0105c wszystkie graniczne przypadki aktualizacji i wsparcia dla kolejki op\u00f3\u017anie\u0144. Cho\u0107 zaj\u0119\u0142o to sporo czasu, ostatecznie warto by\u0142o wszystko wdro\u017cy\u0107 poprawnie, a nie polega\u0107 na szybkich hackach.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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 paczka: jak deweloperzy Factorio zdo\u0142ali rozwi\u0105za\u0107 problem z wieloosobowo\u015bci\u0105 dla 200 graczy | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/37812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37812"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28381"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}