Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza

Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
Software cum'è serviziu, infrastruttura cum'è serviziu, piattaforma cum'è serviziu, piattaforma di cumunicazione cum'è serviziu, videoconferenza cum'è serviziu, è chì ne di Cloud Gaming cum'è serviziu? Ci hè digià statu parechji tentativi di creà ghjoculi in nuvola (Cloud Gaming), cum'è Stadia, recentemente lanciatu da Google. Stadia micca novu à WebRTC, ma altri ponu aduprà WebRTC in u listessu modu?

Thanh Nguyen hà decisu di pruvà sta pussibilità nantu à u so prughjettu open source CloudRetro. CloudRetro hè basatu annantu à Pion, pupulari Biblioteca WebRTC basata in Go (grazie Shownu da u squadra di sviluppu di Pion per u so aiutu cù questu articulu). In questu articulu, Thanh dà una visione generale di l'architettura di u so prughjettu, è parla ancu di ciò chì hà amparatu utile è di e sfide chì hà scontru in u travagliu.

Plus

L'annu passatu, quandu Google hà annunziatu Stadia, m'hà sbulicatu. L'idea hè cusì unica è innovativa chì mi dumandava constantemente cumu era ancu pussibule cù a tecnulugia esistente. U desideriu di capisce megliu stu tema m'hà incitatu à creà a mo propria versione di un ghjocu di nuvola open-source. U risultatu era simplicemente fantasticu. Quì sottu mi piacerebbe sparte u prucessu di travaglià nantu à u mo annu prughjettu.

TLDR: versione di diapositiva corta cù highlights

Perchè u ghjocu in nuvola hè u futuru

Credu chì u Cloud Gaming diventerà prestu una nova generazione di ghjochi micca solu, ma ancu altri spazii di l'informatica. U ghjocu in nuvola hè u pinnacle di u mudellu di cliente / servitore. Stu mudellu maximizeghja a gestione backend è minimizza u travagliu di frontend allughjendu a logica di ghjocu in un servitore remotu è streaming images / audio à u cliente. U servitore face u prucessu pesante cusì u cliente ùn hè più sottumessu à limitazioni hardware.

Google Stadia vi permette basicamente di ghjucà ghjochi AAA (vale à dì ghjochi di blockbuster high-end) nantu à una interfaccia cum'è YouTube. A stessa metodulugia pò esse appiicata à altre applicazioni offline pesanti cum'è u sistema operatore o u disignu graficu 2D / 3D, etc. in modu chì pudemu eseguisce in modu stabile nantu à i dispusitivi low-spec in tutte e plataforme.

Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
U futuru di sta tecnulugia: Immaginate se Microsoft Windows 10 correva nantu à u navigatore Chrome?

U ghjocu in nuvola hè tecnicamente difficiule

U ghjocu hè unu di quelli rari spazii induve una reazione rapida constante di l'utilizatore hè necessaria. Se in ocasu scontru un ritardu di 2 seconde quandu clicchendu nantu à una pagina, questu hè accettatu. I flussi di video in diretta tendenu à esse uni pochi di seconde, ma offrenu sempre una bona quantità di usabilità. Tuttavia, se u ghjocu hè spessu ritardatu da 500 ms, ùn hè micca pussibule di ghjucà. U nostru scopu hè di ottene una latenza estremamente bassa per chì a distanza trà input è media hè u più chjucu pussibule. Dunque, l'approcciu tradiziunale di streaming video ùn hè micca applicabile quì.

Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
Template di ghjocu generale in nuvola

Prughjettu open source CloudRetro

Aghju decisu di creà una prova di prova di un ghjocu di nuvola per vede s'ellu tuttu questu hè pussibule cù restrizioni di rete cusì severi. Aghju sceltu Golang per a prova di cuncettu perchè hè a lingua chì sò più familiarizata è una bona adatta per questa implementazione per parechje altre ragioni, cum'è aghju scupertu dopu. Go hè simplice è si sviluppa assai rapidamente; I canali in Go sò fantastichi per gestisce multithreading.

U prugettu CloudRetro.io hè un serviziu di ghjocu in nuvola open source per i ghjoculi retro. L'obiettivu di u prugettu hè di portà l'esperienza di ghjocu più còmoda à i ghjochi retro tradiziunali è aghjunghje multiplayer.
Pudete sapè più nantu à u prugettu quì: https://github.com/giongto35/cloud-game.

Funzionalità CloudRetro

CloudRetro usa ghjochi retro per dimustrà u putere di i ghjoculi in nuvola. Chì vi permette di ottene assai sperienze di ghjocu uniche.

  • Portabilità di u ghjocu
    • Riproduzione istantanea quandu apre una pagina; ùn hè micca necessariu scaricamentu è installazione
    • Funziona in un navigatore mobile, per quessa, ùn hè micca necessariu un software per esse

  • E sessioni di ghjocu ponu esse spartute in parechje dispositi è almacenate in u nuvulu per a prossima volta chì accede
  • U ghjocu pò esse in streaming, o pudete ghjucà cù parechji utilizatori à una volta:
    • Crowdplay cum'è TwitchPlayPokemon, solu più multipiattaforma è più in tempu reale
    • Ghjochi offline in linea. Parechji utilizatori ponu ghjucà senza configurazione di rete. Samurai Shodown pò avà esse ghjucatu cù 2 ghjucatori nantu à a reta CloudRetro

    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Versione demo di u ghjocu multiplayer in linea nantu à diversi dispositi

    Infrastruttura

    Requisiti è stack di tecnulugia

    Quì sottu hè una lista di esigenze chì aghju stabilitu prima di inizià u prugettu.

    1. Un ghjucadore
    Questa esigenza ùn pare micca troppu impurtante o ovvia quì, ma hè unu di i mo chjavi, permette à i ghjoculi in nuvola di stà u più luntanu da i servizii di streaming tradiziunali. Se ci focalizemu nantu à un ghjocu unicu ghjucatore, pudemu sbarazzà di un servitore centralizatu o CDN perchè ùn avemu micca da trasmette à e masse. Invece di caricare i flussi in un servitore sink o di passà pacchetti à un servitore WebSocket centralizatu, i flussi di serviziu sò mandati direttamente à l'utilizatore via una cunnessione WebRTC peer-to-peer.

    2. Flussu media di bassa latenza
    Quandu leghje nantu à Stadia, vecu spessu WebRTC citatu in certi articuli. Aghju realizatu chì WebRTC hè una tecnulugia eccezziunale, è hè grande per l'usu in i ghjoculi in nuvola. WebRTC hè un prughjettu chì furnisce i navigatori web è l'applicazioni mobili cù cumunicazione in tempu reale per mezu di una API simplice. Fornisce una connettività peer-to-peer, hè ottimizzata per i media, è hà codec standard integrati cum'è VP8 è H264.

    Aghju priurità di furnisce a megliu sperienza d'utilizatore pussibule sopra à mantene una grafica di alta qualità. Certi perditi sò permessi in l'algoritmu. Google Stadia hà un passu supplementu per riduce a dimensione di l'imaghjini nantu à u servitore è i frames sò upscaled à una qualità più alta prima di passà à i pari.

    3. Infrastruttura distribuita cù routing geugraficu
    Ùn importa micca quantu l'algoritmu di compressione è u codice sò ottimizzati, a rete hè sempre u fattore decisivu chì cuntribuisce più à a latenza. L'architettura deve avè un mecanismu per accoppià u servitore più vicinu à l'utilizatore per riduce u tempu di andata (RTT). L'architettura deve avè 1 coordinatore è parechji servitori di streaming distribuiti in u mondu: US West, US East, Europe, Singapore, China. Tutti i servitori di streaming devenu esse cumpletamente isolati. U sistema pò aghjustà a so distribuzione quandu un servitore si unisce o abbanduneghja a reta. Cusì, cù un grande trafficu, aghjunghjendu servitori supplementari permette di scaling horizontale.

    4. Cumpatibulità Browser
    U ghjocu in nuvola hè à u so megliu quandu esige u minimu minimu da l'utilizatori. Questu significa chì hè pussibule di eseguisce in u navigatore. I navigatori aiutanu à fà l'esperienza di ghjocu u più còmoda pussibule per l'utilizatori, salvendu da installà software è hardware. I navigatori aiutanu ancu à furnisce una piattaforma multiplataforma per e versioni mobile è desktop. Fortunatamente, WebRTC hè ben supportatu in diversi navigatori.

    5. Separazione chjaru di l'interfaccia di u ghjocu è u serviziu
    Vedu u serviziu di ghjocu in nuvola cum'è una piattaforma. Ognunu deve esse capace di cunnette qualcosa à a piattaforma. Avà aghju integratu LibRetro cù u serviziu di ghjocu in nuvola perchè LibRetro offre una bella interfaccia di emulatore di ghjocu per ghjochi retro cum'è SNES, GBA, PS.

    6. Camere per multiplayer, ghjocu di folla è ligami esterni (deep-link) cù u ghjocu
    CloudRetro supporta parechji ghjochi novi cum'è CrowdPlay è Online MultiPlayer per i ghjochi retro. Sè parechji utilizatori apre u listessu deep-link nant'à urdinatore differente, vi vede u listessu ghjocu corsa è ancu esse capaci di unisce lu.

    Inoltre, i stati di u ghjocu sò almacenati in u almacenamentu in nuvola. Stu permette utilizatori à cuntinuà à ghjucà à ogni mumentu nant'à ogni altru dispusitivu.

    7. Scala horizontale
    Cum'è qualsiasi SAAS oghje, u ghjocu in nuvola deve esse cuncepitu per esse scalabile orizzontalmente. U disignu di u coordinatore-travagliatore permette di aghjunghje più travagliadori per serve più trafficu.

    8. Ùn ligatu à una nuvola
    L'infrastruttura CloudRetro hè ospitata da diversi fornitori di nuvola (Oceanu Digitale, Alibaba, fornitore persunalizatu) per e diverse regioni. Abilitu l'esecuzione in un containeru Docker di infrastruttura è cunfigurà i paràmetri di a rete cù un script bash per evità di esse dipendente da un solu fornitore di nuvola. Cumminendu questu cù NAT Traversal in WebRTC, pudemu avè a flessibilità di implementà CloudRetro in qualsiasi piattaforma di nuvola è ancu ogni macchina di l'utilizatori.

    Disegnu architettonicu

    U travagliu: (o u servitore di streaming citatu sopra) multiplica i ghjoculi, gestisce u pipeline di codificazione, è trasmette i media codificati à l'utilizatori. L'istanze di i travagliadori sò distribuiti in u mondu, è ogni travagliadore pò gestisce parechje sessioni d'utilizatori simultaneamente.

    Coordinatore: hè rispunsevule per accoppià u novu utilizatore cù u travagliu di streaming più adattatu. U coordinatore cumunica cù i travagliadori via WebSocket.

    Memoria di u statu di u ghjocu: almacenamiento remoto centrale per tutti i stati di ghjocu. Stu almacenamentu furnisce funzioni impurtanti cum'è salvezza / carica remota.

    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Architettura di primu livellu di CloudRetro

    Scrittura persunalizata

    Quandu un novu utilizatore apre CloudRetro in i passi 1 è 2 mostrati in a figura sottu, u coordinatore cù a lista di i travagliadori dispunibuli hè dumandatu à a prima pagina. Dopu questu, in u passu 3 u cliente calcula i ritardi per tutti i candidati utilizendu una dumanda ping HTTP. Questa lista di ritardi hè poi rimandata à u coordinatore per pudè determinà u travagliu più adattatu per serve l'utilizatore. Step 4 sottu crea u ghjocu. Una cunnessione di streaming WebRTC hè stabilita trà l'utilizatore è u travagliu assignatu.
    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Scrittura persunalizata dopu avè accessu

    Chì ci hè dentru u travagliadore

    I pipeline di ghjocu è streaming sò almacenati in u travagliadore in isolamentu è scambià infurmazioni quì attraversu l'interfaccia. Attualmente, sta cumunicazione hè realizata trasferendu dati in memoria Canali Golang in u listessu prucessu. U prossimu scopu hè a segregazione, i.e. lanciamentu indipendente di u ghjocu in un altru prucessu.

    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Interazione di cumpunenti di u travagliu

    Cumpunenti principali:

    • WebRTC: un cumpunente di u cliente chì accetta l'input di l'utilizatori è emette i media codificati da u servitore.
    • Emulatore di ghjocu: cumpunente di ghjocu. Grazie à a libreria Libretro, u sistema hè capaci di eseguisce u ghjocu in u stessu prucessu è intercepte i media è u flussu di input internamente.
    • I frames in u ghjocu sò catturati è mandati à u codificatore.
    • Codificatore d'imaghjini / audio: un pipeline di codificazione chì riceve frames media, li codifica in u sfondate, è produce immagini / audio codificati.

    Реализация

    CloudRetro s'appoghja nantu à WebRTC cum'è una tecnulugia di backbone, cusì prima di immersione in i dettagli di l'implementazione di Golang, decisu di parlà di WebRTC stessu. Hè un maravigghiusu pezzu di tecnulugia chì m'hà aiutatu immensamente à ottene streaming di latenza sub-seconda.

    WebRTC

    WebRTC hè pensatu per furnisce cunnessione peer-to-peer d'alta qualità nantu à l'app mobile nativa è i navigatori chì utilizanu API simplici.

    NAT Traversal

    WebRTC hè cunnisciutu per a so funziunalità NAT Traversal. WebRTC hè pensatu per a cumunicazione peer-to-peer. U so scopu hè di truvà a strada diretta più apprupriata, evitendu i gateway NAT è i firewall, per peer-to-peer attraversu un prucessu chjamatu GHIACCIO. In parte di stu prucessu, l'API WebRTC trovanu u vostru indirizzu IP publicu utilizendu i servitori STUN è u trasmettenu à un servitore relay (GIRU) quandu una cunnessione diretta ùn pò esse stabilita.

    Tuttavia, CloudRetro ùn sfrutta micca cumplettamente sta capacità. E so cunnessione peer-to-peer ùn esiste micca trà l'utilizatori, ma trà l'utilizatori è i servitori di nuvola. U latu di u servitore di u mudellu hà menu restrizioni à a cumunicazione diretta cà un dispositivu d'utilizatore tipicu. Questu permette di pre-apre i porti entranti o di utilizà l'indirizzi IP publichi direttamente, postu chì u servitore ùn hè micca daretu à NAT.

    Prima, vulia turnà u prugettu in una piattaforma di distribuzione di ghjocu per Cloud Gaming. L'idea era di permette à i creatori di ghjoculi di furnisce ghjochi è risorse in streaming. È l'utilizatori interagiscenu direttamente cù i fornituri. In questu modu descentralizatu, CloudRetro hè solu un quadru per cunnette risorse streaming di terze parti à l'utilizatori, facendu più scalabile quandu ùn hè più ospitu. U rolu di WebRTC NAT Traversal quì hè assai impurtante per facilità l'inizializazione di cunnessione peer-to-peer in risorse streaming di terzu, facendu più faciule per u creatore di cunnette à a reta.

    cumpressione Video

    A cumpressione Video hè una parte indispensabile di u pipeline è cuntribuisce assai à a fluidità di u flussu. Ancu s'ellu ùn hè micca necessariu cunnosce tutti i dettagli di a codificazione di video VP8 / H264, capiscenu u cuncettu aiuta à capisce i paràmetri di velocità di streaming video, debug cumportamentu inesperu, è aghjustà a latenza.

    Cumpressà u video per un serviziu di streaming hè sfida perchè l'algoritmu deve assicurà chì u tempu di codificazione tutale + u tempu di trasferimentu di rete + u tempu di decodificazione hè u più chjucu pussibule. Inoltre, u prucessu di codificazione deve esse coherente è cuntinuu. Certi scambii in codificazione ùn sò micca applicati - per esempiu, ùn pudemu micca preferite un tempu di codificazione longu nantu à una dimensione di file più chjuca è u tempu di decodificazione, o aduprà cumpressione inconsistente.

    L'idea daretu à a cumpressione di video hè di eliminà i pezzi innecessarii d'infurmazioni mentre mantene un livellu accettabile di fideltà per l'utilizatori. In più di codificà i frames d'imaghjini statici individuali, l'algoritmu inferisce u quadru attuale da u precedente è dopu, cusì solu a so diferenza hè mandata. Comu pudete vede da l'esempiu Pacman, solu i punti differenziali sò trasmessi.

    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Comparazione di frames video cù Pacman cum'è un esempiu

    Cumpressione audio

    In listessu modu, l'algoritmu di cumpressione di l'audio omette e dati chì ùn ponu micca esse percepiti da l'omu. Opus hè attualmente u codec audio più performante. Hè pensatu per trasmette una onda audio nantu à un protocolu di datagramma urdinatu cum'è RTP (Protokollu di trasportu in tempu reale). U so ritardu hè menu di quellu di mp3 è aac, è a qualità hè più altu. A latenza hè di solitu circa 5 ~ 66,5ms.

    Pion, WebRTC in Golang

    Pionu hè un prughjettu open source chì porta WebRTC à Golang. Invece di u solitu avvolgimentu di biblioteche C++ WebRTC native, Pion hè una implementazione nativa Golang WebRTC cù megliu rendiment, integrazione Go è cuntrollu di versione nantu à i protokolli WebRTC.

    A biblioteca permette ancu u streaming cù una mansa di grandi integrate cù una latenza sottu-seconda. Hà a so propria implementazione di STUN, DTLS, SCTP, etc. è qualchì sperimentazione cù QUIC è WebAssembly. Questa libreria open source stessu hè una risorsa d'apprendimentu veramente bona cù una documentazione eccellente, implementazioni di protokolli di rete è esempi interessanti.

    A cumunità Pion, guidata da un creatore assai appassiunatu, hè abbastanza vivace è hà assai discussioni di qualità nantu à WebRTC. Sè vo site interessatu in sta tecnulugia, unisce http://pion.ly/slack - ampararete assai cose novi.

    Scrive CloudRetro in Golang

    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Implementazione di un travagliadore in Go

    Vai i canali in azione

    Grazie à u bellu disignu di u canali di Go, i prublemi di streaming di eventi è di cuncurrenza sò assai simplificati. Cum'è in u diagramma, diverse GoRoutines anu parechje cumpunenti chì funzionanu in parallelu. Ogni cumpunente gestisce u so propiu statu è cumunicà attraversu canali. L'affirmazione selettiva di Golang forza un avvenimentu atomicu à esse processatu ogni volta in u ghjocu (tick di ghjocu). Questu significa chì ùn hè micca necessariu bluccatu per stu disignu. Per esempiu, quandu un utilizatore salva, un snapshot completo di u statu di u ghjocu hè necessariu. Stu statu deve esse cuntinuu, login finu à chì a salvezza hè cumpleta. Durante ogni tick di ghjocu, u backend pò solu gestisce una operazione di salvezza o input, rendendu u filu di prucessu sicuru.

    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

    Stu mudellu Golang hè grande per u mo casu d'usu CrowdPlay è Multiple Player. Dopu stu mudellu, tutti l'inputs di l'utilizatori in a stessa stanza sò integrati in u canali di input centru. I media di u ghjocu sò allora implementati à tutti l'utilizatori in a stessa stanza. In questu modu, ghjunghjemu a divisione di u statu di ghjocu trà parechje sessioni di ghjocu di diversi utilizatori.

    Lusinghi in nuvola open source nantu à WebRTC: p2p, multiplayer, zero latenza
    Sincronizazione trà e diverse sessioni

    Disvantages di Golang

    Golang ùn hè micca perfettu. U canali hè lentu. Paragunatu à u bluccatu, u canali Go hè simplicemente un modu più faciule per trattà l'avvenimenti cuncurrenti è filati, ma u canali ùn furnisce micca u megliu rendimentu. Sottu à u canali ci hè una logica cumplessa di bloccu. Allora aghju fattu alcuni aghjustamenti à l'implementazione, riapplicà i chjusi è i valori atomichi quandu rimpiazzà i canali per ottimisà u rendiment.

    Inoltre, u cullettivu di basura in Golang ùn hè micca gestitu, chì qualchì volta provoca pause suspiciously long. Questu interferisce assai cù l'applicazione streaming in tempu reale.

    COG

    U prughjettu usa a libreria Golang open source VP8 / H264 esistente per a compressione di media è Libretro per emulatori di ghjocu. Tutte queste biblioteche sò solu wrappers per a biblioteca C in Go using COG. Alcune di i svantaghji sò listati in questu post da Dave Cheney. I prublemi chì aghju affruntatu:

    • incapacità di catturà un crash in CGO, ancu cù Golang RecoveryCrash;
    • l'incapacità di identificà un collu di u rendiment quandu ùn pudemu micca detectà prublemi granulari in CGO.

    cunchiusioni

    Aghju rializatu u mo scopu di scopre i servizii di ghjocu in nuvola è di creà una piattaforma chì m'aiuti à ghjucà à i nostalgici retro games cù i mo amichi in linea. Stu prughjettu ùn saria micca pussibule senza a biblioteca Pion è u sustegnu di a cumunità Pion. Sò assai grati per u so sviluppu intensivu. L'API simplici furnite da WebRTC è Pion assicuravanu una integrazione perfetta. A mo prima prova di cuncettu hè stata liberata a listessa settimana, ancu s'ellu ùn era micca cuscente di cumunicazioni peer-to-peer (P2P) prima.

    Malgradu a facilità di integrazione, u streaming P2P hè veramente un spaziu assai cumplessu in l'informatica. Hè da trattà cù a cumplessità di l'architetture di rete multi-annuali cum'è IP è NAT per creà una sessione peer-to-peer. Mentre travagliendu in stu prughjettu, aghju accumulatu assai cunniscenze preziose nantu à a rete è l'ottimisazione di u rendiment, cusì ricumandemu chì tutti pruvate à custruisce prudutti P2P cù WebRTC.

    CloudRetro risponde à tutti i casi d'usu chì mi aspettava da a mo perspettiva cum'è un retro gamer. In ogni casu, pensu chì ci sò parechje spazii in u prugettu chì possu migliurà, cum'è rende a rete più affidabile è performante, furnisce gràfiche di ghjocu di qualità più alta, o a capacità di sparte ghjochi trà l'utilizatori. Aghju travagliatu duru nantu à questu. Per piacè seguite prughjettu è sustenelu se ti piace.

Source: www.habr.com

Add a comment