{"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\/pt\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","title":{"rendered":"Mega pacote: como os desenvolvedores do Factorio resolveram o problema do multiplayer para 200 jogadores.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Mega pacote: como os desenvolvedores do Factorio resolveram o problema do multiplayer para 200 jogadores.\" src=\"\/wp-content\/uploads\/2019\/09\/135544365299791de479555734645ef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEm maio deste ano, eu participei como jogador de <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/d_DlvkTK9hU\">um evento MMO chamado KatherineOfSky<\/a><\/noindex>. Notei que, quando o n\u00famero de jogadores atinge um certo limite, a cada poucos minutos, parte deles \"cai\". Felizmente para voc\u00eas (mas n\u00e3o para mim), eu fui um dos jogadores que desconectavam <b>todas as vezes<\/b>, mesmo com uma boa conex\u00e3o. Eu encarei isso como um desafio pessoal e comecei a procurar as causas do problema. Ap\u00f3s tr\u00eas semanas de depura\u00e7\u00e3o, testes e corre\u00e7\u00f5es, o erro foi finalmente resolvido, mas essa jornada n\u00e3o foi t\u00e3o simples.<\/p>\n<p>Os problemas em jogos multiplayer s\u00e3o muito dif\u00edceis de rastrear. Geralmente, eles ocorrem em condi\u00e7\u00f5es de rede muito espec\u00edficas e em situa\u00e7\u00f5es de jogo bastante espec\u00edficas (neste caso, a presen\u00e7a de mais de 200 jogadores). E mesmo quando \u00e9 poss\u00edvel reproduzir o problema, n\u00e3o \u00e9 f\u00e1cil depur\u00e1-lo adequadamente, porque a inser\u00e7\u00e3o de pontos de controle interrompe o jogo, confunde os temporizadores e geralmente leva a uma desconex\u00e3o devido a tempo limite. Mas, gra\u00e7as \u00e0 persist\u00eancia e a uma ferramenta incr\u00edvel chamada <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jagt\/clumsy\">clumsy<\/a><\/noindex> , consegui descobrir o que est\u00e1 acontecendo.<\/p>\n<p>Resumindo: devido a um erro e \u00e0 implementa\u00e7\u00e3o incompleta da simula\u00e7\u00e3o do estado de lat\u00eancia, o cliente \u00e0s vezes se encontrava em uma situa\u00e7\u00e3o onde precisava enviar, em um \u00fanico ciclo, um pacote de rede composto por a\u00e7\u00f5es de entrada do jogador envolvendo cerca de 400 entidades de jogo (n\u00f3s chamamos isso de \"megapacote\"). Ap\u00f3s isso, o servidor n\u00e3o s\u00f3 precisava receber corretamente todas essas a\u00e7\u00f5es de entrada, mas tamb\u00e9m envi\u00e1-las para todos os outros clientes. Se voc\u00ea tem 200 clientes, isso rapidamente se torna um problema. O canal para o servidor rapidamente se entope, resultando em perda de pacotes e um efeito cascata de pacotes solicitados novamente. O atraso nas a\u00e7\u00f5es de entrada leva ainda mais clientes a come\u00e7ar a enviar megapacotes, aumentando ainda mais a avalanche. Os clientes sortudos conseguem se recuperar, enquanto todos os outros \"caem\".<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Mega pacote: como os desenvolvedores do Factorio resolveram o problema do multiplayer para 200 jogadores.\" src=\"\/wp-content\/uploads\/2019\/09\/ff1a60d55eb6f5a4dc7be4b826d747f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO problema era bastante fundamental e levei 2 semanas para resolv\u00ea-lo. \u00c9 bastante t\u00e9cnico, ent\u00e3o abaixo explicarei os detalhes t\u00e9cnicos complexos. Mas, para come\u00e7ar, voc\u00ea precisa saber que desde a vers\u00e3o 0.17.54, lan\u00e7ada em 4 de junho, a conectividade multiplayer se tornou mais est\u00e1vel em condi\u00e7\u00f5es de problemas temporais, e a oculta\u00e7\u00e3o de lat\u00eancias \u2014 muito menos bugada (menos engasgos e teletransportes). Al\u00e9m disso, mudei a forma de ocultar lat\u00eancias em combate e espero que, com isso, elas sejam um pouco mais suaves.<\/p>\n<h3>Multiplayer Mega Pack \u2014 detalhes t\u00e9cnicos<\/h3>\n<p>\nSimplificando, o multiplayer do jogo funciona da seguinte maneira: todos os clientes simulam o estado do jogo, recebendo e enviando apenas a entrada do jogador (chamada de \"a\u00e7\u00f5es de entrada\", <i>Input Actions<\/i>). A principal tarefa do servidor \u00e9 transmitir <i>Input Actions<\/i> e controlar que todos os clientes realizem as mesmas a\u00e7\u00f5es em um ciclo. Mais detalhes podem ser lidos no post <noindex><a rel=\"nofollow\" href=\"https:\/\/www.factorio.com\/blog\/post\/fff-149\">FFF-149<\/a><\/noindex>.<\/p>\n<p>Como o servidor deve decidir quais a\u00e7\u00f5es executar, a a\u00e7\u00e3o do jogador percorre aproximadamente este caminho: a\u00e7\u00e3o do jogador -&gt; cliente do jogo -&gt; rede -&gt; servidor -&gt; rede -&gt; cliente do jogo. Isso significa que cada a\u00e7\u00e3o do jogador \u00e9 executada apenas ap\u00f3s fazer a viagem de ida e volta pela rede. Devido a isso, o jogo pareceria extremamente lento, portanto, quase imediatamente ap\u00f3s a introdu\u00e7\u00e3o do multiplayer, foi implementado um mecanismo de oculta\u00e7\u00e3o de lat\u00eancias. A oculta\u00e7\u00e3o de lat\u00eancias simula a entrada do jogador sem considerar as a\u00e7\u00f5es de outros jogadores e a tomada de decis\u00f5es do servidor.<\/p>\n<p><img decoding=\"async\" alt=\"Mega pacote: como os desenvolvedores do Factorio resolveram o problema do multiplayer para 200 jogadores.\" src=\"\/wp-content\/uploads\/2019\/09\/0b66a3b07d6aa2ab1d2329d782c78615.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNo Factorio, existe o estado do jogo <i>Game State<\/i> \u2014 \u00e9 o estado completo do mapa, do jogador, das entidades e de tudo mais. Ele \u00e9 simulado de forma determin\u00edstica em todos os clientes com base nas a\u00e7\u00f5es recebidas do servidor. O estado do jogo \u00e9 sagrado e, se alguma vez come\u00e7ar a diferir do servidor ou de qualquer outro cliente, ocorrer\u00e1 uma desincroniza\u00e7\u00e3o.<\/p>\n<p>Al\u00e9m de <i>Game State<\/i> temos o estado de lat\u00eancias <i>Latency State<\/i>. Ele cont\u00e9m um pequeno subconjunto do estado principal. <i>Latency State<\/i> n\u00e3o \u00e9 sagrado e simplesmente representa uma imagem de como o estado do jogo parecer\u00e1 no futuro com base nas entradas do jogador. <i>Input Actions<\/i>.<\/p>\n<p>Para isso, mantemos uma c\u00f3pia das a\u00e7\u00f5es criadas <i>Input Actions<\/i> na fila de lat\u00eancias.<\/p>\n<p><img decoding=\"async\" alt=\"Mega pacote: como os desenvolvedores do Factorio resolveram o problema do multiplayer para 200 jogadores.\" src=\"\/wp-content\/uploads\/2019\/09\/31e43263d1d2bfc79700730978fcd02a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOu seja, no final do processo, do lado do cliente, a imagem se apresenta aproximadamente assim:<\/p>\n<ol>\n<li>Aplicamos <i>Input Actions<\/i> todos os jogadores a <i>Game State<\/i> de acordo com as a\u00e7\u00f5es de entrada que foram recebidas do servidor.<\/li>\n<li>Removemos da fila de atrasos todos <i>Input Actions<\/i>, que, segundo o servidor, j\u00e1 foram aplicados a <i>Game State<\/i>.<\/li>\n<li>Removemos <i>Latency State<\/i> e o redefinimos para que ele apare\u00e7a exatamente como <i>Game State<\/i>.<\/li>\n<li>Aplicamos todas as a\u00e7\u00f5es da fila de atrasos a <i>Latency State<\/i>.<\/li>\n<li>Com base nos dados <i>Game State<\/i> e <i>Latency State<\/i> renderizamos o jogo para o jogador.<\/li>\n<\/ol>\n<p>\nTudo isso se repete em cada ciclo.<\/p>\n<p>Muito complicado? N\u00e3o se preocupe, ainda n\u00e3o acabou. Para compensar a instabilidade das conex\u00f5es de internet, criamos dois mecanismos:<\/p>\n<ul>\n<li>Ciclos perdidos: quando o servidor decide que <i>Input Actions<\/i> ser\u00e3o executados no ciclo do jogo, se ele n\u00e3o recebeu <i>Input Actions<\/i> um determinado jogador (por exemplo, devido ao aumento da lat\u00eancia), ele n\u00e3o esperar\u00e1, mas informar\u00e1 a esse cliente \"n\u00e3o considerei suas <i>Input Actions<\/i>, tentarei adicion\u00e1-los ao pr\u00f3ximo ciclo\". Isso \u00e9 feito para que problemas de conex\u00e3o (ou do computador) de um jogador n\u00e3o desacelerem a atualiza\u00e7\u00e3o do mapa para todos os outros. Vale notar que <i>Input Actions<\/i> n\u00e3o s\u00e3o ignorados, mas apenas adiados.<\/li>\n<li>Lat\u00eancia do caminho total de ida e volta: o servidor tenta suprimir qual \u00e9 a lat\u00eancia de transmiss\u00e3o de dados de ida e volta entre o cliente e o servidor para cada cliente. A cada 5 segundos, ele discute, se necess\u00e1rio, com o cliente uma nova lat\u00eancia (dependendo de como a conex\u00e3o se comportou no passado), e aumenta ou diminui a lat\u00eancia de transmiss\u00e3o de dados de ida e volta, conforme apropriado.<\/li>\n<\/ul>\n<p>\nEsses mecanismos, por si s\u00f3, s\u00e3o bastante simples, mas quando usados em conjunto (o que frequentemente acontece em problemas de conex\u00e3o), a l\u00f3gica do c\u00f3digo se torna dif\u00edcil de gerenciar e cheia de casos limite. Al\u00e9m disso, quando esses mecanismos est\u00e3o envolvidos, o servidor e a fila de atrasos devem implementar corretamente um <i>Input Action<\/i> chamada <i>StopMovementInTheNextTick<\/i>. Gra\u00e7as a isso, em caso de problemas de conex\u00e3o, o personagem n\u00e3o se mover\u00e1 sozinho (por exemplo, para debaixo de um trem).<\/p>\n<p>Agora preciso explicar como funciona a sele\u00e7\u00e3o de entidades. Um dos tipos transmitidos <i>Input Action<\/i> \u2014 \u00e9 uma mudan\u00e7a no estado da sele\u00e7\u00e3o da entidade. Ela informa a todos sobre qual entidade o jogador passou o mouse. Como voc\u00ea pode entender, esta \u00e9 uma das a\u00e7\u00f5es de entrada mais frequentes enviadas pelos clientes, por isso, para economizar a largura de banda, a otimizamos para que ocupe o menor espa\u00e7o poss\u00edvel. Isso \u00e9 realizado da seguinte forma: ao selecionar cada entidade, em vez de salvar coordenadas absolutas e de alta precis\u00e3o do mapa, o jogo salva um deslocamento relativo de baixa precis\u00e3o em rela\u00e7\u00e3o \u00e0 sele\u00e7\u00e3o anterior. Isso funciona bem, pois a sele\u00e7\u00e3o com o mouse geralmente ocorre muito pr\u00f3ximo da sele\u00e7\u00e3o anterior. Devido a isso, surgem duas exig\u00eancias importantes: <i>Input Actions<\/i> nunca podem ser negligenciadas e devem ser realizadas na ordem correta. Essas exig\u00eancias s\u00e3o atendidas para <i>Game State<\/i>. Mas como a tarefa <i>Estado de lat\u00eancia<\/i> \u00e9 \"aparentar estar bom o suficiente\" para o jogador, em condi\u00e7\u00f5es de lat\u00eancia, elas n\u00e3o s\u00e3o atendidas. <i>Latency State<\/i> n\u00e3o considera <noindex><a rel=\"nofollow\" href=\"https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-302-megapacket-commit.jpg\">muitos casos limites<\/a><\/noindex>, relacionados com o atraso de ciclos e a varia\u00e7\u00e3o de lat\u00eancia na comunica\u00e7\u00e3o de ida e volta.<\/p>\n<p>Voc\u00ea j\u00e1 pode imaginar para onde tudo isso est\u00e1 indo. Finalmente, come\u00e7amos a ver as causas do problema do megapacote. A raiz do problema \u00e9 que, ao decidir se o envio do evento de mudan\u00e7a de sele\u00e7\u00e3o \u00e9 necess\u00e1rio, a l\u00f3gica de sele\u00e7\u00e3o de entidades depende de <i>Latency State<\/i>, e esse estado nem sempre cont\u00e9m informa\u00e7\u00f5es corretas. Portanto, o megapacote \u00e9 gerado mais ou menos assim:<\/p>\n<ol>\n<li>O jogador est\u00e1 enfrentando problemas de conex\u00e3o.<\/li>\n<li>Mecanismos de atraso de ciclo e regula\u00e7\u00e3o de lat\u00eancia de ida e volta entram em cena.<\/li>\n<li>A fila de estados de lat\u00eancia n\u00e3o considera esses mecanismos. Isso resulta na exclus\u00e3o prematura de algumas a\u00e7\u00f5es ou na execu\u00e7\u00e3o em uma ordem incorreta, levando a um comportamento incorreto. <i>Latency State<\/i>.<\/li>\n<li>O jogador perdeu o problema de conex\u00e3o e, para se sincronizar com o servidor, simula at\u00e9 400 ciclos.<\/li>\n<li>A cada ciclo, uma nova a\u00e7\u00e3o de mudan\u00e7a de sele\u00e7\u00e3o de entidade \u00e9 gerada e preparada para ser enviada ao servidor.<\/li>\n<li>O cliente envia ao servidor um megapacote com mais de 400 mudan\u00e7as de sele\u00e7\u00e3o de entidades (e outras a\u00e7\u00f5es: o estado de tiro, de caminhada, etc. tamb\u00e9m sofreram com esse problema).<\/li>\n<li>O servidor recebe 400 a\u00e7\u00f5es de entrada. Como n\u00e3o \u00e9 permitido ignorar nenhuma a\u00e7\u00e3o de entrada, ele exige que todos os clientes realizem essas a\u00e7\u00f5es e as envie pela rede.<\/li>\n<\/ol>\n<p>\nA ironia \u00e9 que o mecanismo destinado a economizar largura de banda acabou criando pacotes de rede enormes.<\/p>\n<p>Resolvemos esse problema corrigindo todos os casos limites de atualiza\u00e7\u00e3o e apoio \u00e0 fila de atrasos. Embora isso tenha levado um bom tempo, no final, valeu a pena implementar tudo corretamente, em vez de confiar em solu\u00e7\u00f5es r\u00e1pidas.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Megapacote: como os desenvolvedores do Factorio conseguiram resolver o problema do multiplayer com 200 jogadores | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/37812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=37812"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/28381"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=37812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=37812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=37812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}