{"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":"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus","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=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/22dbf7665d7fded15671d98a2afe599b.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\nTarkvara teenusena, infrastruktuur teenusena, platvorm teenusena, suhtlusplatvorm teenusena, videokonverentsid teenusena, aga kuidas on lood m\u00e4ngimisega teenusena? On tehtud mitmeid katseid m\u00e4ngude pilve viimiseks (Cloud Gaming), n\u00e4iteks Google'i hiljuti lansseeritud Stadia. <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/avtlQeaxd_I?t=440\">Stadia<\/a><\/noindex>, kuid kas teised saavad kasutada WebRTC-d sama h\u00e4sti?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Thanh Nguyen otsustas seda v\u00f5imalust kontrollida oma avatud l\u00e4htekoodiga projektis CloudRetro. CloudRetro p\u00f5hineb Pionil, <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/webrtc-open-source-most-popular\/\">populaarne<\/a><\/noindex> WebRTC raamatukogu Go p\u00f5hjal (t\u00e4nu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Sean-Der\">Shonile<\/a><\/noindex> Pioni arendajate grupist, kes aitas selle artikli ette valmistada). K\u00e4esolevas artiklis annab Thanh \u00fclevaate oma projekti arhitektuurist ning r\u00e4\u00e4gib, mida kasulikku ta \u00f5ppis ja milliste v\u00e4ljakutsetega ta silmitsi seisis oma t\u00f6\u00f6 ajal.<\/p>\n<h2>Sissejuhatus<\/h2>\n<p>\nEelmisel aastal, kui Google kuulutas v\u00e4lja Stadia, olin t\u00e4iesti l\u00f5hkevad. Idee on nii ainulaadne ja innovaatiline, et ma k\u00fcsisin endalt pidevalt, kuidas selline asi on tehnoloogiliselt v\u00f5imalik. Soov s\u00fcvitsi minna sellesse valdkonda ajendas mind looma oma versiooni avatud l\u00e4htekoodiga pilve m\u00e4ngust. Tulemus oli lihtsalt fantastiline. Allpool jagan oma aastase projekti v\u00e4ljat\u00f6\u00f6tamise protsessi. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">projektiga<\/a><\/noindex>.<\/p>\n<p><i>TLDR: l\u00fchike slaidiversioon peamistest punktidest<\/i><\/p>\n<h3>Miks on pilve m\u00e4ngude tulevik<\/h3>\n<p>\nUsun, et pilvem\u00e4ngud saavad peagi olema uue p\u00f5lvkonna mitte ainult m\u00e4ngude, vaid ka teiste infotehnoloogia valdkondade lahendustes. Pilvem\u00e4ngud on kliendi\/serveri mudeli tipp. See mudel maksimeerib tagapidamise haldamist ja minimeerib ettepoole suunatud t\u00f6\u00f6, viies m\u00e4ngu logika kaugserverisse ja edastades pilti\/h\u00e4\u00e4lt kliendile. Server teostab rasked arvutused, seega ei s\u00f5ltu klient enam seadme piirangutest.<\/p>\n<p>Google Stadia v\u00f5imaldab p\u00f5him\u00f5tteliselt 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\u00f5rgekvaliteetsed m\u00e4ngud-plokkbusterid) YouTube'i sarnasel liidestel. Sama metodologia v\u00f5ib kehtida ka teistele rasketele off-line rakendustele, nagu ops\u00fcsteem v\u00f5i 2D\/3D graafiline disain jms, et suudaksime neid stabiilselt k\u00e4itada madala spetsifikatsiooniga seadmetes erinevates platvormides.<\/p>\n<p><img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/d6ca3e47db5c8e3d9880b304cc3be33b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelle tehnoloogia tulevik: kas oskate ette kujutada, kui Microsoft Windows 10 t\u00f6\u00f6taks Chrome'i brauseris?<\/p>\n<h3>Pilvem\u00e4ngud on tehniliselt keerulised.<\/h3>\n<p>\nM\u00e4ngimine on \u00fcks haruldasi valdkondi, kus on vajalik pidev kiire kasutaja reageerimine. Kui me m\u00f5nikord kogeme 2 sekundi viivitust lehe klikil, on see vastuv\u00f5etav. Otsevooged, mis reeglina j\u00e4\u00e4vad paar sekundit hiljaks, pakuvad siiski 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 traditsiooniline l\u00e4henemine voogesitusele siin ei toimi.<\/p>\n<p><img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/d73765a3c9277c026f407883e1091473.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPilvem\u00e4ngude \u00fcldine malli<\/p>\n<h2>Avatud l\u00e4htekoodiga projekt CloudRetro<\/h2>\n<p>\nOtsustasin luua testimiseks pilvem\u00e4ngu n\u00e4idise, et uurida, kas see on k\u00f5ik v\u00f5imalik nii rangete v\u00f5rgupiirangute tingimustes. Kontseptsiooni kontrollimiseks valisin Golangi, kuna see on mulle k\u00f5ige tuttavam keel ja sobib selle rakendamiseks paljuski, nagu hiljem selgus. Go on lihtne ja areneb v\u00e4ga kiiresti; Go kanalid sobivad suurep\u00e4raselt mitme l\u00f5ime haldamiseks.<\/p>\n<p>Projekt <noindex><a rel=\"nofollow\" href=\"http:\/\/cloudretro.io\/\">CloudRetro.io<\/a><\/noindex> \u2013 avatud l\u00e4htekoodiga pilvem\u00e4nguteenuse platvorm retro-m\u00e4ngude jaoks. Projekti eesm\u00e4rk on tuua traditsioonilistesse retro-m\u00e4ngudesse parim m\u00e4ngukogemus ja lisada mitmikm\u00e4ngu.<br \/>\nProjekti \u00fcksikasjadega saab tutvuda siin: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">https:\/\/github.com\/giongto35\/cloud-game<\/a><\/noindex>.<\/p>\n<h3>CloudRetro funktsioonid<\/h3>\n<p>\nCloudRetro demonstreerib pilvem\u00e4ngude kogu potentsiaali retro-m\u00e4ngude abil. See v\u00f5imaldab saada mitmeid unikaalseid m\u00e4ngukogemusi.<\/p>\n<ul>\n<li>M\u00e4ngu kaasaskantavus\n<ul>\n<li>Kohene m\u00e4ngimise v\u00f5imalus lehe avamisel; allalaadimist ja installimist ei ole vaja.<\/li>\n<li>T\u00f6\u00f6tab mobiilibrauseris, seega pole k\u00e4itamiseks mingit tarkvara vajalik.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>M\u00e4nguseansse saab jagada mitmel seadmel ja salvestada pilve j\u00e4rgmiseks sisenemiseks.<\/li>\n<li>M\u00e4ngu saab voogedastada, aga seda saavad korraga m\u00e4ngida mitmed kasutajad:\n<ul>\n<li>Crowdplay sarnane TwitchPlayPokemonile, kuid rohkem platvormide\u00fclene ja reaalajas.<\/li>\n<li>Offline m\u00e4ngud online'is. Mitu kasutajat saavad m\u00e4ngida ilma v\u00f5rgu seadistamiseta. Samurai Shodownis saavad n\u00fc\u00fcd kaks m\u00e4ngijat m\u00e4ngida CloudRetro v\u00f5rgus.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/bdc715971755d669a026f830ce888520.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMitu m\u00e4ngijat toetamata online-m\u00e4ngu demoversioon erinevates seadmetes.<\/p>\n<h2>Infrastruktuur<\/h2>\n<p><\/p>\n<h3>N\u00f5uded ja tehnoloogiatehnoloogia.<\/h3>\n<p>\nAllpool on toodud n\u00f5uete loetelu, mille ma projekti alustamise eel seadnud olen.<\/p>\n<p><b>1. \u00dcks m\u00e4ngija<\/b><br \/>\nSee n\u00f5ue v\u00f5ib tunduda mitte liiga oluline ja ilmne, kuid see on \u00fcks mu peamisi j\u00e4reldusi \u2013 see v\u00f5imaldab pilvem\u00e4ngudel v\u00f5imalikult kaugel hoida traditsioonilistest voogedastusteenustest. Kui keskendume \u00fche m\u00e4ngijaga m\u00e4ngule, saame loobuda tsentraliseeritud serverist v\u00f5i CDN-ist, kuna me ei pea voeedastust massidesse tegema. Selle asemel, et edastada vooge s\u00f6\u00f6v serverisse v\u00f5i edastada pakette tsentraliseeritud WebSocket serverisse, saadetakse teenusevood otse kasutajale l\u00e4bi punkt-punkti WebRTC \u00fchenduse.<\/p>\n<p><b>2. Madala latentsusega meediavool<\/b><br \/>\nLugedes Stadia kohta, kohtan ma sageli m\u00f5nedes artiklites mainimist WebRTC-st. Hakkasin aru saama, et WebRTC on silmapaistev tehnoloogia, mis sobib suurep\u00e4raselt pilvem\u00e4ngude kasutamiseks. WebRTC on projekt, mis v\u00f5imaldab veebibrauseritel ja mobiilirakendustel reaalajas \u00fchendust luua lihtsa API kaudu. See tagab punkt-punkti \u00fchenduse, mis on optimeeritud meedia jaoks ja sisaldab sisseehitatud standardkoodekeid, nagu VP8 ja H264.<\/p>\n<p>Ma olen eelistanud kasutajate mugava t\u00f6\u00f6 tagamist, mitte k\u00f5rge graafika kvaliteedi s\u00e4ilitamist. Algoritmis on lubatud teatavad kadud. Google Stadias on serveris pildi suuruse v\u00e4hendamise t\u00e4iendav samm, ja kaadrid skaleeritakse k\u00f5rgema kvaliteedini enne edastamist v\u00f5rgu s\u00f5lmedele.<\/p>\n<p><b>3. Geograafilise marsruutimisega jaotatud infrastruktuur<\/b><br \/>\nKuna algoritmide tihendamine ja kood on optimeeritud, on siiski k\u00f5ige olulisem tegur latentsuse korral v\u00f5rgustruktuur. Arhitektuur peaks sisaldama mehhanismi, mis \u00fchendab l\u00e4hima kasutajale serveriga, et v\u00e4hendada RTT (ringk\u00e4igu aega). Arhitektuuril peab olema \u00fcks koordinaator ja mitu voogesituse serverit, mis on jaotatud \u00fcle kogu maailma: L\u00e4\u00e4ne-USA, Ida-USA, Euroopa, Singapur, Hiina. K\u00f5ik voogesituse serverid peavad olema t\u00e4ielikult isoleeritud. S\u00fcsteem suudab reguleerida oma jaotust, kui server liitub v\u00f5i lahkub v\u00f5rgust. Seega, kui koormus on suur, v\u00f5imaldab lisaserverite lisamine horisontaalset skaleerimist.<\/p>\n<p><b>4. Brauseri \u00fchilduvus<\/b><br \/>\nPilve m\u00e4ngud saavad parima ilme, kui need n\u00f5uavad kasutajatelt minimaalset. See t\u00e4hendab, et neid saab k\u00e4ivitada brauseris. Brauserid aitavad muuta m\u00e4ngimise kasutajas\u00f5bralikumaks, vabastades nad tarkvara ja riistvara installimise koormast. Brauserid toetavad ka platvormidevahelist \u00fchilduvust mobiilsete ja lauaarvutiversioonide vahel. \u00d5nneks toetab WebRTC suurep\u00e4raselt erinevaid brausereid.<\/p>\n<p><b>5. Selge eristus m\u00e4ngu liidese ja teenuse vahel<\/b><br \/>\nMa k\u00e4sitlen pilvm\u00e4nguteenust platvormina. Igal kasutajal peaks olema v\u00f5imalus \u00fchendada platvormile mida iganes. Praegu olen integreerinud <noindex><a rel=\"nofollow\" href=\"http:\/\/LibRetro\">LibRetro<\/a><\/noindex> pilvm\u00e4nguteenusega, sest LibRetro pakub kaunist m\u00e4ngu emulaatori liidest retro m\u00e4ngude jaoks, nagu SNES, GBA, PS.<\/p>\n<p><b>6. Mitme m\u00e4ngija toad, crowd play ja m\u00e4nguga s\u00fcgava lingi (deep-link) sidumine<\/b><br \/>\nCloudRetro toetab mitmeid uusi m\u00e4ngimise vorme, nagu CrowdPlay ja Online MultiPlayer retro m\u00e4ngude jaoks. Kui mitu kasutajat avavad erinevatel arvutitel sama s\u00fcgava lingi, n\u00e4evad nad sama m\u00e4ngu ja saavad sellele isegi liituda.<\/p>\n<p>Lisaks sellele salvestatakse m\u00e4ngu seisud pilves. See v\u00f5imaldab kasutajatel j\u00e4tkata m\u00e4ngimist igal ajal igasugustel seadmetel.<\/p>\n<p><b>7. Horisontaalne skaleerimine<\/b><br \/>\nNagu iga praegune SAAS, peavad pilvem\u00e4ngud olema loodud horisontaalselt skaleeritavateks. Koordineerija-t\u00f6\u00f6taja struktuur v\u00f5imaldab lisada rohkem t\u00f6\u00f6tajaid suurema liikluse teenindamiseks.<\/p>\n<p><b>8. Pole seotust \u00fche pilvega<\/b><br \/>\nCloudRetro infrastruktuur on paigutatud erinevatele pilveteenuse pakkujatele (Digital Ocean, Alibaba, kohandatud pakkuja) erinevates piirkondades. K\u00e4ivitan konteinerites Docker infrastruktuuri ja seadistan v\u00f5rguseaded bash-skripti abil, et v\u00e4ltida s\u00f5ltuvust \u00fchest pilveteenuse pakkujast. Kombineerides selle NAT Traversal WebRTC-ga, saame paindlikkuse CloudRetro juurutamiseks igasugustel pilveplatvormidel ja isegi mis tahes kasutaja masinates.<\/p>\n<h3>Arhitektuuri disain<\/h3>\n<p>\n<b>T\u00f6\u00f6taja:<\/b> (v\u00f5i \u00fclekandeteenus, nagu eespool mainitud) haldab m\u00e4nge, k\u00e4ivitab kodeerimisvoo ja edastab kodeeritud meedia kasutajatele. T\u00f6\u00f6tlusinstance jagatakse \u00fcle kogu maailma ning iga t\u00f6\u00f6tleja suudab samal ajal hallata mitmeid kasutaja seansse.<\/p>\n<p><b>Koordinaator:<\/b> vastutab uue kasutaja sidumise eest sobiva t\u00f6\u00f6tlejaga voogedastamiseks. Koordinaator suhtleb t\u00f6\u00f6tlejatega WebSocketi kaudu.<\/p>\n<p><b>M\u00e4ngu seisundite hoidla:<\/b> keskne kaughoidla k\u00f5ikide m\u00e4ngu seisundite jaoks. See hoidla tagab sellised olulised funktsioonid nagu kaugsalvestus\/laadimine.<\/p>\n<p><img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/985447b81350a640b0bd1344b5705113.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCloudRetro \u00fclemine arhitektuur<\/p>\n<h3>Kasutajaskenario<\/h3>\n<p>\nKui uus kasutaja avab CloudRetro 1. ja 2. sammul, nagu on n\u00e4idatud alloleval pildil, k\u00fcsitakse koordinaatorilt koos saadaval olevate t\u00f6\u00f6tajate nimekirjaga esimeses lehek\u00fcljel. P\u00e4rast seda, 3. sammul, arvutab klient viivitused k\u00f5igi kandidaatide jaoks HTTP pingiga. See viivituste nimekiri saadetakse seej\u00e4rel tagasi koordinaatorile, et ta saaks m\u00e4\u00e4rata kasutajale k\u00f5ige sobivama t\u00f6\u00f6taja. 4. sammul luuakse m\u00e4ng. Kasutaja ja m\u00e4\u00e4ratud t\u00f6\u00f6taja vahel luuakse WebRTC kaudu voogedastuse \u00fchendus.<br \/>\n<img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/00199b5942e3e4314609ec0e70ea7162.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKasutajascenarion peale juurdep\u00e4\u00e4su saamist<\/p>\n<h3>Mis on t\u00f6\u00f6tajas sees<\/h3>\n<p>\nM\u00e4ngu- ja voogedastuskanalid hoitakse t\u00f6\u00f6taja sees isoleeritult ning nad vahetavad teavet seal l\u00e4bi liidese. Hetkel toimub see \u00fchendus m\u00e4lus andmete edastamise teel l\u00e4bi <noindex><a rel=\"nofollow\" href=\"https:\/\/tour.golang.org\/concurrency\/2\">Golang kanalite<\/a><\/noindex> samas protsessis. J\u00e4rgmine eesm\u00e4rk on segregeerimine, st m\u00e4ngu iseseisev k\u00e4ivitamine teises protsessis.<\/p>\n<p><img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/7a90ec2638344467a34604cd4322165c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nT\u00f6\u00f6taja komponentide interaktsioon<\/p>\n<p>Peamised komponendid:<\/p>\n<ul>\n<li><b>WebRTC:<\/b> klientkomponent, mis v\u00f5tab vastu kasutaja sisendi ja v\u00e4ljastab serverist kodeeritud meedia.\n<\/li>\n<li><b>M\u00e4nguemulaator:<\/b> m\u00e4ngukomponent. T\u00e4nu Libretro raamatukogule suudab s\u00fcsteem k\u00e4ivitada m\u00e4ngu \u00fches protsessis ja sisemiselt peatada meedia ja sisendi voogu.\n<\/li>\n<li>M\u00e4ngu kohaletoimetatavad kaadrid salvestatakse ja saadetakse kodeerijale.\n<\/li>\n<li><b>Pilt\/heli kodeerija:<\/b> kodeerimise torustik, mis v\u00f5tab meedia kaadrid, kodeerib need taustal ning v\u00e4ljastab kodeeritud pildid\/helid.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Rakendus<\/h2>\n<p>\nCloudRetro toetub WebRTC-le kui p\u00f5hitehnoloogiale, seet\u00f5ttu enne, kui s\u00fcveneen Gumidetailide elluviimisse Golangis, tahtsin r\u00e4\u00e4kida WebRTC-st. See on h\u00e4mmastav tehnoloogia, mis on mind aidanud saavutada andmeedastuse viivituseks vaid killu sekundist.<\/p>\n<h3>WebRTC<\/h3>\n<p>\nWebRTC on m\u00f5eldud k\u00f5rgekvaliteediliste \u00fcheotsaliste \u00fchenduste tagamiseks kohalikus mobiilirakenduses ja brauserites lihtsate API-de kaudu.<\/p>\n<h4>NAT Traversal <\/h4>\n<p>\nWebRTC on tuntud oma NAT Traversali funktsionaalsuse poolest. WebRTC on m\u00f5eldud \u00fcks-\u00fchele suhtlemiseks. Selle eesm\u00e4rk on leida sobivaim otsene marsruut, v\u00e4ltides NAT-l\u00fc\u00fcse ja tulem\u00fc\u00fcre t\u00f6\u00f6s, mida kutsutakse <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 abil ja suunavad selle edasi tagasiserverisse (<noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/?s=turn\">TURN<\/a><\/noindex>), kui otse\u00fchendust ei \u00f5nnestu luua.<\/p>\n<p>Kuid CloudRetro ei kasuta seda v\u00f5imalust t\u00e4ielikult. Selle peer-to-peer \u00fchendused ei toimu kasutajate vahel, vaid kasutajate ja pilveserverite vahel. Mudeli serveripoolsel osal on v\u00e4hem piiranguid otse\u00fchenduse osas kui tavalisel kasutajal. See v\u00f5imaldab ette avada sissetulevad pordid v\u00f5i kasutada otseselt avalikke IP-aadresse, kuna server ei asu NAT-i taga.<\/p>\n<p>Kun ma tahtsin varem muuta projekti m\u00e4ngude levitamise platvormiks Cloud Gaming jaoks. Idee oli v\u00f5imaldada m\u00e4ngu loojatel pakkuda m\u00e4nge ja voogesituse ressursse. Kasutajad suheldaksid otse teenusepakkujatega. Sellises detsentraliseeritud l\u00e4henemises on CloudRetro lihtsalt keskkond, mis \u00fchendab kolmandate osapoolte voogesitusressursse kasutajatega, muutes selle skaleeritavaks, kuna hosting ei ole enam selle peamine eesm\u00e4rk. WebRTC NAT Traversal m\u00e4ngib siin v\u00e4ga olulist rolli, h\u00f5lbustades peer-to-peer \u00fchenduse loomist kolmandate osapoolte voogesitusressursside vahel, mis lihtsustab looja \u00fchendamist v\u00f5rguga.<\/p>\n<h4>Videokompressioon<\/h4>\n<p>\nVideokompressioon on h\u00e4davajalik osa voogesituse t\u00f6\u00f6protsessist, mis panustab olulisel m\u00e4\u00e4ral voogesituse sujuvusele. Kuigi ei ole h\u00e4davajalik teada k\u00f5iki VP8\/H264 videokoodimise detaile, aitab m\u00f5istmine kontseptsioonist aru saada voogedastuse kiirusparameetritest, tuvastada ootamatut k\u00e4itumist ja kohandada viivitust.<\/p>\n<p>Video voogesituse tihendamine on keeruline \u00fclesanne, kuna algoritm peab tagama, et kokkuv\u00f5ttes koodimise aeg + edastusaeg + dekodeerimise aeg oleks v\u00f5imalikult v\u00e4ike. Lisaks peab kodeerimisprotsess olema j\u00e4rjepidev ja katkematu. Teatud kompromissid kodeerimise osas ei kehti \u2013 n\u00e4iteks ei saa me eelistada pikemat kodeerimisaega v\u00e4iksema failisuuruse ja dekodeerimise aja arvel, ega kasutada j\u00e4rjepidevat tihendamist.<\/p>\n<p>Video tihendamise idee seisneb ebavajalike informatsiooni bittide eemaldamises, s\u00e4ilitades samal ajal kasutajatele vastuv\u00f5etava t\u00e4psuse taseme. Lisaks \u00fcksikute staatiliste piltide kodeerimisele teeb algoritm j\u00e4reldusi praegusest kaadrist varasema ja j\u00e4rgmise p\u00f5hjal, seega saadetakse ainult nende vaheline erinevus. Nagu n\u00e4ha Pacmani n\u00e4ites, edastatakse ainult diferentseeritud punktid.<\/p>\n<p><img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/e452c54c53ab7797b610620aefbba8d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuid videokadrite v\u00f5rdlemine Pacmani n\u00e4itel<\/p>\n<h4>Audio tihendamine<\/h4>\n<p>\nSarnasel viisil loob heli kompressioon algoritm andmeid, mida inimene ei suuda tajuda. Opus on hetkel parim tulemuslikkusega helikodek. See on v\u00e4lja t\u00f6\u00f6tatud helilaine edastamiseks j\u00e4rjestiku datagrammi protokollis, nagu RTP (Real Time Transport Protocol \u2013 reaalajas edastamise protokoll). Selle latentsus on madalam kui mp3 ja aac ning kvaliteet on parem. Latentsus on tavaliselt umbes 5\u201366,5 ms.<\/p>\n<h4>Pion, WebRTC Go'is<\/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 Go-sse. Erinevalt tavalistest C++ WebRTC teekide v\u00e4\u00e4namisest on Pion natiivne Golangi teostus WebRTC jaoks, millel on parem tulemuslikkus, Go'ga integreerimine ning protokollide WebRTC versioonikontroll.<\/p>\n<p>Raamatukogu toetab ka andmevoogu suure hulga suurep\u00e4raste sisseehitatud moodulitega, mille viivitus on v\u00e4hem kui sekund. Sellel on oma STUN, DTLS, SCTP jne rakendus ning m\u00f5ned katsetused QUICi ja WebAssemblyga. See avatud l\u00e4htekoodiga raamatukogu on t\u00f5eliselt hea \u00f5ppeallikas suurep\u00e4rase dokumentatsiooni, v\u00f5rguprotokollide rakendamise ja \u00e4gedate n\u00e4idistega.<\/p>\n<p>Pioni kogukond, mida juhib v\u00e4ga kirglik looja, on \u00fcsna elav, seal toimub palju kvaliteetseid arutelusid WebRTCi \u00fcle. Kui teid huvitab see tehnoloogia, liituge <noindex><a rel=\"nofollow\" href=\"http:\/\/pion.ly\/slack\">http:\/\/pion.ly\/slack<\/a><\/noindex> \u2013 te \u00f5ppite palju uut.<\/p>\n<h3>CloudRetro kirjutamine Golangis<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/f85f7b8ea579fab964d870aad698c7e7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nT\u00f6\u00f6tlija rakendamine Go-s<\/p>\n<h4>Go kanalid tegevuses<\/h4>\n<p>\nGo kanalite kauni disaini t\u00f5ttu on voogedastuse ja paralleelsuse probleemid oluliselt lihtsamad. Nagu diagrammil, t\u00f6\u00f6tavad erinevates GoRoutines mitmed komponendid paralleelselt. Iga komponent haldab oma olekut ja suhtleb kanalite kaudu. Golangi valikuline avaldus sunnib t\u00f6\u00f6tlema \u00fchte aatomit\u00f6\u00f6d iga m\u00e4ngu hetke jooksul (game tick). See t\u00e4hendab, et sellise disaini puhul ei ole lukustamine vajalik. N\u00e4iteks, kui kasutaja salvestab, on vajalik t\u00e4ielik m\u00e4ngu oleku snapshot. See olek peab j\u00e4\u00e4ma pidevaks, tehes sisendi, kuni salvestamine on l\u00f5petatud. Iga game tick'i ajal saab tagasis\u00fcsteem t\u00f6\u00f6delda vaid salvestamise v\u00f5i sisendi operatsiooni, mis muudab protsessi voogude 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 Golang'i mall sobib suurep\u00e4raselt minu CrowdPlay ja Multiple Player kasutusstsenaariumiga. J\u00e4rgides seda malli, integreeritakse k\u00f5ik kasutaja sisendid \u00fches toas keskse sisendi kanalisse. M\u00e4ngu multimeedia edastatakse seej\u00e4rel k\u00f5igile kasutajatele, kes viibivad \u00fches toas. Nii saavutame m\u00e4ngu oleku jagamise erinevate kasutajate m\u00e4ngusessioonide vahel.<\/p>\n<p><img decoding=\"async\" alt=\"Pilve m\u00e4ngimine avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ng, null viivitus\" src=\"\/wp-content\/uploads\/2020\/07\/000a495d7f214246a8a396aab11a3ac5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS\u00fcnkroniseerimine erinevate seansside vahel<\/p>\n<h4>Golang'i puudused<\/h4>\n<p>\nGolang ei ole t\u00e4iuslik. Kanal on aeglane. V\u00f5rreldes lukustatud kanaliga on Go lihtsalt lihtsam viis paralleelsete ja voogedastuste t\u00f6\u00f6tlemiseks, kuid kanal ei paku parimat j\u00f5udlust. Kanali all on keeruline lukustamise loogika. Seet\u00f5ttu olen m\u00f5ned muudatused teinud rakendusse, rakendades uuesti lukustusi ja aatomv\u00e4\u00e4rtusi kanali asendamiseks j\u00f5udluse optimeerimiseks.<\/p>\n<p>Lisaks on Golang'i j\u00e4\u00e4tme kogumine halduses, mis p\u00f5hjustab m\u00f5nikord kahtlaseid pikaid pause. See h\u00e4irib t\u00f5siselt reaalajas voogedastuse rakenduse toimimist.<\/p>\n<h4>CGO<\/h4>\n<p>\nProjektis kasutatakse olemasolevat VP8\/H264 avatud l\u00e4htekoodiga Golangi teeki meedia pakkimiseks ja Libretro m\u00e4ngu emulaatoriteks. K\u00f5ik need teegid on lihtsalt C teegi \u00fcmberm\u00f5testamised Go-s, kasutades <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/cmd\/cgo\/\">CGO<\/a><\/noindex>. M\u00f5ned puudused 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 seisin:<\/p>\n<ul>\n<li>CGO-s krahhi kinni p\u00fc\u00fcda ei ole v\u00f5imalik, isegi Golangi RecoveryCrash'i abil;<\/li>\n<li>v\u00f5imetus m\u00e4\u00e4rata, kus on j\u00f5udlusprobleem, kuna me ei suuda CGO-s detailsetelt probleeme avastada.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nOlin oma eesm\u00e4rgiga saavutanud \u2013 m\u00f5istsin pilvem\u00e4nguteenuseid ja l\u00f5in platvormi, mis v\u00f5imaldab mul m\u00e4ngida nostalgilisi retro m\u00e4nge oma s\u00f5pradega veebis. Selle projekti loomine ei oleks olnud v\u00f5imalik ilma Pioni teegi ja Pioni kogukonna toeta. Olen \u00e4\u00e4rmiselt t\u00e4nulik selle intensiivse arengu eest. WebRTC ja Pioni pakutud lihtsad API-d v\u00f5imaldasid sujuvat integreerimist. Minu esimene t\u00f5end kontseptsioonist k\u00e4idi v\u00e4lja samal n\u00e4dalal, isegi kui ma ei teadnud ette \u00fchte punkti suhete kohta (P2P).<\/p>\n<p>Kuigi P2P-voogedastus integreerimine on lihtne, on see tegelikult arvutiteaduses v\u00e4ga keeruline valdkond. See peab tegelema mitme aasta jooksul v\u00e4lja arendatud keerukate v\u00f5rguarhitektuuridega, nagu IP ja NAT, et luua omavaheline sessioon. Projekti k\u00e4igus olen kogunud palju v\u00e4\u00e4rtuslikke teadmisi v\u00f5rgustatud ja j\u00f5udluse optimeerimise kohta, seega soovitan k\u00f5igil proovida luua P2P-tooteid WebRTC abil.<\/p>\n<p>CloudRetro katab k\u00f5ik kasutusskeemid, mida ootasin, retro-m\u00e4nguri vaatenurgast. Siiski arvan, et projektis on palju kohti, kus saaksin parendada, n\u00e4iteks v\u00f5rgu usaldusv\u00e4\u00e4rsuse ja j\u00f5udluse suurendamine, m\u00e4ngude graafika kvaliteedi t\u00f5stmine v\u00f5i kasutajate vahel m\u00e4ngude jagamise v\u00f5imalus. T\u00f6\u00f6dan selle nimel k\u00f5vasti. Palun j\u00e4lgige <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">projektiga<\/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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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) 4.9.10\" \/>\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:description\" content=\"\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\" \/>\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\udd47Pilvem\u00e4ngud avatud l\u00e4htekoodiga WebRTC-l: p2p, mitmikm\u00e4ngijad, null latentsus | ProHoster","description":"Teenusena pakutav t\u00e4iendav infrastruktuur, platvorm teenusena, suhtlusplatvorm teenusena, videokonverentsid teenusena, aga kuidas on olukord pilvem\u00e4ngudega teenusena? Mitmeid katseid pilvem\u00e4ngude (Cloud Gaming) loomiseks on juba tehtud, n\u00e4iteks Google'i hiljuti k\u00e4ivitatud Stadia. Stadia pole WebRTC jaoks uus m\u00e4ngija, kuid kas teised saavad WebRTC-d samamoodi kasutada? Thanh Nguen (Thanh","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:description":"\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","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"},"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}]}}