Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd

Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
Hugbúnaður sem þjónusta, innviðir sem þjónusta, vettvangur sem þjónusta, samskiptavettvangur sem þjónusta, myndbandsfundur sem þjónusta, hvað með skýjaspilun sem þjónustu? Það hafa þegar verið nokkrar tilraunir til að búa til skýjaspilun (Cloud Gaming), eins og Stadia, sem nýlega var hleypt af stokkunum af Google. Stadia ekki nýtt í WebRTC, en geta aðrir notað WebRTC á sama hátt?

Thanh Nguyen ákvað að prófa þetta tækifæri á opnum hugbúnaði sínu CloudRetro. CloudRetro er byggt á Pion, vinsæll WebRTC bókasafn byggt á Go (takk Sýnt frá þróunarteymi Pion fyrir aðstoð þeirra við gerð þessarar greinar). Í þessari grein gefur Thanh yfirlit yfir arkitektúr verkefnis síns og talar einnig um hvaða gagnlega hluti hann lærði og hvaða áskoranir hann lenti í í starfi sínu.

Færslu

Á síðasta ári, þegar Google tilkynnti Stadia, brá mér í hug. Hugmyndin er svo einstök og nýstárleg að ég velti því stöðugt fyrir mér hvernig þetta væri jafnvel mögulegt með núverandi tækni. Löngunin til að skilja þetta efni betur fékk mig til að búa til mína eigin útgáfu af opnum skýjaleik. Útkoman var einfaldlega frábær. Hér að neðan langar mig að deila ferlinu við að vinna á árinu mínu verkefni.

TLDR: stutt glæruútgáfa með hápunktum

Af hverju skýjaspilun er framtíðin

Ég trúi því að Cloud Gaming muni brátt verða næsta kynslóð ekki aðeins leikja, heldur einnig annarra sviða tölvunarfræði. Skýjaspilun er hápunktur viðskiptavinar/miðlara líkansins. Þetta líkan hámarkar bakendastjórnun og lágmarkar framendavinnu með því að hýsa leikjafræði á ytri netþjóni og streyma myndum/hljóði til viðskiptavinarins. Miðlarinn sinnir þungri vinnslu þannig að viðskiptavinurinn er ekki lengur á valdi vélbúnaðartakmarkana.

Google Stadia gerir þér í rauninni kleift að spila AAA leikir (þ.e. hágæða risasprengjaleikir) á viðmóti eins og YouTube. Sömu aðferðafræði er hægt að beita fyrir önnur þung offline forrit eins og stýrikerfi eða 2D/3D grafíska hönnun o.s.frv. svo að við getum keyrt þau stöðugt á tækjum með lágum sérstakri gerð á mörgum kerfum.

Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
Framtíð þessarar tækni: Ímyndaðu þér ef Microsoft Windows 10 keyrir á Chrome vafranum?

Skýjaspilun er tæknilega krefjandi

Spilamennska er eitt af þessum sjaldgæfu sviðum þar sem þörf er á stöðugum, hröðum viðbrögðum notenda. Ef við verðum stundum fyrir 2 sekúndna seinkun þegar smellt er á síðu er það ásættanlegt. Lifandi myndbandsstraumar hafa tilhneigingu til að seinka í nokkrar sekúndur, en bjóða samt upp á hæfilega notagildi. Hins vegar, ef leikurinn tefur oft um 500ms, er hann einfaldlega óspilanlegur. Markmið okkar er að ná mjög lágri leynd þannig að bilið á milli inntaks og fjölmiðla sé eins lítið og mögulegt er. Þess vegna á hefðbundin nálgun við straumspilun myndbanda ekki við hér.

Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
Almennt skýjaleikjasniðmát

Opið uppspretta verkefni CloudRetro

Ég ákvað að búa til prufusýni af skýjaleik til að sjá hvort þetta væri allt mögulegt með svona þéttum nettakmörkunum. Ég valdi Golang sem sönnun á hugmyndinni vegna þess að það var tungumálið sem ég þekkti best og hentaði vel fyrir þessa útfærslu af mörgum öðrum ástæðum, eins og ég komst að síðar. Go er einfalt og þróast mjög hratt; Rásir í Go eru frábærar til að stjórna fjölþráðum.

Project CloudRetro.io er opinn uppspretta skýjaleikjaþjónusta fyrir afturleiki. Markmið verkefnisins er að koma með þægilegustu leikjaupplifunina í hefðbundna afturleiki og bæta við fjölspilunarleik.
Þú getur lært meira um verkefnið hér: https://github.com/giongto35/cloud-game.

CloudRetro virkni

CloudRetro notar afturleiki til að sýna fram á kraft skýjaleikja. Sem gerir þér kleift að fá marga einstaka leikjaupplifun.

  • Færanleiki leiksins
    • Augnablik spilun þegar síðu er opnuð; engin þörf á niðurhali eða uppsetningu
    • Virkar í farsímavafra og því þarf engan hugbúnað til að keyra hann

  • Hægt er að deila leikjalotum á mörg tæki og geyma í skýinu næst þegar þú skráir þig inn
  • Hægt er að streyma leiknum eða spila hann af nokkrum notendum í einu:
    • Crowdplay eins og TwitchPlayPokemon, aðeins meira þvert á vettvang og meira í rauntíma
    • Ótengdir leikir á netinu. Margir notendur geta spilað án þess að setja upp netkerfi. Samurai Shodown geta nú spilað af 2 spilurum í gegnum CloudRetro netið

    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Kynningarútgáfa af fjölspilunarleik á netinu á mismunandi tækjum

    Infrastructure

    Kröfur og tæknistafla

    Hér að neðan er listi yfir kröfur sem ég set áður en ég byrja á verkefninu.

    1. Einn leikmaður
    Þessi krafa virðist kannski ekki of mikilvæg eða augljós hér, en hún er ein af lykilatriðum mínum, hún gerir skýjaspilun kleift að vera eins langt frá hefðbundinni streymisþjónustu og mögulegt er. Ef við einbeitum okkur að einum leikmanni getum við losað okkur við miðlægan netþjón eða CDN vegna þess að við þurfum ekki að streyma til fjöldans. Í stað þess að hlaða upp straumum á vaskaþjón eða senda pakka á miðlægan WebSocket netþjón eru þjónustustraumar afhentir beint til notandans í gegnum jafningja-til-jafningi WebRTC tengingu.

    2. Lítil leynd fjölmiðlastraumur
    Þegar ég les um Stadia, sé ég oft WebRTC nefnd í sumum greinum. Ég áttaði mig á því að WebRTC er framúrskarandi tækni og er fullkomin til notkunar í skýjaspilun. WebRTC er verkefni sem veitir vöfrum og farsímaforritum rauntíma samskipti í gegnum einfalt API. Það veitir jafningjatengingu, er fínstillt fyrir fjölmiðla og hefur innbyggða staðlaða merkjamál eins og VP8 og H264.

    Ég lagði áherslu á að tryggja bestu mögulegu notendaupplifun fram yfir að viðhalda hágæða grafík. Sumt tap er ásættanlegt í reikniritinu. Google Stadia hefur viðbótarskref til að minnka myndastærðina á þjóninum og rammar eru stækkaðir í meiri gæði áður en þeir eru sendir til jafningja.

    3. Dreifðir innviðir með landfræðilegri leið
    Sama hversu fínstillt þjöppunaralgrímið og kóðinn eru, netkerfið er samt afgerandi þátturinn sem stuðlar mest að leynd. Arkitektúrinn verður að hafa kerfi til að para netþjóninn sem er næst notandanum til að draga úr hringferðartíma (RTT). Arkitektúrinn verður að hafa 1 samræmingarstjóra og nokkra streymisþjóna sem dreift er um allan heim: Vesturlönd í Bandaríkjunum, Austurríki Bandaríkjanna, Evrópu, Singapúr, Kína. Allir streymisþjónar verða að vera algjörlega einangraðir. Kerfið getur stillt dreifingu sína þegar netþjónn tengist eða yfirgefur netið. Þannig, með mikilli umferð, gerir það að bæta við viðbótarþjónum láréttri stærðargráðu.

    4. Vafrasamhæfni
    Skýjaspilun er upp á sitt besta þegar það krefst minnst af notendum. Þetta þýðir að það er hægt að keyra í vafra. Vafrar hjálpa til við að gera leikjaupplifunina eins þægilega og mögulegt er fyrir notendur og bjarga þeim frá því að setja upp hugbúnað og vélbúnað. Vafrar hjálpa einnig til við að bjóða upp á virkni þvert á vettvang á milli farsíma- og skrifborðsútgáfu. Sem betur fer er WebRTC vel studdur í ýmsum vöfrum.

    5. Skýr aðskilnaður leikjaviðmóts og þjónustu
    Ég lít á skýjaleikjaþjónustuna sem vettvang. Allir ættu að geta tengt hvað sem er við pallinn. Nú hef ég samþætt LibRetro með skýjaleikjaþjónustu vegna þess að LibRetro býður upp á fallegt leikjahermiviðmót fyrir afturleiki eins og SNES, GBA, PS.

    6. Herbergi fyrir fjölspilun, hópspilun og ytri tengingar (djúphlekkur) við leikinn
    CloudRetro styður marga nýja spilun eins og CrowdPlay og Online MultiPlayer fyrir afturleiki. Ef nokkrir notendur opna sama djúptengilinn á mismunandi tölvum munu þeir sjá sama hlaupandi leikinn og geta jafnvel tekið þátt í honum.

    Þar að auki eru leikjastöður geymdar í skýjageymslu. Þetta gerir notendum kleift að halda áfram að spila hvenær sem er á hvaða öðru tæki sem er.

    7. Lárétt mælikvarði
    Eins og allir SAAS nú á dögum, verður skýjaspilun að vera hönnuð til að vera lárétt skalanleg. Hönnun samhæfingarstarfsmanns gerir þér kleift að bæta við fleiri starfsmönnum til að þjóna meiri umferð.

    8. Engin tenging við eitt ský
    Innviði CloudRetro er hýst hjá mismunandi skýjaveitum (Digital Ocean, Alibaba, sérsniðin veitandi) fyrir mismunandi svæði. Ég geri kleift að keyra í Docker gámi fyrir innviðina og stilla netstillingar með því að nota bash skriftu til að forðast að vera læstur í einum skýjaveitu. Með því að sameina þetta með NAT Traversal í WebRTC getum við haft sveigjanleika til að dreifa CloudRetro á hvaða skýjapalli sem er og jafnvel á vélum hvers notanda.

    Byggingarhönnun

    Starfsmaður: (eða streymisþjónninn sem nefndur er hér að ofan) margfaldar leikina, keyrir kóðunarleiðsluna og streymir kóðuðu miðlinum til notenda. Starfsmannatilvik eru dreift um allan heim og hver starfsmaður getur séð um margar notendalotur samtímis.

    Umsjónarmaður: ber ábyrgð á því að para nýja notandann við þann starfsmann sem hentar best fyrir streymi. Umsjónarmaðurinn hefur samskipti við starfsmenn í gegnum WebSocket.

    Geymsla leikja: miðlæg fjargeymsla fyrir öll leikjaríki. Þessi geymsla býður upp á mikilvægar aðgerðir eins og fjarvista/hlaða.

    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Arkitektúr á hæsta stigi CloudRetro

    Sérsniðið handrit

    Þegar nýr notandi opnar CloudRetro í skrefum 1 og 2 sem sýnd er á myndinni hér að neðan, er beðið um samræmingarstjóra ásamt lista yfir tiltæka starfsmenn á fyrstu síðu. Eftir þetta, í skrefi 3, reiknar viðskiptavinurinn út tafir fyrir alla umsækjendur með því að nota HTTP ping beiðni. Þessi listi yfir tafir er síðan sendur til baka til samræmingarstjórans svo hann geti ákvarðað hvaða starfsmann hentar best til að þjóna notandanum. Skref 4 hér að neðan skapar leikinn. WebRTC streymistenging er komið á milli notandans og úthlutaðs starfsmanns.
    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Notandahandrit eftir að hafa fengið aðgang

    Hvað er innra með starfsmanninum

    Leikja- og streymisleiðslur eru geymdar inni í starfsmanninum í einangrun og skiptast á upplýsingum þar í gegnum viðmótið. Sem stendur fara þessi samskipti fram með því að flytja gögn í minni í gegnum Golang rásir í sama ferli. Næsta markmið er aðskilnaður, þ.e. óháð kynningu á leiknum í öðru ferli.

    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Samspil starfsmannaþátta

    Helstu þættir:

    • WebRTC: biðlarahluti sem tekur við notandainntak og gefur út kóðaða miðla frá þjóninum.
    • Leikjahermi: leikjahluti. Þökk sé Libretro bókasafninu er kerfið fær um að keyra leikinn í sama ferli og stöðva miðla og inntaksstraum.
    • Rammar í leiknum eru teknir og sendir í kóðara.
    • Mynd-/hljóðkóðari: kóðunarleiðsla sem tekur miðlaramma, kóðar þá í bakgrunni og gefur út kóðaðar myndir/hljóð.

    Framkvæmd

    CloudRetro treystir á WebRTC sem burðarásartækni sína, svo áður en ég kafaði ofan í smáatriðin í Golang útfærslunni ákvað ég að tala um WebRTC sjálft. Þetta er mögnuð tækni sem hefur hjálpað mér mjög við að ná undir-sekúndna leynd fyrir streymi gagna.

    WebRTC

    WebRTC er hannað til að veita hágæða jafningjatengingar á innfæddum farsímaforritum og vöfrum með einföldum API.

    NAT Traversal

    WebRTC er þekkt fyrir NAT Traversal virkni sína. WebRTC er hannað fyrir jafningjasamskipti. Markmið þess er að finna hentugustu beinu leiðina, forðast NAT gáttir og eldveggi fyrir jafningjasamskipti í gegnum ferli sem kallast ICE. Sem hluti af þessu ferli finna WebRTC APIs opinbera IP tölu þína með því að nota STUN netþjóna og senda það til gengisþjónsins (HLUTIÐ) þegar ekki er hægt að koma á beinni tengingu.

    Hins vegar nýtir CloudRetro þennan eiginleika ekki að fullu. Jafningatengingar þess eru ekki til á milli notenda, heldur milli notenda og skýjaþjóna. Miðlarahlið líkansins hefur færri takmarkanir á beinum samskiptum en dæmigerð notendatæki. Þetta gerir þér kleift að foropna komandi gáttir eða nota opinberar IP tölur beint, þar sem þjónninn er ekki á bak við NAT.

    Áður langaði mig að breyta verkefninu í leikjadreifingarvettvang fyrir Cloud Gaming. Hugmyndin var að leyfa leikjahöfundum að útvega leiki og straumspilun. Og notendur myndu hafa bein samskipti við veitendur. Á þennan dreifða hátt er CloudRetro bara rammi til að tengja streymisauðlindir þriðja aðila við notendur, sem gerir það skalanlegra þegar það er ekki lengur hýst. Hlutverk WebRTC NAT Traversal hér er mjög mikilvægt til að auðvelda frumstillingu jafningjatenginga á streymisauðlindum þriðja aðila, sem gerir það auðveldara fyrir skaparann ​​að tengjast netinu.

    Myndbandsþjöppun

    Myndbandsþjöppun er ómissandi hluti af leiðslunni og stuðlar mjög að sléttu flæði. Þó að það sé ekki nauðsynlegt að þekkja öll smáatriði VP8/H264 myndbandskóðunar, getur skilningur á hugtökum hjálpað þér að skilja straumspilunarhraðavalkosti, kemba óvænta hegðun og stilla leynd.

    Það er krefjandi að þjappa myndbandi fyrir streymisþjónustu vegna þess að reikniritið verður að tryggja að heildarkóðuntími + sendingartími nets + afkóðuntími sé eins lítill og mögulegt er. Að auki verður kóðunarferlið að vera stöðugt og stöðugt. Sum kóðunarviðskipti eiga ekki við - til dæmis getum við ekki hlynnt löngum kóðunartíma fram yfir smærri skráarstærðir og umskráningartíma, eða notað ósamkvæma þjöppun.

    Hugmyndin á bak við myndbandsþjöppun er að útrýma óþarfa bitum af upplýsingum en viðhalda ásættanlegu nákvæmni fyrir notendur. Auk þess að kóða einstaka kyrrstæða myndaramma, ályktar reikniritið um núverandi ramma frá fyrri og næstu, þannig að aðeins mismunur þeirra er sendur. Eins og sést af dæminu með Pacman eru aðeins mismunapunktar sendir.

    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Samanburður á myndrömmum með Pacman sem dæmi

    Hljóðþjöppun

    Sömuleiðis sleppir hljóðþjöppunaralgríminu gögnum sem menn geta ekki skynjað. Opus er sem stendur besti hljóðmerkjamálið. Það er hannað til að senda hljóðbylgju yfir pantaða gagnaskrársamskiptareglu eins og RTP (Real Time Transport Protocol). Töf þess er minni en mp3 og aac og gæðin eru meiri. Töfin er venjulega um 5 ~ 66,5 ms.

    Pion, WebRTC í Golang

    Peð er opinn uppspretta verkefni sem færir WebRTC til Golang. Í stað venjulegrar umbúðir innfæddra C++ WebRTC bókasöfn, er Pion innfædd Golang útfærsla á WebRTC með betri frammistöðu, Go samþættingu og útgáfustýringu á WebRTC samskiptareglum.

    Bókasafnið gerir einnig kleift að streyma með fullt af frábærum innbyggðum með leynd undir sekúndu. Það hefur sína eigin útfærslu á STUN, DTLS, SCTP osfrv. og nokkrar tilraunir með QUIC og WebAssembly. Þetta opna bókasafn sjálft er mjög gott námsefni með frábærum skjölum, útfærslum á netsamskiptareglum og flottum dæmum.

    Pion samfélagið, undir forystu mjög ástríðufulls skapara, er nokkuð líflegt, með mikið af vönduðum umræðum í gangi um WebRTC. Ef þú hefur áhuga á þessari tækni, vertu með http://pion.ly/slack - þú munt læra fullt af nýjum hlutum.

    Að skrifa CloudRetro í Golang

    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Innleiðing starfsmanns í Go

    Áfram Channels in Action

    Þökk sé fallegri rásarhönnun Go eru vandamálin við streymi viðburða og samhliða einfölduð til muna. Eins og á skýringarmyndinni eru mismunandi GoRoutines með marga hluti sem keyra samhliða. Hver hluti stjórnar ástandi sínu og hefur samskipti í gegnum rásir. Sértæk fullyrðing Golangs þvingar til að vinna úr einum atómatburði í hvert skipti í leiknum (leikjamerkið). Þetta þýðir að ekki er þörf á læsingu fyrir þessa hönnun. Til dæmis, þegar notandi vistar, þarf heildarmynd af stöðu leiksins. Þetta ástand ætti að vera stöðugt, innskráning þar til vistun er lokið. Á meðan á hverjum leik stendur getur bakendinn aðeins séð um vistun eða inntaksaðgerð, sem gerir ferliþráðinn öruggan.

    func (e *gameEmulator) gameUpdate() {
    for {
    	select {
    		case <-e.saveOperation:
    			e.saveGameState()
    		case key := <-e.input:
    			e.updateGameState(key)
    		case <-e.done:
    			e.close()
    			return
    	}
        }
    }

    Fan-in/Fan-out

    Þetta Golang sniðmát passar fullkomlega við CrowdPlay og Multiple Player notkunarmálið mitt. Eftir þessu mynstri eru öll notendainntak í einu herbergi innbyggð í miðlægu inngangsrásina. Leikmiðlum er síðan dreift til allra notenda í sama herbergi. Þannig náum við skiptingu leikjaástandsins á milli nokkurra leikjalota mismunandi notenda.

    Opinn uppspretta skýjaspilun á WebRTC: p2p, fjölspilun, núll leynd
    Samstilling milli mismunandi lota

    Ókostir Golang

    Golang er ekki fullkomið. Rásin er hæg. Í samanburði við lokun er Go rás einfaldlega auðveldari leið til að takast á við samhliða og þrædda atburði, en rásin veitir ekki bestu frammistöðu. Það er flókin hindrunarrökfræði undir rásinni. Svo ég gerði nokkrar breytingar á útfærslunni, notaði aftur læsingar og atómgildi þegar skipt var um rásir til að hámarka frammistöðu.

    Auk þess er sorphirðun í Golang stjórnlaus, sem veldur stundum grunsamlega löngum hléum. Þetta truflar streymisforritið í rauntíma mikið.

    COG

    Verkefnið notar núverandi opinn Golang VP8/H264 bókasafn fyrir fjölmiðlaþjöppun og Libretro fyrir leikjaherma. Öll þessi bókasöfn eru einfaldlega umbúðir af C bókasafninu í Go COG. Sumir af ókostunum eru taldir upp í þetta innlegg eftir Dave Cheney. Vandamál sem ég lenti í:

    • vanhæfni til að ná hruni í CGO, jafnvel með Golang RecoveryCrash;
    • bilun í að bera kennsl á flöskuhálsa í afköstum þegar við getum ekki greint nákvæm vandamál í CGO.

    Ályktun

    Ég náði markmiði mínu um að skilja skýjaleikjaþjónustu og búa til vettvang sem hjálpar mér að spila nostalgíska afturleiki með vinum mínum á netinu. Þetta verkefni hefði ekki verið mögulegt án Pion bókasafnsins og stuðnings Pion samfélagsins. Ég er afar þakklátur fyrir mikla þróun hennar. Einföld forritaskil sem WebRTC og Pion bjóða upp á tryggðu óaðfinnanlega samþættingu. Fyrsta sönnun mín fyrir hugmyndinni var gefin út í sömu viku, jafnvel þó að ég hefði enga fyrri þekkingu á jafningjasamskiptum (P2P).

    Þrátt fyrir auðvelda samþættingu er P2P streymi örugglega mjög flókið svæði í tölvunarfræði. Hún þarf að takast á við flókið langvarandi netarkitektúr eins og IP og NAT til að búa til jafningjalotu. Meðan ég vann að þessu verkefni öðlaðist ég mikla og dýrmæta þekkingu um netkerfi og hagræðingu afkasta, svo ég hvet alla til að prófa að byggja P2P vörur með WebRTC.

    CloudRetro kemur til móts við öll notkunartilvik sem ég bjóst við frá mínu sjónarhorni sem afturspilari. Hins vegar held ég að það séu mörg svæði í verkefninu sem ég get bætt, eins og að gera netið áreiðanlegra og afkastameira, útvega hágæða leikjagrafík eða getu til að deila leikjum á milli notenda. Ég er að vinna hörðum höndum að þessu. Vinsamlegast fylgist með verkefni og styðja það ef þér líkar það.

Heimild: www.habr.com

Bæta við athugasemd