Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums

Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
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.

Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
Šī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.

Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
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

    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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.

    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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.
    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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ā.

    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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.

    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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ā

    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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.

    Atvērtā koda mākoņspēles vietnē WebRTC: p2p, vairāku spēlētāju spēle, nulles latentums
    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.

Avots: www.habr.com

Pievieno komentāru