{"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\/it\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","title":{"rendered":"MegaPacchetto: come gli sviluppatori di Factorio hanno risolto il problema del multiplayer per 200 giocatori","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"MegaPacchetto: come gli sviluppatori di Factorio hanno risolto il problema del multiplayer per 200 giocatori\" src=\"\/wp-content\/uploads\/2019\/09\/135544365299791de479555734645ef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA maggio di quest'anno ho partecipato come giocatore a <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/d_DlvkTK9hU\">KatherineOfSky, un evento MMO<\/a><\/noindex>. Ho notato che quando il numero di giocatori raggiunge un certo numero, ogni pochi minuti parte di essi \"scompare\". Fortunatamente per voi (ma non per me), ero uno di quei giocatori che si disconnettevano <b>ogni volta<\/b>, anche con una buona connessione. L'ho considerato una sfida personale e ho iniziato a cercare le cause del problema. Dopo tre settimane di debug, test e correzioni, l'errore \u00e8 finalmente stato risolto, ma questo viaggio non \u00e8 stato affatto semplice.<\/p>\n<p>Le problematiche dei giochi multiplayer sono molto difficili da tracciare. Di solito si verificano in condizioni molto specifiche riguardo ai parametri delle reti e a stati di gioco molto particolari (in questo caso, la presenza di oltre 200 giocatori). E anche quando riesci a riprodurre il problema, non \u00e8 possibile fare un debug adeguato, perch\u00e9 l'inserimento di punti di controllo ferma il gioco, confonde i timer e di solito porta alla chiusura della connessione a causa del timeout. Ma grazie alla perseveranza e a un eccellente strumento chiamato <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jagt\/clumsy\">clumsy<\/a><\/noindex> , sono riuscito a scoprire cosa stava succedendo.<\/p>\n<p>In breve: a causa di un errore e della realizzazione incompleta della simulazione dello stato di ritardo, il client si trovava a volte nella situazione di dover inviare in un solo ciclo un pacchetto di rete composto dalle azioni di input di circa 400 entit\u00e0 di gioco (noi lo chiamiamo \"megapacchetto\"). Dopodich\u00e9, il server non solo deve ricevere correttamente tutte queste azioni di input, ma deve anche inviarle a tutti gli altri client. Se hai 200 client, questo diventa rapidamente un problema. Il canale verso il server si riempie rapidamente, il che porta alla perdita di pacchetti e a un effetto a cascata di pacchetti richiesti nuovamente. Il ritardo nelle azioni di input porta poi a far s\u00ec che ancora pi\u00f9 client inizino a inviare megapacchetti, e la loro valanga diventa ancora pi\u00f9 forte. Ai client fortunati riesce di riprendersi, mentre tutti gli altri \"scompaiono\".<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"MegaPacchetto: come gli sviluppatori di Factorio hanno risolto il problema del multiplayer per 200 giocatori\" src=\"\/wp-content\/uploads\/2019\/09\/ff1a60d55eb6f5a4dc7be4b826d747f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl problema era abbastanza fondamentale e mi ci sono volute 2 settimane per risolverlo. \u00c8 piuttosto tecnico, quindi di seguito spiegher\u00f2 i dettagli tecnici succosi. Ma per cominciare, \u00e8 necessario sapere che dalla versione 0.17.54, rilasciata il 4 giugno, a causa di problemi temporanei di connessione, il multiplayer \u00e8 diventato molto pi\u00f9 stabile e la mascheratura dei ritardi \u00e8 molto meno glitchata (meno lag e teletrasporti). Inoltre, ho modificato il modo di mascherare i ritardi in combattimento e spero che, grazie a questo, siano un po' pi\u00f9 fluidi.<\/p>\n<h3>Mega pacchetto multiplayer - dettagli tecnici<\/h3>\n<p>\nSe lo si spiega in modo semplificato, il multiplayer nel gioco funziona nel seguente modo: tutti i client simulano lo stato del gioco, ricevendo e inviando solo l'input del giocatore (chiamato \"azioni di input\", <i>Input Actions<\/i>). L'obiettivo principale del server \u00e8 trasmettere <i>Input Actions<\/i> e controllare che tutti i client eseguano le stesse azioni in un dato ciclo. Puoi leggere di pi\u00f9 in questo post <noindex><a rel=\"nofollow\" href=\"https:\/\/www.factorio.com\/blog\/post\/fff-149\">FFF-149<\/a><\/noindex>.<\/p>\n<p>Poich\u00e9 il server deve prendere decisioni su quali azioni eseguire, le azioni del giocatore passano circa per questo percorso: azione del giocatore -&gt; client di gioco -&gt; rete -&gt; server -&gt; rete -&gt; client di gioco. Questo significa che ogni azione del giocatore viene eseguita solo dopo aver completato un viaggio di andata e ritorno attraverso la rete. A causa di ci\u00f2, il gioco apparirebbe incredibilmente laggoso, dunque praticamente subito dopo l'introduzione del multiplayer nel gioco fu introdotto un meccanismo di mascheratura dei ritardi. La mascheratura dei ritardi simula l'input del giocatore senza considerare le azioni degli altri giocatori e le decisioni del server.<\/p>\n<p><img decoding=\"async\" alt=\"MegaPacchetto: come gli sviluppatori di Factorio hanno risolto il problema del multiplayer per 200 giocatori\" src=\"\/wp-content\/uploads\/2019\/09\/0b66a3b07d6aa2ab1d2329d782c78615.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn Factorio c'\u00e8 uno stato di gioco <i>Game State<\/i> che rappresenta lo stato completo della mappa, del giocatore, delle entit\u00e0 e di tutto il resto. Questo \u00e8 simulato in modo deterministico in tutti i client sulla base delle azioni ricevute dal server. Lo stato di gioco \u00e8 sacro e se mai inizia a differire da quello del server o di qualsiasi altro client, si verifica una desincronizzazione.<\/p>\n<p>Inoltre <i>Game State<\/i> abbiamo uno stato di ritardo <i>Latency State<\/i>. Questo contiene un piccolo sottoinsieme dello stato principale. <i>Latency State<\/i> non \u00e8 sacro e rappresenta semplicemente un'immagine di come sar\u00e0 lo stato di gioco in futuro in base all'input dato dal giocatore. <i>Input Actions<\/i>.<\/p>\n<p>Per fare ci\u00f2, conserviamo una copia delle azioni di input <i>Input Actions<\/i> in coda dei ritardi.<\/p>\n<p><img decoding=\"async\" alt=\"MegaPacchetto: come gli sviluppatori di Factorio hanno risolto il problema del multiplayer per 200 giocatori\" src=\"\/wp-content\/uploads\/2019\/09\/31e43263d1d2bfc79700730978fcd02a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCio\u00e8, alla fine del processo, sul lato client, l'immagine appare pi\u00f9 o meno cos\u00ec:<\/p>\n<ol>\n<li>Applichiamo <i>Input Actions<\/i> tutti i giocatori a <i>Game State<\/i> come se queste azioni di input fossero state ricevute dal server.<\/li>\n<li>Rimuoviamo dalla coda dei ritardi tutti <i>Input Actions<\/i>, che, secondo il server, sono gi\u00e0 stati applicati a <i>Game State<\/i>.<\/li>\n<li>Rimuoviamo <i>Latency State<\/i> e lo ripristiniamo in modo che appaia esattamente come <i>Game State<\/i>.<\/li>\n<li>Applichiamo tutte le azioni dalla coda dei ritardi a <i>Latency State<\/i>.<\/li>\n<li>Sulla base dei dati <i>Game State<\/i> e <i>Latency State<\/i> renderizziamo il gioco per il giocatore.<\/li>\n<\/ol>\n<p>\nTutto ci\u00f2 si ripete in ogni ciclo.<\/p>\n<p>Troppo complicato? Non rilassatevi, non \u00e8 tutto. Per compensare l'instabilit\u00e0 delle connessioni Internet, abbiamo creato due meccanismi:<\/p>\n<ul>\n<li>Cicli saltati: quando il server decide che <i>Input Actions<\/i> saranno eseguiti nel ciclo di gioco, se non ha ricevuto <i>Input Actions<\/i> alcun giocatore (ad esempio, a causa di un ritardo aumentato), non aspetter\u00e0, ma notificher\u00e0 a quel client \u00abnon ho considerato i tuoi <i>Input Actions<\/i>, cercher\u00f2 di aggiungerli al ciclo successivo\u00bb. Questo \u00e8 stato fatto affinch\u00e9, a causa dei problemi di connessione (o del computer) di un giocatore, l'aggiornamento della mappa non rallenti per tutti gli altri. Va notato che <i>Input Actions<\/i> non vengono ignorati, ma semplicemente rimandati.<\/li>\n<li>Ritardo del percorso completo andata e ritorno: il server cerca di ipotizzare quale sia il ritardo nella trasmissione dei dati andata e ritorno tra client e server per ogni client. Ogni 5 secondi, se necessario, discute con il client un nuovo ritardo (a seconda di come si \u00e8 comportata la connessione in passato) e aumenta o diminuisce di conseguenza il ritardo della trasmissione dei dati andata e ritorno.<\/li>\n<\/ul>\n<p>\nQuesti meccanismi sono piuttosto semplici in s\u00e9, ma quando sono utilizzati insieme (cosa che accade spesso in caso di problemi di connessione), la logica del codice diventa difficile da gestire e piena di casi limite. Inoltre, quando entrano in gioco questi meccanismi, il server e la coda dei ritardi devono implementare correttamente il particolare <i>Input Action<\/i> denominato <i>StopMovementInTheNextTick<\/i>. Grazie a questo, in caso di problemi di connessione, il personaggio non correr\u00e0 da solo (ad esempio, sotto un treno).<\/p>\n<p>Ora \u00e8 necessario spiegarvi come funziona la selezione delle entit\u00e0. Uno dei tipi trasmessi <i>Input Action<\/i> \u2014 \u00e8 un cambiamento nello stato della selezione dell'entit\u00e0. Comunica a tutti quale entit\u00e0 il giocatore ha puntato con il cursore del mouse. Come si pu\u00f2 capire, si tratta di una delle azioni di input pi\u00f9 comuni inviate dai client, quindi per risparmiare larghezza di banda abbiamo ottimizzato il processo affinch\u00e9 occupi il minor spazio possibile. \u00c8 implementato in questo modo: durante la selezione di ogni entit\u00e0, invece di memorizzare coordinate assolute e ad alta precisione della mappa, il gioco memorizza uno spostamento relativo a bassa precisione dalla selezione precedente. Questo funziona bene perch\u00e9 la selezione col mouse avviene di solito molto vicino alla selezione precedente. Di conseguenza, ci sono due requisiti importanti: <i>Input Actions<\/i> non devono mai essere saltati e devono essere eseguiti nell'ordine corretto. Questi requisiti sono soddisfatti per <i>Game State<\/i>. Ma poich\u00e9 il compito <i>Latency state<\/i> \u00e8 quello di \"sembrare abbastanza buono\" per il giocatore, in stato di latenza non vengono soddisfatti. <i>Latency State<\/i> non tiene conto di <noindex><a rel=\"nofollow\" href=\"https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-302-megapacket-commit.jpg\">molti casi limite<\/a><\/noindex>, legati a salti di cicli e alle variazioni di latenza della trasmissione andata e ritorno.<\/p>\n<p>Puoi gi\u00e0 indovinare dove stiamo andando. Finalmente cominciamo a vedere le cause del problema del mega pacchetto. La radice del problema sta nel fatto che, nel prendere decisioni su se trasmettere o meno l'azione di cambiamento della selezione, la logica della selezione delle entit\u00e0 si basa su <i>Latency State<\/i>, e questo stato non contiene sempre informazioni corrette. Pertanto, il mega pacchetto viene generato pi\u00f9 o meno in questo modo:<\/p>\n<ol>\n<li>Il giocatore ha avuto problemi di connessione.<\/li>\n<li>Entrano in gioco meccanismi di salto dei cicli e regolazione della latenza di trasmissione andata e ritorno.<\/li>\n<li>La coda dello stato di latenza non tiene conto di questi meccanismi. Ci\u00f2 porta a una cancellazione prematura di alcune azioni o all'esecuzione in un ordine errato, causando un comportamento anomalo. <i>Latency State<\/i>.<\/li>\n<li>Il giocatore perde il problema di connessione e, per sincronizzarsi con il server, simula fino a 400 cicli.<\/li>\n<li>Ad ogni ciclo, viene generata e preparata per l'invio al server una nuova azione di cambiamento della selezione dell'entit\u00e0.<\/li>\n<li>Il client invia al server un mega pacchetto di oltre 400 cambiamenti nella selezione delle entit\u00e0 (e altre azioni: lo stato di sparo, di movimento, ecc. hanno subito anch'essi questo problema).<\/li>\n<li>Il server riceve 400 azioni di input. Poich\u00e9 non gli \u00e8 consentito saltare nemmeno un'azione di input, ordina a tutti i client di eseguire queste azioni e le invia attraverso la rete.<\/li>\n<\/ol>\n<p>\nL'ironia \u00e8 che il meccanismo progettato per risparmiare larghezza di banda del canale ha finito per creare enormi pacchetti di rete.<\/p>\n<p>Abbiamo risolto questo problema correggendo tutti i casi limite per l'aggiornamento e il supporto della coda di ritardo. Anche se ci \u00e8 voluto abbastanza tempo, alla fine ne \u00e8 valsa la pena implementare tutto correttamente, piuttosto che fare affidamento su soluzioni veloci.<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.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\/it\/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=\"it_IT\" \/>\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\/it\/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 Package: come gli sviluppatori di Factorio sono riusciti a risolvere il problema del multiplayer per 200 giocatori | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/37812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=37812"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28381"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=37812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=37812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=37812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}