ProgrammatÅ«ra kÄ pakalpojums, infrastruktÅ«ra kÄ pakalpojums, platforma kÄ pakalpojums, komunikÄcijas platforma kÄ pakalpojums, videokonferences kÄ pakalpojums, kÄ ar mÄkoÅa spÄlÄm kÄ pakalpojumu? Jau ir bijuÅ”i vairÄki mÄÄ£inÄjumi izveidot mÄkoÅa spÄles (Cloud Gaming), piemÄram, Stadia, ko nesen palaida Google. Stadia nav jaunums WebRTC, bet vai citi var izmantot WebRTC tÄdÄ paÅ”Ä veidÄ?
Thanh Nguyen nolÄma pÄrbaudÄ«t Å”o iespÄju savÄ atvÄrtÄ pirmkoda projektÄ CloudRetro. CloudRetro pamatÄ ir Pion, populÄrs WebRTC bibliotÄka, kuras pamatÄ ir Go (paldies ParÄdÄ«ts no Pion izstrÄdes komandas par palÄ«dzÄ«bu Ŕī raksta sagatavoÅ”anÄ). Å ajÄ rakstÄ Tans sniedz pÄrskatu par sava projekta arhitektÅ«ru, kÄ arÄ« stÄsta par to, ko noderÄ«gu viÅÅ” iemÄcÄ«jÄs un ar kÄdiem izaicinÄjumiem saskÄrÄs darba laikÄ.
Ieraksts
PagÄjuÅ”ajÄ gadÄ, kad Google paziÅoja par Stadia, tas mani pÄrsteidza. Ideja ir tik unikÄla un novatoriska, ka es pastÄvÄ«gi prÄtoju, kÄ tas vispÄr ir iespÄjams ar esoÅ”ajÄm tehnoloÄ£ijÄm. VÄlme labÄk izprast Å”o tÄmu pamudinÄja mani izveidot savu atvÄrtÄ pirmkoda mÄkoÅspÄles versiju. RezultÄts bija vienkÄrÅ”i fantastisks. TÄlÄk es vÄlos dalÄ«ties ar mana gada darba procesu projektu.
TLDR: Ä«sa slaida versija ar izcÄlumiem
KÄpÄc mÄkoÅa spÄles ir nÄkotne
Es uzskatu, ka Cloud Gaming drÄ«z kļūs par nÄkamo ne tikai spÄļu, bet arÄ« citu datorzinÄtÅu jomu paaudzi. MÄkoÅspÄles ir klienta/servera modeļa virsotne. Å is modelis maksimÄli palielina aizmugursistÄmas pÄrvaldÄ«bu un samazina frontend darbu, mitinot spÄles loÄ£iku attÄlajÄ serverÄ« un straumÄjot attÄlus/audio klientam. Serveris veic smago apstrÄdi, tÄpÄc klients vairs nav pakļauts aparatÅ«ras ierobežojumiem.
Google Stadia bÅ«tÄ«bÄ Ä¼auj jums spÄlÄt AAA spÄles (t.i., augstÄkÄs klases grÄvÄjspÄles) tÄdÄ saskarnÄ kÄ YouTube. To paÅ”u metodoloÄ£iju var izmantot citÄm smagÄm bezsaistes lietojumprogrammÄm, piemÄram, operÄtÄjsistÄmÄm vai 2D/3D grafiskajam dizainam utt. lai mÄs varÄtu tos konsekventi darbinÄt zemas specifikÄcijas ierÄ«cÄs vairÄkÄs platformÄs.
Å Ä«s tehnoloÄ£ijas nÄkotne: iedomÄjieties, vai Microsoft Windows 10 darbotos pÄrlÅ«kprogrammÄ Chrome?
MÄkoÅspÄles ir tehniski sarežģītas
SpÄles ir viena no retajÄm jomÄm, kur nepiecieÅ”ama pastÄvÄ«ga un Ätra lietotÄja reakcija. Ja dažkÄrt mÄs saskaramies ar 2 sekunžu aizkavi, noklikŔķinot uz lapas, tas ir pieÅemams. TieÅ”raides video straumes mÄdz aizkavÄties dažas sekundes, taÄu tÄs joprojÄm piedÄvÄ saprÄtÄ«gu lietojamÄ«bu. TomÄr, ja spÄle bieži kavÄjas par 500 ms, to vienkÄrÅ”i nevar spÄlÄt. MÅ«su mÄrÄ·is ir panÄkt ÄrkÄrtÄ«gi zemu latentumu, lai atstarpe starp ievadi un datu nesÄju bÅ«tu pÄc iespÄjas mazÄka. TÄpÄc tradicionÄlÄ pieeja video straumÄÅ”anai Å”eit nav piemÄrojama.
VispÄrÄjÄ mÄkoÅa spÄles veidne
AtvÄrtÄ koda projekts CloudRetro
NolÄmu izveidot mÄkoÅspÄles testa paraugu, lai noskaidrotu, vai tas viss ir iespÄjams ar tik stingriem tÄ«kla ierobežojumiem. Es izvÄlÄjos Golang kÄ koncepcijas pierÄdÄ«jumu, jo tÄ bija valoda, kuru es zinÄju vislabÄk, un tÄ bija ļoti piemÄrota Å”ai ievieÅ”anai daudzu citu iemeslu dÄļ, kÄ es vÄlÄk atklÄju. Go ir vienkÄrÅ”s un attÄ«stÄs ļoti Ätri; KanÄli pakalpojumÄ Go ir lieliski piemÄroti daudzpavedienu pÄrvaldÄ«bai.
Projekts CloudRetro.io ir atvÄrtÄ koda mÄkoÅspÄļu pakalpojums retro spÄlÄm. Projekta mÄrÄ·is ir nodroÅ”inÄt visÄrtÄko spÄļu pieredzi tradicionÄlajÄs retro spÄlÄs un pievienot vairÄku spÄlÄtÄju režīmu.
VairÄk par projektu varat uzzinÄt Å”eit: https://github.com/giongto35/cloud-game.
CloudRetro funkcionalitÄte
CloudRetro izmanto retro spÄles, lai demonstrÄtu mÄkoÅspÄļu spÄku. Kas ļauj iegÅ«t daudz unikÄlu spÄļu pieredzi.
SpÄles pÄrnesamÄ«ba
TÅ«lÄ«tÄja atskaÅoÅ”ana, atverot lapu; nav nepiecieÅ”ama lejupielÄde vai instalÄÅ”ana
Darbojas mobilajÄ pÄrlÅ«kprogrammÄ, tÄpÄc tÄ palaiÅ”anai nav nepiecieÅ”ama programmatÅ«ra
SpÄļu sesijas var koplietot vairÄkÄs ierÄ«cÄs un saglabÄt mÄkonÄ«, lai nÄkamreiz pieteiktos
SpÄli var straumÄt vai to var spÄlÄt vairÄki lietotÄji vienlaikus:
Crowdplay, piemÄram, TwitchPlayPokemon, tikai vairÄk platformu un vairÄk reÄllaika
Bezsaistes spÄles tieÅ”saistÄ. Daudzi lietotÄji var spÄlÄt bez tÄ«kla iestatÄ«Å”anas. Samurai Shodown tagad var spÄlÄt 2 spÄlÄtÄji, izmantojot CloudRetro tÄ«klu
TieÅ”saistes vairÄku spÄlÄtÄju spÄles demonstrÄcijas versija dažÄdÄs ierÄ«cÄs
Infrastruktūra
Prasības un tehnoloģiju kaudze
ZemÄk ir saraksts ar prasÄ«bÄm, kuras es izvirzÄ«ju pirms projekta uzsÄkÅ”anas.
1. Viens spÄlÄtÄjs
IespÄjams, ka Ŕī prasÄ«ba Å”eit neŔķiet pÄrÄk svarÄ«ga vai acÄ«mredzama, taÄu tÄ ir viena no manÄm galvenajÄm iespÄjÄm, kas ļauj mÄkoÅspÄlÄm palikt pÄc iespÄjas tÄlÄk no tradicionÄlajiem straumÄÅ”anas pakalpojumiem. Ja mÄs koncentrÄjamies uz viena spÄlÄtÄja spÄli, mÄs varam atbrÄ«voties no centralizÄta servera vai CDN, jo mums nav jÄstraumÄ masÄm. TÄ vietÄ, lai augÅ”upielÄdÄtu straumes uz izlietnes serveri vai nosÅ«tÄ«tu paketes uz centralizÄtu WebSocket serveri, pakalpojumu straumes tiek piegÄdÄtas tieÅ”i lietotÄjam, izmantojot vienÄdranga WebRTC savienojumu.
2. Zema latentuma multivides straume
Lasot par Stadia, bieži vien dažos rakstos redzu pieminÄtu WebRTC. Es sapratu, ka WebRTC ir izcila tehnoloÄ£ija un ir lieliski piemÄrota izmantoÅ”anai mÄkoÅspÄlÄs. WebRTC ir projekts, kas nodroÅ”ina tÄ«mekļa pÄrlÅ«kprogrammÄm un mobilajÄm lietojumprogrammÄm reÄllaika saziÅu, izmantojot vienkÄrÅ”u API. Tas nodroÅ”ina peer-to-peer savienojumu, ir optimizÄts multividei, un tajÄ ir iebÅ«vÄti standarta kodeki, piemÄram, VP8 un H264.
Es uzskatÄ«ju par prioritÄti labÄkÄs iespÄjamÄs lietotÄja pieredzes nodroÅ”inÄÅ”anu, nevis augstas kvalitÄtes grafikas uzturÄÅ”anu. AlgoritmÄ daži zaudÄjumi ir pieÅemami. PakalpojumÄ Google Stadia ir papildu darbÄ«ba, lai samazinÄtu attÄla izmÄru serverÄ«, un kadri tiek palielinÄti lÄ«dz augstÄkai kvalitÄtei, pirms tie tiek pÄrsÅ«tÄ«ti vienaudžiem.
3. SadalÄ«ta infrastruktÅ«ra ar Ä£eogrÄfisko marÅ”rutÄÅ”anu
NeatkarÄ«gi no tÄ, cik optimizÄts ir saspieÅ”anas algoritms un kods, tÄ«kls joprojÄm ir noteicoÅ”ais faktors, kas visvairÄk ietekmÄ latentumu. ArhitektÅ«rai ir jÄbÅ«t mehÄnismam, lai savienotu pÄrÄ« ar lietotÄjam vistuvÄko serveri, lai samazinÄtu turp un atpakaļ laiku (RTT). ArhitektÅ«rai ir jÄbÅ«t 1 koordinatoram un vairÄkiem straumÄÅ”anas serveriem, kas izplatÄ«ti visÄ pasaulÄ: ASV rietumos, ASV austrumos, EiropÄ, SingapÅ«rÄ, ĶīnÄ. Visiem straumÄÅ”anas serveriem jÄbÅ«t pilnÄ«bÄ izolÄtiem. SistÄma var pielÄgot tÄ izplatÄ«Å”anu, kad serveris pievienojas tÄ«klam vai atstÄj to. TÄdÄjÄdi ar lielu trafiku papildu serveru pievienoÅ”ana ļauj veikt horizontÄlu mÄrogoÅ”anu.
4. PÄrlÅ«kprogrammu saderÄ«ba
MÄkoÅspÄļu spÄle ir vislabÄkÄ, ja tÄ no lietotÄjiem prasa vismazÄk. Tas nozÄ«mÄ, ka ir iespÄjams palaist pÄrlÅ«kprogrammÄ. PÄrlÅ«kprogrammas palÄ«dz lietotÄjiem padarÄ«t spÄļu pieredzi pÄc iespÄjas ÄrtÄku, pasargÄjot viÅus no programmatÅ«ras un aparatÅ«ras instalÄÅ”anas. PÄrlÅ«kprogrammas arÄ« palÄ«dz nodroÅ”inÄt starpplatformu funkcionalitÄti starp mobilajÄm un galddatoru versijÄm. Par laimi WebRTC tiek labi atbalstÄ«ts dažÄdÄs pÄrlÅ«kprogrammÄs.
5. Skaidra spÄles interfeisa un pakalpojuma atdalÄ«Å”ana
Es uzskatu mÄkoÅspÄļu pakalpojumu kÄ platformu. Ikvienam vajadzÄtu bÅ«t iespÄjai pieslÄgt platformai jebko. Tagad esmu integrÄjies LibRetro ar mÄkoÅspÄļu pakalpojumu, jo LibRetro piedÄvÄ skaistu spÄļu emulatora saskarni retro spÄlÄm, piemÄram, SNES, GBA, PS.
6. Telpas vairÄku spÄlÄtÄju spÄlei, pūļa spÄlei un ÄrÄjai saitei (dziÄ¼Ä saite) ar spÄli
CloudRetro atbalsta daudzas jaunas spÄles, piemÄram, CrowdPlay un Online MultiPlayer retro spÄlÄm. Ja vairÄki lietotÄji dažÄdos datoros atver vienu un to paÅ”u dziļo saiti, viÅi redzÄs vienu un to paÅ”u skrieÅ”anas spÄli un pat varÄs tai pievienoties.
TurklÄt spÄļu stÄvokļi tiek glabÄti mÄkoÅa krÄtuvÄ. Tas ļauj lietotÄjiem jebkurÄ laikÄ turpinÄt spÄlÄt jebkurÄ citÄ ierÄ«cÄ.
7. HorizontÄlÄ mÄrogoÅ”ana
TÄpat kÄ jebkura SAAS mÅ«sdienÄs, mÄkoÅspÄlei jÄbÅ«t veidotai tÄ, lai tÄ bÅ«tu horizontÄli mÄrogojama. Koordinatora un darbinieka dizains ļauj pievienot vairÄk darbinieku, lai apkalpotu lielÄku trafiku.
8. Nav savienojuma ar vienu mÄkoni
CloudRetro infrastruktÅ«ra tiek mitinÄta dažÄdos mÄkoÅpakalpojumos (Digital Ocean, Alibaba, pielÄgots pakalpojumu sniedzÄjs) dažÄdiem reÄ£ioniem. Es iespÄjoju darbÄ«bu Docker konteinerÄ infrastruktÅ«rai un konfigurÄju tÄ«kla iestatÄ«jumus, izmantojot bash skriptu, lai izvairÄ«tos no bloÄ·ÄÅ”anas vienÄ mÄkoÅa pakalpojumu sniedzÄjÄ. Apvienojot to ar NAT Traversal WebRTC, mÄs varam elastÄ«gi izvietot CloudRetro jebkurÄ mÄkoÅa platformÄ un pat jebkurÄ lietotÄja ierÄ«cÄs.
ArhitektÅ«ras projektÄÅ”ana
StrÄdnieks: (vai iepriekÅ” minÄtais straumÄÅ”anas serveris) pavairo spÄles, palaiž kodÄÅ”anas cauruļvadu un straumÄ kodÄto multividi lietotÄjiem. Darbinieku gadÄ«jumi tiek izplatÄ«ti visÄ pasaulÄ, un katrs darbinieks var vienlaikus apstrÄdÄt vairÄkas lietotÄja sesijas.
Koordinators: ir atbildÄ«gs par jaunÄ lietotÄja savienoÅ”anu pÄrÄ« ar straumÄÅ”anai piemÄrotÄko darbinieku. Koordinators sazinÄs ar darbiniekiem, izmantojot WebSocket.
SpÄles stÄvokļa krÄtuve: centrÄlÄ attÄlÄ krÄtuve visiem spÄles stÄvokļiem. Å Ä« krÄtuve nodroÅ”ina svarÄ«gas funkcijas, piemÄram, attÄlo saglabÄÅ”anu/ielÄdÄÅ”anu.
CloudRetro augstÄkÄ lÄ«meÅa arhitektÅ«ra
PielÄgots skripts
Kad jauns lietotÄjs atver CloudRetro 1. un 2. darbÄ«bÄ, kas parÄdÄ«ts attÄlÄ zemÄk, koordinators kopÄ ar pieejamo darbinieku sarakstu tiek pieprasÄ«ts pirmajÄ lapÄ. PÄc tam 3. darbÄ«bÄ klients aprÄÄ·ina aizkavi visiem kandidÄtiem, izmantojot HTTP ping pieprasÄ«jumu. PÄc tam Å”is kavÄjumu saraksts tiek nosÅ«tÄ«ts atpakaļ koordinatoram, lai viÅÅ” varÄtu noteikt lietotÄja apkalpoÅ”anai piemÄrotÄko darbinieku. TÄlÄk sniegtÄ 4. darbÄ«ba izveido spÄli. WebRTC straumÄÅ”anas savienojums tiek izveidots starp lietotÄju un pieŔķirto darbinieku.
LietotÄja skripts pÄc piekļuves iegÅ«Å”anas
Kas ir strÄdnieka iekÅ”ienÄ
SpÄļu un straumÄÅ”anas cauruļvadi tiek glabÄti darbinieka iekÅ”ienÄ izolÄti un apmainÄs ar informÄciju, izmantojot saskarni. PaÅ”laik Ŕī saziÅa tiek veikta, pÄrsÅ«tot datus atmiÅÄ, izmantojot Golang kanÄli tajÄ paÅ”Ä procesÄ. NÄkamais mÄrÄ·is ir segregÄcija, t.i. neatkarÄ«ga spÄles palaiÅ”ana citÄ procesÄ.
Darbinieku komponentu mijiedarbība
GalvenÄs sastÄvdaļas:
WebRTC: klienta komponents, kas pieÅem lietotÄja ievadi un izvada kodÄtu datu nesÄju no servera.
SpÄles emulators: spÄles sastÄvdaļa. Pateicoties Libretro bibliotÄkai, sistÄma spÄj palaist spÄli tajÄ paÅ”Ä procesÄ un iekÅ”Äji pÄrtvert multivides un ievades straumi.
SpÄles kadri tiek tverti un nosÅ«tÄ«ti uz kodÄtÄju.
AttÄla/audio kodÄtÄjs: kodÄÅ”anas konveijera, kas Åem multivides kadrus, kodÄ tos fonÄ un izvada kodÄtus attÄlus/audio.
IevieŔana
CloudRetro balstÄs uz WebRTC kÄ savu mugurkaula tehnoloÄ£iju, tÄpÄc, pirms iedziļinÄties Golang ievieÅ”anas detaļÄs, es nolÄmu runÄt par paÅ”u WebRTC. Å Ä« ir pÄrsteidzoÅ”a tehnoloÄ£ija, kas man ir ļoti palÄ«dzÄjusi sasniegt datu straumÄÅ”anas latentumu, kas ir mazÄks par sekundi.
WebRTC
WebRTC ir izstrÄdÄts, lai nodroÅ”inÄtu augstas kvalitÄtes vienÄdranga savienojumus vietÄjÄs mobilajÄs lietotnÄs un pÄrlÅ«kprogrammÄs, izmantojot vienkÄrÅ”as API.
NAT ŔķÄrsoÅ”ana
WebRTC ir pazÄ«stama ar savu NAT Traversal funkcionalitÄti. WebRTC ir paredzÄts peer-to-peer saziÅai. TÄs mÄrÄ·is ir atrast vispiemÄrotÄko tieÅ”o marÅ”rutu, izvairoties no NAT vÄrtejÄm un ugunsmÅ«riem vienÄdranga saziÅai, izmantojot procesu, ko sauc. ICE. Å Ä« procesa ietvaros WebRTC API atrod jÅ«su publisko IP adresi, izmantojot STUN serverus, un pÄrsÅ«ta to releja serverim (Pagrieziens), ja nevar izveidot tieÅ”u savienojumu.
TomÄr CloudRetro pilnÄ«bÄ neizmanto Å”o funkciju. TÄ peer-to-peer savienojumi nepastÄv starp lietotÄjiem, bet gan starp lietotÄjiem un mÄkoÅserveriem. Modeļa servera pusÄ ir mazÄk tieÅ”o saziÅas ierobežojumu nekÄ parastajai lietotÄja ierÄ«cei. Tas ļauj iepriekÅ” atvÄrt ienÄkoÅ”os portus vai tieÅ”i izmantot publiskÄs IP adreses, jo serveris neatrodas aiz NAT.
IepriekÅ” es gribÄju projektu pÄrvÄrst par spÄļu izplatÄ«Å”anas platformu Cloud Gaming. Ideja bija ļaut spÄļu veidotÄjiem nodroÅ”inÄt spÄles un straumÄÅ”anas resursus. Un lietotÄji tieÅ”i sazinÄtos ar pakalpojumu sniedzÄjiem. Å ÄdÄ decentralizÄtÄ veidÄ CloudRetro ir tikai sistÄma treÅ”o puÅ”u straumÄÅ”anas resursu savienoÅ”anai ar lietotÄjiem, padarot to mÄrogojamÄku, kad tas vairs netiek mitinÄts. WebRTC NAT Traversal loma Å”eit ir ļoti svarÄ«ga, lai atvieglotu vienÄdranga savienojuma inicializÄciju treÅ”Äs puses straumÄÅ”anas resursos, padarot izveidotÄjam vieglÄku savienojumu ar tÄ«klu.
Video saspieŔana
Video saspieÅ”ana ir neatÅemama cauruļvada sastÄvdaļa un lielÄ mÄrÄ veicina vienmÄrÄ«gu plÅ«smu. Lai gan nav jÄzina visas VP8/H264 video kodÄÅ”anas detaļas, jÄdzienu izpratne var palÄ«dzÄt izprast video straumÄÅ”anas Ätruma opcijas, atkļūdot neparedzÄtu darbÄ«bu un pielÄgot latentumu.
Videoklipa saspieÅ”ana straumÄÅ”anas pakalpojumam ir sarežģīta, jo algoritmam ir jÄnodroÅ”ina, lai kopÄjais kodÄÅ”anas laiks + tÄ«kla pÄrraides laiks + dekodÄÅ”anas laiks bÅ«tu pÄc iespÄjas mazÄks. TurklÄt kodÄÅ”anas procesam jÄbÅ«t konsekventam un nepÄrtrauktam. Daži kodÄÅ”anas kompromisi netiek piemÄroti, piemÄram, mÄs nevaram dot priekÅ”roku gariem kodÄÅ”anas laikiem, salÄ«dzinot ar mazÄkiem faila izmÄriem un dekodÄÅ”anas laikiem, vai izmantot nekonsekventu saspieÅ”anu.
Video saspieÅ”anas ideja ir novÄrst nevajadzÄ«gus informÄcijas bitus, vienlaikus saglabÄjot lietotÄjiem pieÅemamu precizitÄtes lÄ«meni. Papildus atseviŔķu statisko attÄlu kadru kodÄÅ”anai algoritms secina paÅ”reizÄjo kadru no iepriekÅ”ÄjÄ un nÄkamÄ kadra, tÄpÄc tiek nosÅ«tÄ«ta tikai to atŔķirÄ«ba. KÄ redzams piemÄrÄ ar Pacman, tiek pÄrraidÄ«ti tikai diferenciÄlie punkti.
Video kadru salÄ«dzinÄjums, izmantojot Pacman kÄ piemÄru
Audio kompresija
TÄpat audio saspieÅ”anas algoritms izlaiž datus, ko cilvÄki nevar uztvert. Opus paÅ”laik ir labÄkais audio kodeks. Tas ir paredzÄts audio viļÅu pÄrraidÄ«Å”anai, izmantojot pasÅ«tÄ«tu datagrammas protokolu, piemÄram, RTP (Real Time Transport Protocol). TÄ latentums ir mazÄks nekÄ mp3 un aac, un kvalitÄte ir augstÄka. Latentums parasti ir aptuveni 5ā66,5 ms.
Pion, WebRTC GolangÄ
Bandinieks ir atvÄrtÄ koda projekts, kas nodroÅ”ina WebRTC GolangÄ. VietÄjo C++ WebRTC bibliotÄku parastÄs iesaiÅoÅ”anas vietÄ Pion ir WebRTC vietÄjÄ Golang implementÄcija ar labÄku veiktspÄju, Go integrÄciju un WebRTC protokolu versiju kontroli.
BibliotÄka nodroÅ”ina arÄ« straumÄÅ”anu ar daudzÄm lieliskÄm iebÅ«vÄtÄm ierÄ«cÄm ar nepilnu sekundes latentumu. Tam ir sava STUN, DTLS, SCTP utt. ievieÅ”ana. un daži eksperimenti ar QUIC un WebAssembly. Å Ä« atvÄrtÄ pirmkoda bibliotÄka pati par sevi ir patieÅ”Äm labs mÄcÄ«bu resurss ar lielisku dokumentÄciju, tÄ«kla protokolu ievieÅ”anu un lieliskiem piemÄriem.
Pion kopiena, kuru vada ļoti kaislÄ«gs veidotÄjs, ir diezgan dzÄ«va, un par WebRTC notiek daudz kvalitatÄ«vu diskusiju. Ja jÅ«s interesÄ Å”Ä« tehnoloÄ£ija, pievienojieties http://pion.ly/slack ā uzzinÄsi daudz jauna.
CloudRetro rakstÄ«Å”ana GolangÄ
Darbinieka ievieŔana Go
Iet uz kanÄlu darbÄ«bu
Pateicoties Go skaistajam kanÄla dizainam, notikumu straumÄÅ”anas un vienlaicÄ«bas problÄmas ir ievÄrojami vienkÄrÅ”otas. TÄpat kÄ diagrammÄ, dažÄdÄm GoRoutines ir vairÄki komponenti, kas darbojas paralÄli. Katrs komponents pÄrvalda savu stÄvokli un sazinÄs pa kanÄliem. Golanga selektÄ«vais apgalvojums liek katru reizi spÄles laikÄ apstrÄdÄt vienu atomÄro notikumu (spÄles Ä·eksÄ«tis). Tas nozÄ«mÄ, ka Å”im dizainam nav nepiecieÅ”ama bloÄ·ÄÅ”ana. PiemÄram, kad lietotÄjs saglabÄ, ir nepiecieÅ”ams pilns spÄles stÄvokļa momentuzÅÄmums. Å im stÄvoklim ir jÄpaliek nepÄrtrauktam, piesakoties, lÄ«dz saglabÄÅ”ana ir pabeigta. Katras spÄles atzÄ«mÄÅ”anas laikÄ aizmugursistÄma var veikt tikai saglabÄÅ”anas vai ievades darbÄ«bu, padarot procesa pavedienu droÅ”u.
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
Å Ä« Golang veidne lieliski atbilst manam CrowdPlay un Multiple Player lietoÅ”anas gadÄ«jumam. Sekojot Å”im modelim, visas lietotÄja ievades vienÄ telpÄ ir iebÅ«vÄtas centrÄlajÄ ieejas kanÄlÄ. PÄc tam spÄļu multivide tiek izvietota visiem lietotÄjiem vienÄ telpÄ. TÄdÄ veidÄ mÄs panÄkam spÄles stÄvokļa sadalÄ«jumu starp vairÄkÄm dažÄdu lietotÄju spÄļu sesijÄm.
SinhronizÄcija starp dažÄdÄm sesijÄm
Golanga trūkumi
Golangs nav ideÄls. KanÄls ir lÄns. SalÄ«dzinot ar bloÄ·ÄÅ”anu, Go kanÄls ir vienkÄrÅ”i vienkÄrÅ”Äks veids, kÄ apstrÄdÄt vienlaikus un pavedienus, bet kanÄls nenodroÅ”ina vislabÄko veiktspÄju. Zem kanÄla ir sarežģīta bloÄ·ÄÅ”anas loÄ£ika. TÄpÄc es veicu dažus ievieÅ”anas pielÄgojumus, nomainot kanÄlus, atkÄrtoti piemÄrojot slÄdzenes un atomu vÄrtÄ«bas, lai optimizÄtu veiktspÄju.
TurklÄt atkritumu savÄcÄjs GolangÄ nav apsaimniekots, kas dažkÄrt izraisa aizdomÄ«gi ilgas pauzes. Tas ievÄrojami traucÄ reÄllaika straumÄÅ”anas lietojumprogrammu.
COG
ProjektÄ tiek izmantota esoÅ”Ä atvÄrtÄ pirmkoda Golang VP8/H264 bibliotÄka multivides saspieÅ”anai un Libretro spÄļu emulatoriem. Visas Ŕīs bibliotÄkas ir vienkÄrÅ”i lietotnes Go C bibliotÄkas iesaiÅojumi COG. Daži no trÅ«kumiem ir uzskaitÄ«ti Å”o Deiva Äeinija ziÅu. ProblÄmas, ar kurÄm es saskÄros:
nespÄja noÄ·ert avÄriju CGO, pat ar Golang RecoveryCrash;
nespÄja noteikt veiktspÄjas vÄjÄs vietas, ja mÄs nevaram atklÄt detalizÄtas problÄmas CGO.
SecinÄjums
Es sasniedzu savu mÄrÄ·i izprast mÄkoÅspÄļu pakalpojumus un izveidot platformu, kas palÄ«dz man tieÅ”saistÄ spÄlÄt nostalÄ£iskas retro spÄles ar draugiem. Å is projekts nebÅ«tu iespÄjams bez Pion bibliotÄkas un Pion kopienas atbalsta. Esmu ÄrkÄrtÄ«gi pateicÄ«gs par tÄ intensÄ«vo attÄ«stÄ«bu. WebRTC un Pion nodroÅ”inÄtÄs vienkÄrÅ”Äs API nodroÅ”inÄja netraucÄtu integrÄciju. Mans pirmais koncepcijas pierÄdÄ«jums tika izlaists tajÄ paÅ”Ä nedÄļÄ, lai gan man nebija iepriekÅ”Äju zinÄÅ”anu par vienÄdranga (P2P) komunikÄciju.
Neskatoties uz integrÄcijas vieglumu, P2P straumÄÅ”ana patieÅ”Äm ir ļoti sarežģīta joma datorzinÄtnÄs. Lai izveidotu vienÄdranga sesiju, viÅai ir jÄrisina sarežģītÄ«ba saistÄ«bÄ ar ilgstoÅ”Äm tÄ«kla arhitektÅ«rÄm, piemÄram, IP un NAT. StrÄdÄjot pie Ŕī projekta, ieguvu daudz vÄrtÄ«gu zinÄÅ”anu par tÄ«klu veidoÅ”anu un veiktspÄjas optimizÄciju, tÄpÄc aicinu ikvienu izmÄÄ£inÄt P2P produktu izveidi, izmantojot WebRTC.
CloudRetro atbilst visiem lietoÅ”anas gadÄ«jumiem, ko es gaidÄ«ju no manas retro spÄlÄtÄja perspektÄ«vas. TomÄr es domÄju, ka projektÄ ir daudzas jomas, kuras varu uzlabot, piemÄram, padarÄ«t tÄ«klu uzticamÄku un veiktspÄjÄ«gÄku, nodroÅ”inÄt augstÄkas kvalitÄtes spÄļu grafiku vai iespÄju koplietot spÄles starp lietotÄjiem. Es smagi strÄdÄju pie Ŕī. LÅ«dzu sekojiet projektu un atbalstiet to, ja jums tas patÄ«k.