{"id":89303,"date":"2020-07-22T01:42:30","date_gmt":"2020-07-21T23:42:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency"},"modified":"2020-07-22T01:42:30","modified_gmt":"2020-07-21T23:42:30","slug":"oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","title":{"rendered":"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/Voximplant\/blog\/511626\/\"><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/22dbf7665d7fded15671d98a2afe599b.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\nTeenus nagu programm, infrastruktuur nagu teenus, platvorm nagu teenus, kommunikatsiooniplatvorm nagu teenus, videokonverentsid nagu teenus, aga kuidas oleks pilvem\u00e4ngudega kui teenusega? Mitmeid katseid pilvem\u00e4ngude loomiseks (Cloud Gaming) on juba tehtud, n\u00e4iteks Google'i hiljuti k\u00e4ivitatud Stadia. <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/avtlQeaxd_I?t=440\">ei ole WebRTC-d j\u00e4lgiv algaja.<\/a><\/noindex>, aga kas teised saavad WebRTC-d sama h\u00e4sti kasutada?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Thanh Nguyen otsustas uurida seda v\u00f5imalust oma avatud koodiga projektis CloudRetro. CloudRetro p\u00f5hineb Pionil, <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/webrtc-open-source-most-popular\/\">populaarsel<\/a><\/noindex> WebRTC teegil Go p\u00f5hjal (t\u00e4nud <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Sean-Der\">Shonile<\/a><\/noindex> Pioni arendajate meeskonnast abi eest selle artikli koostamisel). Antud artiklis annab Thanh \u00fclevaate oma projekti arhitektuurist ning r\u00e4\u00e4gib, mida kasulikku ta \u00f5ppis ja millega v\u00e4ljakutsetega silmitsi seisis.<\/p>\n<h2>Sissejuhatus<\/h2>\n<p>\nEelmisel aastal, kui Google kuulutas v\u00e4lja Stadia, olin ma absoluutselt h\u00e4mmingus. Idee on nii ainulaadne ja innovatsiooniline, et ma k\u00fcsisin endalt pidevalt, kuidas see \u00fcldse on v\u00f5imalik olemasolevate tehnoloogiate juures. Soov s\u00fcgavamalt sellesse teemasse s\u00fcveneda ajendas mind looma oma versiooni avatud koodiga pilvem\u00e4ngust. Tulemuseks oli lihtsalt fantastiline. Allpool soovin jagada oma aastase <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">projekti<\/a><\/noindex>.<\/p>\n<p><i>TLDR: l\u00fchike slaidiversioon peamiste punktidega<\/i><\/p>\n<h3>Miks on pilvem\u00e4ngude tulevik<\/h3>\n<p>\nUsun, et pilvem\u00e4ngud saavad peagi uueks p\u00f5lvkonnaks mitte ainult m\u00e4ngude, vaid ka muudes infotehnoloogia valdkondades. Pilvem\u00e4ngud on klient\/server mudeli tipp. Selline mudel maksimeerib tagapaneeli juhtimise ja minimaalselt v\u00e4hendab esipaneeli t\u00f6\u00f6d, paigutades m\u00e4ngu loogika kaugs serverisse ning edastades pilte\/heli kliendile. Server teostab rasked arvutused, mist\u00f5ttu klient ei s\u00f5ltu enam riistvaralistest piirangutest.<\/p>\n<p>Google Stadia v\u00f5imaldab sisuliselt m\u00e4ngida <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/AAA_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B)\">AAA-m\u00e4nge<\/a><\/noindex> (st k\u00f5rgekvaliteedilisi m\u00e4ngu v\u00f5i suurt\u00fckim\u00e4ngu) erinevatel platvormidel sarnase liidese kaudu nagu YouTube. Sama meetodit saab rakendada ka teistele intensiivsetele offline rakendustele, nagu operatsioonis\u00fcsteem v\u00f5i 2D\/3D graafiline kujundus jne, et saaksime neid stabiilselt k\u00e4ivitada madala tehnilise spetsifikatsiooniga seadmetes.<\/p>\n<p><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/d6ca3e47db5c8e3d9880b304cc3be33b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelle tehnoloogia tulevik: kas suudate kujutada, et Microsoft Windows 10 t\u00f6\u00f6tab Chrome'i brauseris?<\/p>\n<h3>Pilvem\u00e4ngud on tehniliselt keerulised<\/h3>\n<p>\nM\u00e4ngimine on \u00fcks neist haruldastest valdkondadest, kus kasutaja pidev kiire reaktsioon on h\u00e4davajalik. Kui aeg-ajalt kohtame lehek\u00fcljel klikkides 2 sekundi viivitust, ei ole see probleemne. Reaalajas videovood j\u00e4\u00e4vad tavaliselt paar sekundit maha, kuid pakuvad ikkagi piisavat kasutusmugavust. Siiski, kui m\u00e4ng viibib pidevalt 500 ms, on m\u00e4ngimine lihtsalt v\u00f5imatu. Meie eesm\u00e4rk on saavutada \u00e4\u00e4rmiselt madal viivitus, et sisendi ja meedia vahe oleks v\u00f5imalikult v\u00e4ike. Seet\u00f5ttu ei ole traditsiooniline l\u00e4henemine voogedastusele siin rakendatav.<\/p>\n<p><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/d73765a3c9277c026f407883e1091473.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00dcldine pilootmudel pilve m\u00e4ngimiseks<\/p>\n<h2>Avatud l\u00e4htekoodiga projekt CloudRetro<\/h2>\n<p>\nOtsustasin luua pilve m\u00e4ngimise testversiooni, et kontrollida, kas see on v\u00f5imalik selliste karmide v\u00f5rgu piirangute korral. Kontseptsiooni testimiseks valisin Golangi, kuna see on mulle k\u00f5ige tuttavam keel ja sobib selle rakendamiseks paljuski paremini, nagu selgus hiljem. Go on lihtne ja areneb v\u00e4ga kiiresti; Go kanalid sobivad suurep\u00e4raselt mitme l\u00f5ime juhtimiseks.<\/p>\n<p>Projekt <noindex><a rel=\"nofollow\" href=\"http:\/\/cloudretro.io\/\">CloudRetro.io<\/a><\/noindex> \u2013 avatud l\u00e4htekoodiga pilve m\u00e4ngimise teenus retro-m\u00e4ngude jaoks. Projekti eesm\u00e4rk on tuua traditsioonilistesse retro-m\u00e4ngudesse k\u00f5ige mugavam m\u00e4ngukogemus ja lisada mitmikm\u00e4ng.<br \/>\nProjekti kohta saab l\u00e4hemalt lugeda siit: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">https:\/\/github.com\/giongto35\/cloud-game<\/a><\/noindex>.<\/p>\n<h3>CloudRetro funktsionaalsus<\/h3>\n<p>\nCloudRetro demonstreerib pilve m\u00e4ngimise kogu v\u00f5imet retro-m\u00e4ngude abil. See v\u00f5imaldab saada palju unikaalseid m\u00e4ngukogemusi.<\/p>\n<ul>\n<li>M\u00e4ngu kaasaskantavus\n<ul>\n<li>Hetkeline m\u00e4ngimine lehe avamisel; laadimist ja installimist ei ole vaja<\/li>\n<li>T\u00f6\u00f6tab mobiilibrauseris, seega ei ole k\u00e4ivitamiseks vajalik \u00fchtegi tarkvara<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>M\u00e4nguseansse saab jagada mitme seadme vahel ja salvestada pilve j\u00e4rgmise sisenemise jaoks<\/li>\n<li>M\u00e4ngu saab voogedastada v\u00f5i m\u00e4ngida seda samal ajal mitme kasutajaga:\n<ul>\n<li>Crowdplay, nagu TwitchPlayPokemon, kuid rohkem platvormidevaheline ja reaalajas<\/li>\n<li>M\u00e4nge saab m\u00e4ngida ka offline re\u017eiimis. Palju m\u00e4ngijaid saavad m\u00e4ngida, ilma et v\u00f5rk peaks olema seadistatud. CloudRetro's saab n\u00fc\u00fcd Samurai Shodownis m\u00e4ngida 2 m\u00e4ngijat v\u00f5rgu kaudu<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/bdc715971755d669a026f830ce888520.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMitmikm\u00e4nguline online m\u00e4ngude demoversioon erinevates seadmetes<\/p>\n<h2>Infrastruktuur<\/h2>\n<p><\/p>\n<h3>N\u00f5uded ja tehnoloogia virn<\/h3>\n<p>\nAllpool on loetelu n\u00f5uetest, mille seadsin enne projekti alustamist.<\/p>\n<p><b>1. \u00dcks m\u00e4ngija<\/b><br \/>\nSee n\u00f5ue v\u00f5ib alguses tunduda mitte eriti oluline ja ilmselge, kuid see on minu peamine j\u00e4reldus, et pilvem\u00e4ngud saaksid v\u00f5imalikult kaugel traditsioonilistest voogedastusteenustest. Kui keskendume \u00fchekohalistele m\u00e4ngudele, saame loobuda tsentraliseeritud serverist v\u00f5i CDN-ist, kuna meil pole vaja edastada vooge massidele. Selle asemel, et vooge laadida kopsakasse serverisse v\u00f5i edastada pakette tsentraliseeritud WebSocket serverisse, saadetakse teenusevood otse kasutajale l\u00e4bi peer-to-peer WebRTC \u00fchenduse.<\/p>\n<p><b>2. Madala latentsusega meediastruktuur<\/b><br \/>\nLugedes Stadia kohta, satun tihti kokku m\u00f5ningate artiklite mainimisega WebRTC-st. M\u00f5istsin, et WebRTC on silmapaistev tehnoloogia ning sobib suurep\u00e4raselt pilvem\u00e4ngude kasutamiseks. WebRTC on projekt, mis v\u00f5imaldab veebibrauserid ja mobiilirakendused reaalajas suhtlemist lihtsa API kaudu. See pakub v\u00f5rgu\u00fchendust, mis on optimeeritud meedia ja sisaldab sisseehitatud standardkoodekeid, nagu VP8 ja H264.<\/p>\n<p>Olen eelistanud tagada kasutajatele v\u00f5imalikult mugava t\u00f6\u00f6, mitte k\u00f5rge graafikakvaliteedi s\u00e4ilitamist. Algoritmis on lubatud teatud kaotused. Google Stadia-s on lisasamm pildikvaliteedi v\u00e4hendamiseks serveris, ja kaadrid skaleeritakse enne edastamist v\u00f5rgu\u00fchenduse s\u00f5lmedele k\u00f5rgemale kvaliteedile.<\/p>\n<p><b>3. Jagatud infrastruktuur geograafilise marsruudiga<\/b><br \/>\n\u00dcksk\u00f5ik kui optimeeritud ka algoritm on, j\u00e4\u00e4b v\u00f5rk ikkagi m\u00e4\u00e4ravaks teguriks, mis k\u00f5ige rohkem panustab latentsusesse. Arhitektuuril peab olema mehhanism, et siduda l\u00e4him kasutajale server, et v\u00e4hendada edastusaega (RTT). Arhitektuuril peab olema 1 koordinaator ja mitmed voogedastusserverid, mis on jaotatud kogu maailma: L\u00e4\u00e4ne-USA, Ida-USA, Euroopa, Singapore, Hiina. K\u00f5ik voogedastusserverid peavad olema t\u00e4ielikult isoleeritud. S\u00fcsteem v\u00f5ib oma jaotust kohandada, kui server liitub v\u00f5i lahkub v\u00f5rgust. Seega v\u00f5imaldab suure liikluse korral t\u00e4iendavate serverite lisamine horisontaalset skaleerimist.<\/p>\n<p><b>4. Brauseri \u00fchilduvus<\/b><br \/>\nPilvemuudid tulevad parimal viisil esitlemisele, kui need n\u00f5uavad kasutajatelt minimaalset pingutust. See t\u00e4hendab, et m\u00e4ngimist on v\u00f5imalik alustada otse brauseris. Brauserid aitavad muuta m\u00e4ngukogemuse kasutajatele maksimaalselt mugavaks, vabastades nad tarkvara ja riistvara paigaldamise kohustusest. Samuti aitavad brauserid tagada platvormidevahelist \u00fchilduvust mobiilsete ja lauaversioonide vahel. \u00d5nneks toetab WebRTC suurep\u00e4raselt erinevaid brausereid.<\/p>\n<p><b>5. Selge m\u00e4nguliidese ja teenuse eristus<\/b><br \/>\nMa k\u00e4sitlen pilvm\u00e4nguteenust platvormina. Igal inimesel peaks olema v\u00f5imalus platvormiga \u00fchendada mida iganes. Praegu olen integreerinud <noindex><a rel=\"nofollow\" href=\"http:\/\/LibRetro\">LibRetro<\/a><\/noindex> pilve-m\u00e4nguteenusega, kuna LibRetro pakub ilusat m\u00e4nguemulaatori liidest retro-m\u00e4ngude m\u00e4ngimiseks, nagu SNES, GBA, PS.<\/p>\n<p><b>6. Mitme m\u00e4ngija ruumid, crowd play ja s\u00fcgava lingiga \u00fchendamine m\u00e4nguga<\/b><br \/>\nCloudRetro toetab palju uusi m\u00e4nguviise, nagu CrowdPlay ja online mitme m\u00e4ngija re\u017eiim retro-m\u00e4ngude jaoks. Kui mitu kasutajat avavad sama s\u00fcgava lingi erinevates arvutites, n\u00e4evad nad sama k\u00e4igitavat m\u00e4ngu ja saavad isegi liituda sellega.<\/p>\n<p>Veelgi enam, m\u00e4ngu seisud salvestatakse pilve. See v\u00f5imaldab kasutajatel j\u00e4tkata m\u00e4ngimist igal ajal mistahes teisel seadmel.<\/p>\n<p><b>7. Horisontaalne skaleerimine<\/b><br \/>\nNagu k\u00f5ik SAAS-id t\u00e4nap\u00e4eval, peavad pilvm\u00e4ngud olema kavandatud horisontaalselt skaleeritavateks. 'Koordinaatori-t\u00f6\u00f6taja' konstruktsioon v\u00f5imaldab lisada rohkem t\u00f6\u00f6tajaid, et teenindada suuremat liiklust.<\/p>\n<p><b>8. Pole sidumist \u00fche pilvteenusega<\/b><br \/>\nCloudRetro infrastruktuur on paigutatud erinevatesse pilveteenustesse (Digital Ocean, Alibaba, kohandatud pakkuja) erinevates piirkondades. Ma aktiveerin konteineris Docker k\u00e4ivitamise infrastruktuuri jaoks ja seadistan v\u00f5rgu parameetrid bash-skripti abil, et v\u00e4ltida s\u00f5ltuvust \u00fchest pilveteenustest. Kombineerides selle NAT Traversal'iga WebRTC-s, saame paindlikkuse CloudRetro juurutamiseks igasugustes pilveplatvormides ja isegi iga kasutaja masinates.<\/p>\n<h3>Arhitektuurne disain<\/h3>\n<p>\n<b>T\u00f6\u00f6taja:<\/b> (v\u00f5i voogesituse server, nagu mainitud eespool) kopeerib m\u00e4nge, k\u00e4itab kodeerimisvoogu ja edastab kodeeritud meedia kasutajatele. T\u00f6\u00f6taja instantsid jaotuvad \u00fcle kogu maailma ning iga t\u00f6\u00f6taja suudab samal ajal t\u00f6\u00f6delda mitut kasutaja seanssi.<\/p>\n<p><b>Koordinaator:<\/b> vastutab uue kasutaja sidumise eest k\u00f5ige sobivama t\u00f6\u00f6tajaga voogesitamiseks. Koordinaator suhtleb t\u00f6\u00f6tajatega l\u00e4bi WebSocketi.<\/p>\n<p><b>M\u00e4ngu olekute salvestamine:<\/b> keskne kaugsalvestus k\u00f5igi m\u00e4ngu olekute jaoks. See salvestus tagab sellised olulised funktsioonid nagu n\u00e4iteks kaug-salvestamine\/laadimine.<\/p>\n<p><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/985447b81350a640b0bd1344b5705113.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCloudRetro \u00f6verstruktuur<\/p>\n<h3>Kasutajaskripti<\/h3>\n<p>\nKui uus kasutaja avab CloudRetro sammudel 1 ja 2, nagu alloleval joonisel n\u00e4ha, k\u00fcsitakse koordinaatorilt koos saadaval olevate t\u00f6\u00f6tajate nimekirjaga esimesel lehek\u00fcljel. P\u00e4rast seda arvutab klient k\u00f5ikide kandidaatide latentsuse sammul 3 HTTP-p\u00e4ringu pingiga. See latentsuse nimekiri saadetakse seej\u00e4rel tagasi koordinaatorile, et ta saaks m\u00e4\u00e4rata k\u00f5ige sobivama t\u00f6\u00f6taja kasutaja teenindamiseks. Sammul 4 allpool luuakse m\u00e4ng. Kasutaja ja m\u00e4\u00e4ratud t\u00f6\u00f6taja vahel luuakse voogesituse WebRTC \u00fchendus.<br \/>\n<img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/00199b5942e3e4314609ec0e70ea7162.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKasutajaskripti juures, p\u00e4rast juurdep\u00e4\u00e4su saamist<\/p>\n<h3>Mis on t\u00f6\u00f6taja sees<\/h3>\n<p>\nM\u00e4ngu ja voogesituse vood hoitakse t\u00f6\u00f6taja sees eraldatult ning vahetavad seal teavet liidese kaudu. Praegu toimub see \u00fchendus andmete edastamise kaudu m\u00e4llu <noindex><a rel=\"nofollow\" href=\"https:\/\/tour.golang.org\/concurrency\/2\">Golang kanalites<\/a><\/noindex> samameelses protsessis. J\u00e4rgmine eesm\u00e4rk on segregatsioon, st s\u00f5ltumatu m\u00e4ng k\u00e4ivitades teises protsessis.<\/p>\n<p><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/7a90ec2638344467a34604cd4322165c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nT\u00f6\u00f6taja komponentide interaktsioon<\/p>\n<p>Peamised koostisosad:<\/p>\n<ul>\n<li><b>WebRTC:<\/b> kliendikomponent, mis v\u00f5tab kasutaja sisendi ja edastab serverilt kodeeritud meedia.\n<\/li>\n<li><b>M\u00e4ngu emulaator:<\/b> m\u00e4ngu komponent. Libretro raamatukogu abil suudab s\u00fcsteem m\u00e4ngu k\u00e4ivitada samas protsessis ning sisemiselt salvestada meedia ja sisendvoo.\n<\/li>\n<li>M\u00e4ngu raame salvestatakse ja saadetakse kodeerijale.\n<\/li>\n<li><b>Pilt\/heli kodeerija:<\/b> kodeerimisvoog, mis v\u00f5tab meedia raame, kodeerib neid taustal ja edastab kodeeritud pilte\/heli.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Rakendamine<\/h2>\n<p>\nCloudRetro toetub WebRTC-le kui peamisele tehnoloogiale, seega enne, kui s\u00fcvenen Golangi rakendusse, otsustasin r\u00e4\u00e4kida WebRTC-st endast. See on suurep\u00e4rane tehnoloogia, mis on mind palju aidanud saavutada andmevoogude edastamise viivitus vaid murdosa sekundist.<\/p>\n<h3>WebRTC<\/h3>\n<p>\nWebRTC on m\u00f5eldud kvaliteetsete peer-to-peer \u00fchenduste tagamiseks natiivsetes mobiilirakendustes ja brauserites lihtsate API-de kaudu.<\/p>\n<h4>NAT Traversal <\/h4>\n<p>\nWebRTC on tuntud oma NAT Traversal funktsionaalsuse poolest. WebRTC on loodud peer-to-peer suhtluseks. Selle eesm\u00e4rk on leida sobivaim otse\u00fchendus, v\u00e4ltides NAT-gate\u2019e ja tulem\u00fc\u00fcre peer-to-peer suhtluseks protsessi k\u00e4igus, mida nimetatakse <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/trickle-ice\/\">ICE<\/a><\/noindex>. Selle protsessi k\u00e4igus leiavad WebRTC API-d teie avaliku IP-aadressi STUN-serverite kaudu ja edastavad selle edasi edastusserverile (<noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/?s=turn\">TURN<\/a><\/noindex>), kui otsest \u00fchendust ei suudeta luua.<\/p>\n<p>Kuid CloudRetro ei kasuta t\u00e4ielikult seda v\u00f5imalust. Selle peer-to-peer \u00fchendused ei toimu kasutajate vahel, vaid kasutajate ja pilveserverite vahel. Serveri mudeli osal on v\u00e4hem piiranguid otsese suhtluse jaoks kui tavalise kasutaja seadmel. See v\u00f5imaldab avada sissep\u00e4\u00e4su porte v\u00f5i kasutada avalikke IP-aadresse otse, kuna server ei asu NAT-i taga.<\/p>\n<p>Varem tahtsin muuta projekti m\u00e4ngude levitamise platvormiks Cloud Gamingu jaoks. Idee oli v\u00f5imaldada m\u00e4ngude loojatel pakkuda m\u00e4nge ja voogedastusressursse. Kasutajad suhtleksid otse teenusepakkujatega. Sellises detsentraliseeritud mooduses on CloudRetro lihtsalt keskkond kolmandate osapoolte voogedastusressursside \u00fchendamiseks kasutajatega, mis muudab selle skaleeritavamaks, kui see ei ole enam hostimise koormatud. WebRTC NAT Traversali roll on siin v\u00e4ga oluline, et h\u00f5lbustada peer-to-peer \u00fchenduse loomist kolmandate osapoolte voogedastusressurssidega, mis lihtsustab looja \u00fchendamist v\u00f5rku.<\/p>\n<h4>Videote s\u00fcrvendamine<\/h4>\n<p>\nVideotehnoloogia kokkusurumine on kriitiline osa t\u00f6\u00f6voost, mis m\u00e4ngib suurt rolli voo sujuvuses. Kuigi ei ole vajalik teada k\u00f5iki VP8\/H264 kodeerimise \u00fcksikasju, aitab m\u00f5istmine m\u00f5ista voogesituse videokiirusparameetreid, lahendada ootamatuid k\u00e4itumisi ja kohandada viivitust.<\/p>\n<p>Videotehnoloogia kokkusurumine voogedastusteenuse jaoks on keeruline \u00fclesanne, kuna algoritm peab tagama, et kodeerimise aeg + edastamisaeg + dekodeerimisaeg oleks v\u00f5imalikult v\u00e4ike. Lisaks peab kodeerimisprotsess olema j\u00e4rjepidev ja katkematu. M\u00f5ned vastastikused j\u00e4releandmised kodeerimisel ei tule k\u00f5ne alla \u2013 n\u00e4iteks ei saa me eelistada pikka kodeerimisaega v\u00e4iksemale failisuurusele ja dekodeerimisaegale v\u00f5i kasutada j\u00e4rjepidevat kokkusurumist.<\/p>\n<p>Videotehnoloogia kokkusurumise idee on j\u00e4tta k\u00f5rvale tarbetud bitid teabest, s\u00e4ilitades samal ajal lubatud t\u00e4psuse taseme kasutajatele. Lisaks \u00fcksikute staatiliste piltide kodeerimisele teeb algoritm j\u00e4reldusi praeguse kaadriga eelneva ja j\u00e4rgmise kaadri p\u00f5hjal, edastades seega ainult nende erinevuse. Nagu n\u00e4ha Pacmani n\u00e4itest, edastatakse ainult diferentsiaalsed punktid.<\/p>\n<p><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/e452c54c53ab7797b610620aefbba8d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVideokaadrite v\u00f5rdlemine Pacmani n\u00e4itel<\/p>\n<h4>Heli kokkusurumine<\/h4>\n<p>\nSarnaselt videotehnoloogia kokkusurumisega, loob heli kokkusurimise algoritm andmeid, mida inimene ei suuda tajuda. Opus on hetkel parim t\u00f6\u00f6tav helikooder. See on v\u00e4lja t\u00f6\u00f6tatud helilainete edastamiseks j\u00e4rjepideva andmevoo protokolli, nagu RTP (Real Time Transport Protocol \u2013 reaalajas edastusprotokoll), kaudu. Selle latentsus on v\u00e4iksem kui mp3-l ja aac-l, samas kui kvaliteet on k\u00f5rgem. Latentsus on tavaliselt umbes 5\u201366,5 ms.<\/p>\n<h4>Pion, WebRTC Golangis<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pion\/webrtc\">Pion<\/a><\/noindex> on avatud l\u00e4htekoodiga projekt, mis toob WebRTC Golangi. Erinevalt tavap\u00e4rasest natiivsete C++ WebRTC teekide kirjutamisest on Pion WebRTC natiivne Golangi teostus, millel on parem j\u00f5udlus, Go-iga integreerimine ning versioonihaldus WebRTC protokollide jaoks.<\/p>\n<p>Raamatukogu v\u00f5imaldab ka edastada andmeid suure mahtude suurep\u00e4raste sisseehitatud moodulitega, mille latentsus on alla sekundi. Sellel on oma STUN, DTLS, SCTP jne teostus ning m\u00f5ned eksperimendid QUICi ja WebAssemblyga. See avatud l\u00e4htekoodiga raamatukogu on t\u00f5eliselt hea \u00f5ppimise allikas koos suurep\u00e4rase dokumentatsiooni, v\u00f5rgu protokollide teostuse ja toredate n\u00e4idistega.<\/p>\n<p>Pioni kogukond, mida juhib v\u00e4ga kirglik looja, on \u00fcsna elav ja seal toimub palju kvaliteetseid arutelusid WebRTCi kohta. Kui sind huvitab see tehnoloogia, liitu <noindex><a rel=\"nofollow\" href=\"http:\/\/pion.ly\/slack\">http:\/\/pion.ly\/slack<\/a><\/noindex> \u2013 \u00f5pid palju uut.<\/p>\n<h3>CloudRetro kirjutamine Golangis<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/f85f7b8ea579fab964d870aad698c7e7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWorker'i teostamine Go-s<\/p>\n<h4>Go kanalid tegevuses<\/h4>\n<p>\nGo kanalite kauni disaini t\u00f5ttu lihtsustatakse oluliselt s\u00fcndmuste voogedastamise ja paralleelsuse probleeme. Nagu diagrammil, t\u00f6\u00f6tavad erinevates GoRoutines samaaegselt mitmed komponendid. Iga komponent haldab oma olekut ja suhtleb kanalite kaudu. Golangi valikuline v\u00e4ide sunnib t\u00f6\u00f6tlema \u00fcksikute aatomite s\u00fcndmusi iga m\u00e4ngu ajal (game tick). See t\u00e4hendab, et sellise disaini korral ei ole lukustamine vajalik. N\u00e4iteks, kui kasutaja salvestab, on vajalik kogu m\u00e4ngu oleku snapshot. See olek peab olema j\u00e4rjepidev, teostades sisendi kuni salvestamine on l\u00f5petatud. Iga m\u00e4ngu tick'i ajal saab backend t\u00f6\u00f6delda ainult salvestus- v\u00f5i sisendoperatsiooni, mis teeb protsessi \u00fcheselt turvaliseks.<\/p>\n<pre><code class=\"go\">func (e *gameEmulator) gameUpdate() {\nfor {\n\tselect {\n\t\tcase &lt;-e.saveOperation:\n\t\t\te.saveGameState()\n\t\tcase key := &lt;-e.input:\n\t\t\te.updateGameState(key)\n\t\tcase &lt;-e.done:\n\t\t\te.close()\n\t\t\treturn\n\t}\n    }\n}<\/code><\/pre>\n<p><\/p>\n<h4>Fan-in \/ Fan-out<\/h4>\n<p>\nSee Golangi malle sobib suurep\u00e4raselt minu CrowdPlay ja Mitme m\u00e4ngija kasutusjuhtumiteks. Selle mustri j\u00e4rgimisel voogedastatakse k\u00f5ik kasutaja sisendid \u00fchte tuuma sisendkanalisse. M\u00e4ngu meedia edastatakse seej\u00e4rel k\u00f5igile \u00fches ruumis olevatele kasutajatele. Nii saavutame m\u00e4ngu oleku jagamise mitme erineva kasutaja m\u00e4nguseansi vahel.<\/p>\n<p><img decoding=\"async\" alt=\"Pilvegaming avatud koodiga WebRTC-l: p2p, mitme m\u00e4ngijaga, null latentsus.\" src=\"\/wp-content\/uploads\/2020\/07\/000a495d7f214246a8a396aab11a3ac5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS\u00fcnkroonimine erinevate seansside vahel<\/p>\n<h4>Golang'i puudused<\/h4>\n<p>\nGolang ei ole ideaalne. Kanal on aeglane. Kui v\u00f5rrelda Go kanalit lukustuse korral, on see lihtsalt lihtsam viis paralleelsete ja voogedastuse s\u00fcndmuste k\u00e4sitlemiseks, kuid kanal ei paku parimat j\u00f5udlust. Kanali all on keeruline lukustuse loogika. Seet\u00f5ttu tegin ma m\u00f5ned muudatused rakenduses, rakendades uuesti lukustusi ja aatomilisi v\u00e4\u00e4rtusi kanaleid asendades j\u00f5udluse optimeerimiseks.<\/p>\n<p>Lisaks on Golangi pr\u00fcgikorjaja haldamata, mis p\u00f5hjustab m\u00f5nikord kahtlaselt pikki pause. See segab oluliselt reaalajas voogesituse rakenduse t\u00f6\u00f6d.<\/p>\n<h4>CGO<\/h4>\n<p>\nProjekti koostamisel kasutatakse olemasolevat VP8\/H264 avatud l\u00e4htekoodiga Golangi teeki meedia tihendamiseks ja Libretro m\u00e4ngu emulaatorite jaoks. K\u00f5ik need teegid on lihtsalt Go-s C teegi \u00fcmberpakendamisest. <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/cmd\/cgo\/\">CGO<\/a><\/noindex>. M\u00f5ned puuded on loetletud <noindex><a rel=\"nofollow\" href=\"https:\/\/dave.cheney.net\/2019\/10\/06\/use-internal-packages-to-reduce-your-public-api-surface\">selles Dave Cheney postituses<\/a><\/noindex>. Probleemid, millega ma silmitsi seisnud olen:<\/p>\n<ul>\n<li>CGO-s ei ole v\u00f5imalik katki minna, isegi kasutades Golangi RecoveryCrash'i;<\/li>\n<li>pole v\u00f5imalik tuvastada j\u00f5udluse kitsaskohti, kui me ei saa tuvastada detailseid probleeme CGO-s.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nSain oma eesm\u00e4rgi \u2013 m\u00f5istsin pilvep\u00f5hiseid m\u00e4nguteenuseid ja l\u00f5in platvormi, mis aitab mul koos s\u00f5pradega nostalgilisi retro-m\u00e4nge veebis m\u00e4ngida. Selle projekti loomine ei oleks olnud v\u00f5imalik ilma Pioni teegi ja Pioni kogukonna toeta. Olen \u00e4\u00e4rmiselt t\u00e4nulik selle intensiivse arenduse eest. WebRTC ja Pioni pakutud lihtsad API-d tagasid sujuva integreerimise. Minu esimene t\u00f5estuskontseptsioon avaldati samal n\u00e4dalal, vaatamata sellele, et ma ei teadnud sellest eelnevalt \u00fchepunkti\u00fchenduse (P2P) kohta.<\/p>\n<p>Hoolimata integreerimise lihtsusest on P2P-voogedastus t\u00f5eliselt keeruline valdkond arvutiteadlastele. See peab tegelema keerukate mitme aasta vanuste v\u00f5rguarhitektuuridega, nagu IP ja NAT, et luua v\u00f5rdne sessioon. Selle projekti t\u00f6\u00f6s olen omandanud palju v\u00e4\u00e4rtuslikke teadmisi v\u00f5rgu ja j\u00f5udluse optimeerimise kohta, seet\u00f5ttu soovitan k\u00f5igil proovida P2P-tooteid WebRTC abil ehitada.<\/p>\n<p>CloudRetro teenindab k\u00f5iki kasutusstsenaariume, mida ma ootasin, kui vaadata seda retros\u00f5ber. Siiski arvan, et projektis on palju valdkondi, mida saaksin parendada, n\u00e4iteks v\u00f5rgu usaldusv\u00e4\u00e4rsemaks ja tootlikumaks tegemine, m\u00e4ngude graafika kvaliteedi parandamine v\u00f5i v\u00f5imalus jagada m\u00e4nge kasutajate vahel. Ma t\u00f6\u00f6tan selle nimel k\u00f5vasti. Palun j\u00e4lgige <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">projekti<\/a><\/noindex> ja toetage seda, kui see teile meeldib.<\/li>\n<\/ul>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/Voximplant\/blog\/511626\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u041e \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u0433\u0440 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0438? \u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u0433\u0440 (Cloud Gaming), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Stadia, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Google. Stadia \u043d\u0435 \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0432 WebRTC, \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c WebRTC \u0442\u0430\u043a \u0436\u0435? \u0422\u0445\u0430\u043d\u044c \u041d\u0433\u0443\u0435\u043d (Thanh [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89304,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89303","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=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u0438\u043d\u0433 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 WebRTC: p2p, \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, zero latency | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency\" \/>\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=\"2020-07-21T23:42:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-21T23:42:30+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\udd47Avatud l\u00e4htekoodiga pilv \u0438\u0433\u0440\u043e\u0432\u0430\u044f \u043d\u0430 WebRTC: p2p, mitmikm\u00e4ng, null latentsus | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u0438\u043d\u0433 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 WebRTC: p2p, \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, zero latency | ProHoster","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","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":"2020-07-21T23:42:30+00:00","article:modified_time":"2020-07-21T23:42:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89303","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:12:27","updated":"2022-09-29 13:03:06","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/89303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=89303"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/89303\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/89304"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=89303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=89303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=89303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}