{"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\/hr\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","title":{"rendered":"Megapak: kako su programeri Factorio uspjeli rije\u0161iti problem s multiplayerom za 200 igra\u010da","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Megapak: kako su programeri Factorio uspjeli rije\u0161iti problem s multiplayerom za 200 igra\u010da\" src=\"\/wp-content\/uploads\/2019\/09\/135544365299791de479555734645ef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nU svibnju ove godine sudjelovao sam kao igra\u010d na <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/d_DlvkTK9hU\">MMO doga\u0111aju KatherineOfSky<\/a><\/noindex>. Primijetio sam da kada broj igra\u010da dostigne odre\u0111eni broj, svake nekoliko minuta dio njih se 'ispu\u0161ta'. Na sre\u0107u za vas (ali ne i za mene), bio sam jedan od onih igra\u010da koji su se isklju\u010divali <b>svaki put<\/b>, \u010dak i uz dobru vezu. Uzeo sam to kao osobni izazov i po\u010deo istra\u017eivati razloge problema. Nakon tri tjedna debagiranja, testiranja i ispravki, gre\u0161ka je nap finally ispravljena, ali to putovanje nije bilo tako jednostavno.<\/p>\n<p>Problemi multiplayer igara vrlo su te\u0161ki za pra\u0107enje. Obi\u010dno se javljaju u vrlo specifi\u010dnim uvjetima mre\u017enih postavki i u vrlo specifi\u010dnim stanjima igre (u ovom slu\u010daju - u prisutnosti vi\u0161e od 200 igra\u010da). \u010cak i kada se uspije reproducirati problem, nije ga mogu\u0107e pravilno debagirati, jer umetanje kontrolnih to\u010daka zaustavlja igru, zbunjuje tajmere i obi\u010dno dovodi do prekida veze zbog isteka vremena \u010dekanja. No, zahvaljuju\u0107i upornosti i izvrsnom alatu zvanom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jagt\/clumsy\">clumsy<\/a><\/noindex> , uspio sam saznati \u0161to se doga\u0111a.<\/p>\n<p>Ukratko: zbog gre\u0161ke i nepotpune implementacije simulacije stanja ka\u0161njenja, klijent se ponekad na\u0161ao u situaciji kada je morao u jednom ciklusu poslati mre\u017eni paket koji se sastoji od akcija igra\u010da koje odabire pribli\u017eno 400 gaming entiteta (nazivamo ga 'megapak'). Nakon toga, server ne samo da mora pravilno primiti sve te ulazne akcije, nego ih i poslati svim ostalim klijentima. Ako imate 200 klijenata, to brzo postaje problem. Kanal prema serveru brzo se zagu\u0161i, \u0161to dovodi do gubitka paketa i kaskade ponovo zatra\u017eenih paketa. Odga\u0111anje ulaznih akcija tada dovodi do jo\u0161 vi\u0161e klijenata koji po\u010dinju slati megapakete, a njihova lavina postaje sve ja\u010da. Sretnim klijentima uspijeva se oporaviti, svi ostali se 'ispu\u0161taju'.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Megapak: kako su programeri Factorio uspjeli rije\u0161iti problem s multiplayerom za 200 igra\u010da\" src=\"\/wp-content\/uploads\/2019\/09\/ff1a60d55eb6f5a4dc7be4b826d747f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nProblem je bio dovoljno temeljit i trebalo mi je 2 tjedna da ga ispravim. Tehni\u010dka je priroda, pa \u0107u u nastavku objasniti so\u010dne tehni\u010dke detalje. No, prvo morate znati da je od verzije 0.17.54, objavljene 4. lipnja, multijezgarni na\u010din rada postao stabilniji, a skrivanje latencije znatno manje glitzy (manje usporavanja i teleportacija). Osim toga, promijenio sam na\u010din skrivanja latencije u borbi i nadam se da \u0107e zbog toga biti malo fluidnija.<\/p>\n<h3>Multiplayer megapak - tehni\u010dki detalji<\/h3>\n<p>\nAko pojednostavim, multiplayer u igri radi na sljede\u0107i na\u010din: svi klijenti simuliraju stanje igre, primaju\u0107i i \u0161alju\u0107i samo unos igra\u010da (koji se naziva \"unosi akcije\", <i>Input Actions<\/i>). Glavni zadatak servera je preno\u0161enje <i>Input Actions<\/i> i kontrola toga da svi klijenti izvode iste akcije u jednom ciklusu. Vi\u0161e o tome mo\u017eete pro\u010ditati u postu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.factorio.com\/blog\/post\/fff-149\">FFF-149<\/a><\/noindex>.<\/p>\n<p>Budu\u0107i da server mora donositi odluke o tome koje akcije treba izvr\u0161iti, putanja koju akcija igra\u010da prelazi je otprilike ovakva: akcija igra\u010da -&gt; klijent igre -&gt; mre\u017ea -&gt; server -&gt; mre\u017ea -&gt; klijent igre. To zna\u010di da se svaka akcija igra\u010da izvr\u0161ava tek nakon \u0161to napravi put prema naprijed i natrag kroz mre\u017eu. Zbog toga bi igra izgledala stra\u0161no usporeno, pa je gotovo odmah nakon pojave multijezgarni sustav uveden mehanizam za skrivanje latencije. Skrivenje latencije imituje unos igra\u010da bez uzimanja u obzir akcija drugih igra\u010da i dono\u0161enja odluka od strane servera.<\/p>\n<p><img decoding=\"async\" alt=\"Megapak: kako su programeri Factorio uspjeli rije\u0161iti problem s multiplayerom za 200 igra\u010da\" src=\"\/wp-content\/uploads\/2019\/09\/0b66a3b07d6aa2ab1d2329d782c78615.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nU Factorio postoji stanje igre <i>Game State<\/i> \u2014 to je potpuno stanje mape, igra\u010da, entiteta i svega ostalog. Odre\u0111eno je deterministi\u010dki simulirano u svim klijentima na temelju akcija dobivenih od servera. Stanje igre je sveto i ako ikada po\u010dne odstupati od servera ili bilo kojeg drugog klijenta, nastaje nesinkronizacija.<\/p>\n<p>Osim <i>Game State<\/i> imamo stanje latencije <i>Latency State<\/i>. Sadr\u017ei mali podskup osnovnog stanja. <i>Latency State<\/i> nije sveto i jednostavno predstavlja sliku o tome kako \u0107e izgledati stanje igre u budu\u0107nosti na temelju unosa igra\u010da <i>Input Actions<\/i>.<\/p>\n<p>Za to \u010duvamo kopiju kreiranih <i>Input Actions<\/i> u redu za latenciju.<\/p>\n<p><img decoding=\"async\" alt=\"Megapak: kako su programeri Factorio uspjeli rije\u0161iti problem s multiplayerom za 200 igra\u010da\" src=\"\/wp-content\/uploads\/2019\/09\/31e43263d1d2bfc79700730978fcd02a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa kraju procesa klijentova slika izgleda otprilike ovako:<\/p>\n<ol>\n<li>Primjenjujemo <i>Input Actions<\/i> sve akcije na <i>Game State<\/i> onako kako su te ulazne radnje primljene sa servera.<\/li>\n<li>Uklanjamo iz reda ka\u0161njenja sve <i>Input Actions<\/i>, koje su, prema podacima sa servera, ve\u0107 primijenjene na <i>Game State<\/i>.<\/li>\n<li>Bri\u0161emo <i>Latency State<\/i> i resetiramo ga kako bi izgledalo upravo onako kako i <i>Game State<\/i>.<\/li>\n<li>Primjenjujemo sve akcije iz reda ka\u0161njenja na <i>Latency State<\/i>.<\/li>\n<li>Na temelju podataka <i>Game State<\/i> i <i>Latency State<\/i> renderiramo igru igra\u010du.<\/li>\n<\/ol>\n<p>\nSve se to ponavlja u svakom taktu.<\/p>\n<p>Prekomplicirano? Ne opu\u0161tajte se, to jo\u0161 nije sve. Kako bismo nadoknadili nepouzdanost internetskih veza, stvorili smo dva mehanizma:<\/p>\n<ul>\n<li>Propu\u0161teni taktovi: kada server odlu\u010di da <i>Input Actions<\/i> \u0107e biti izvr\u0161eni u igra\u010dkom taktu, ukoliko ne primi <i>Input Actions<\/i> neke igra\u010de (na primjer, zbog pove\u0107ane ka\u0161njenja), ne \u0107e \u010dekati, ve\u0107 \u0107e obavijestiti tog klijenta \"nisam uzeo u obzir va\u0161e <i>Input Actions<\/i>, poku\u0161at \u0107u ih dodati u sljede\u0107i takt.\" To je napravljeno kako bi a\u017euriranje karte zbog problema s vezom (ili ra\u010dunalom) jednog igra\u010da nije usporavalo sve ostale. Treba napomenuti da <i>Input Actions<\/i> se ne ignoriraju, ve\u0107 jednostavno odga\u0111aju.<\/li>\n<li>Ka\u0161njenje cijelog putovanja od kraja do kraja: server poku\u0161ava pretpostaviti kolika je ka\u0161njenje u prijenosu podataka od kraja do kraja izme\u0111u klijenta i servera za svakog klijenta. Svakih 5 sekundi, prema potrebi, raspravlja s klijentom o novoj ka\u0161njenju (ovisno o tome kako se pona\u0161ala veza u pro\u0161losti), i odgovaraju\u0107e pove\u0107ava ili smanjuje ka\u0161njenje prijenosa podataka.<\/li>\n<\/ul>\n<p>\nOvi mehanizmi sami po sebi su prili\u010dno jednostavni, ali kada se koriste zajedno (\u0161to se \u010desto doga\u0111a kod problema s povezivanjem), logika koda postaje te\u0161ka za upravljanje i ima mnogo rubnih slu\u010dajeva. Osim toga, kada ovi mehanizmi do\u0111u u igru, server i red \u010dekanja ka\u0161njenja moraju ispravno implementirati poseban <i>Input Action<\/i> naziv <i>StopMovementInTheNextTick<\/i>. Zbog toga, u slu\u010daju problema s vezom, lik ne\u0107e sam od sebe tr\u010dati (na primjer, pod vlak).<\/p>\n<p>Sada vam trebam objasniti kako radi odabir entiteta. Jedan od prenosivih tipova <i>Input Action<\/i> \u2014 to je promjena stanja izbora entiteta. To obavje\u0161tava sve o kojoj entitet igra\u010d usmjerava mi\u0161. Kao \u0161to se mo\u017ee primijetiti, to je jedna od naj\u010de\u0161\u0107ih unosa koje klijenti \u0161alju, stoga smo optimizirali kako bi zauzimalo \u0161to manje propusnosti. To je implementirano tako da umjesto spremanja apsolutnih, visokopreciznih koordinata karte, igra pohranjuje niskoprecizni relativni pomak od prethodnog izbora. To dobro funkcionira jer se odabir mi\u0161em obi\u010dno doga\u0111a vrlo blizu prethodnog odabira. Iz toga proizlaze dva va\u017ena zahtjeva: <i>Input Actions<\/i> nikada se ne smiju presko\u010diti i moraju se izvr\u0161avati u ispravnom redoslijedu. Ti zahtjevi se zadovoljavaju za <i>Game State<\/i>. Ali budu\u0107i da je izazov <i>Stanje latencije<\/i> u tome da \u201eizgleda dovoljno dobro\u201c za igra\u010da, u stanju latencija oni nisu zadovoljeni. <i>Latency State<\/i> ne uzima u obzir <noindex><a rel=\"nofollow\" href=\"https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-302-megapacket-commit.jpg\">mnoge rubne slu\u010dajeve<\/a><\/noindex>, vezane uz preskakanje takta i promjene latencije prijenosa naprijed-natrag.<\/p>\n<p>Ve\u0107 mo\u017eete naslutiti kuda ovo vodi. Napokon po\u010dinjemo vidjeti uzroke problema megapaketa. Korijen problema le\u017ei u tome \u0161to odluka o tome treba li prenijeti radnju promjene izbora oslanja se na <i>Latency State<\/i>, a to stanje ne sadr\u017ei uvijek to\u010dne informacije. Stoga se megapaketi generiraju pribli\u017eno ovako:<\/p>\n<ol>\n<li>Igra\u010d se suo\u010dava s problemima s vezom.<\/li>\n<li>U igru ulaze mehanizmi preskakanja taktova i regulacije latencije prijenosa naprijed-natrag.<\/li>\n<li>Red stanja latencija ne uzima u obzir te mehanizme. To dovodi do toga da se neki radnje uklanjaju prerano ili se izvr\u0161avaju u pogre\u0161nom redoslijedu, \u0161to rezultira neto\u010dnim <i>Latency State<\/i>.<\/li>\n<li>Igra\u010d gubi problem s vezom i simulira do 400 taktova kako bi sustigao poslu\u017eitelj.<\/li>\n<li>U svakom takt generira se i priprema za slanje na poslu\u017eitelj nova radnja promjene izbora entiteta.<\/li>\n<li>Klijent \u0161alje poslu\u017eitelju megapaketi s vi\u0161e od 400 promjena izbora entiteta (i s drugim akcijama: stanje pucanja, hodanja itd. tako\u0111er su patili od ovog problema).<\/li>\n<li>Poslu\u017eitelj prima 400 ulaznih akcija. Budu\u0107i da mu nije dopu\u0161teno presko\u010diti nijednu ulaznu akciju, nare\u0111uje svim klijentima da izvr\u0161e te akcije i \u0161alje ih putem mre\u017ee.<\/li>\n<\/ol>\n<p>\nIronija je u tome \u0161to je mehanizam, koji je trebao u\u0161tedjeti propusnost kanala, zapravo stvarao ogromne mre\u017ene pakete.<\/p>\n<p>Rije\u0161ili smo ovaj problem ispraviv\u0161i sve rubne slu\u010dajeve a\u017euriranja i podr\u0161ke reda ka\u0161njenja. Iako je to trajalo prili\u010dno dugo, na kraju se isplatilo sve pravilno implementirati, umjesto da se oslanjamo na brze hackove.<br \/>\n<br \/>Izvor: <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.4 - 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\/hr\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Megapak: kako su developeri Factorio uspjeli rije\u0161iti problem s multiplayerom za 200 igra\u010da | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/hr\/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":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/37812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=37812"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/37812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/28381"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=37812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=37812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=37812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}