Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi

Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
Lojisyèl kòm yon sèvis, enfrastrikti kòm yon sèvis, platfòm kòm yon sèvis, platfòm kominikasyon kòm yon sèvis, konferans videyo kòm yon sèvis, e ki sou jwèt nwaj kòm yon sèvis? Te deja gen plizyè tantativ pou kreye jwèt nwaj (Cloud Gaming), tankou Stadia, ki fèk te lanse pa Google. Stad pa nouvo nan WebRTC, men èske lòt moun ka itilize WebRTC menm jan an?

Thanh Nguyen deside teste opòtinite sa a sou pwojè sous louvri li CloudRetro. CloudRetro baze sou Pion, popilè Bibliyotèk WebRTC ki baze sou Go (mèsi Montre ekip devlopman Pion pou èd yo nan prepare atik sa a). Nan atik sa a, Thanh bay yon apèsi sou achitekti pwojè li a, epi tou li pale sou sa ki itil li te aprann ak ki defi li te rankontre pandan travay li.

Antre

Ane pase a, lè Google te anonse Stadia, li te soufle tèt mwen. Lide a tèlman inik ak inovatè ke mwen toujou ap mande ki jan sa a te menm posib ak teknoloji ki egziste deja. Dezi a pi byen konprann sijè sa a te pouse m 'kreye pwòp vèsyon mwen an nan yon jwèt nwaj sous louvri. Rezilta a te tou senpleman kokenn. Anba a mwen ta renmen pataje pwosesis la nan travay sou ane mwen an pwojè.

TLDR: vèsyon glise kout ak en

Poukisa jwèt nwaj se tan kap vini an

Mwen kwè ke Cloud Gaming pral byento vin jenerasyon kap vini an nan non sèlman Gaming, men tou, lòt domèn nan syans enfòmatik. Cloud gaming se pwent pwent modèl kliyan/sèvè a. Modèl sa a maksimize jesyon backend ak minimize travay entèfas pa òganize lojik jwèt sou yon sèvè aleka ak difizyon imaj / odyo bay kliyan an. Sèvè a fè pwosesis la lou pou kliyan an pa gen pitye ankò nan limit pyès ki nan konpitè.

Google Stadia esansyèlman pèmèt ou jwe AAA jwèt (sa vle di gwo sukse jwèt) sou yon koòdone tankou YouTube. Menm metodoloji a ka aplike nan lòt aplikasyon lou offline tankou sistèm opere oswa konsepsyon grafik 2D/3D, elatriye. pou nou ka kouri yo toujou sou aparèy ki ba-espèk sou plizyè tribin.

Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
Avni teknoloji sa a: Imajine si Microsoft Windows 10 te kouri sou navigatè Chrome a?

Cloud gaming se teknikman difisil

Gaming se youn nan zòn sa yo ki ra kote repons itilizatè konstan, rapid obligatwa. Si detanzantan nou rankontre yon reta 2 segonn lè nou klike sou yon paj, sa akseptab. Kouran videyo ap viv yo gen tandans retade kèk segonn, men yo toujou ofri yon itilizasyon rezonab. Sepandan, si jwèt la souvan lag pa 500ms, li la tou senpleman unplayable. Objektif nou se reyalize latansi ekstrèmman ba pou diferans ki genyen ant opinyon ak medya yo pi piti ke posib. Se poutèt sa, apwòch tradisyonèl nan difizyon videyo pa aplikab isit la.

Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
Jeneral Cloud jwèt Modèl

Pwojè sous louvri CloudRetro

Mwen deside kreye yon echantiyon tès nan yon jwèt nwaj pou wè si tout bagay sa yo te posib ak restriksyon rezo sere sa yo. Mwen te chwazi Golang pou prèv konsèp la paske se lang mwen te pi abitye ak li e li te byen adapte pou aplikasyon sa a pou anpil lòt rezon, jan mwen te dekouvri pita. Go se senp epi li devlope trè vit; Chanèl nan Go yo bon pou jere multithreading.

Pwojè CloudRetro.io se yon sèvis jwèt nwaj sous louvri pou jwèt retro. Objektif pwojè a se pote eksperyans nan jwèt ki pi konfòtab nan jwèt retro tradisyonèl yo epi ajoute multijoueurs.
Ou ka aprann plis sou pwojè a isit la: https://github.com/giongto35/cloud-game.

CloudRetro fonksyonalite

CloudRetro itilize jwèt retro pou montre pouvwa jwèt nwaj la. Ki pèmèt ou jwenn anpil eksperyans jwèt inik.

  • Pòtabilite nan jwèt la
    • Lektur enstantane lè w ap louvri paj la; pa gen okenn download oswa enstalasyon nesesè
    • Travay nan yon navigatè mobil, kidonk pa gen okenn lojisyèl ki nesesè pou kouri li

  • Sesyon jwèt yo ka pataje atravè plizyè aparèy epi estoke nan nwaj la pou pwochen fwa ou konekte
  • Jwèt la ka difize, oswa li ka jwe pa plizyè itilizatè nan yon fwa:
    • Crowdplay tankou TwitchPlayPokemon, sèlman plis kwa-platfòm ak plis an tan reyèl
    • Offline jwèt sou entènèt. Anpil itilizatè yo ka jwe san yo pa mete yon rezo. Kounye a, 2 jwè kapab jwe Samurai Shodown sou rezo CloudRetro

    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Vèsyon Demo nan jwèt multijoueurs sou entènèt sou diferan aparèy

    Enfrastrikti

    Kondisyon ak teknoloji pile

    Anba a se yon lis kondisyon ke mwen mete anvan yo kòmanse pwojè a.

    1. Yon jwè
    Egzijans sa a ka pa sanble twò enpòtan oswa evidan isit la, men li se youn nan takeaways kle mwen an, li pèmèt jwèt nwaj yo rete lwen sèvis difizyon tradisyonèl ke posib. Si nou konsantre sou yon jwèt yon sèl-jwè, nou ka debarase m de yon sèvè santralize oswa CDN paske nou pa bezwen kouran nan mas yo. Olye pou yo telechaje kouran nan yon sèvè koule oswa pase pake nan yon sèvè WebSocket santralize, kouran sèvis yo delivre dirèkteman bay itilizatè a atravè yon koneksyon WebRTC kanmarad-a-kanmarad.

    2. ba latansi medya kouran
    Lekti sou Stadia, mwen souvan wè WebRTC mansyone nan kèk atik. Mwen reyalize ke WebRTC se yon teknoloji eksepsyonèl e li pafè pou itilize nan jwèt nwaj. WebRTC se yon pwojè ki bay navigatè entènèt ak aplikasyon mobil kominikasyon an tan reyèl atravè yon senp API. Li bay koneksyon kanmarad-a-kanmarad, se optimize pou medya, epi li gen kodèk estanda entegre tankou VP8 ak H264.

    Mwen priyorite asire pi bon eksperyans itilizatè posib sou kenbe grafik kalite siperyè. Gen kèk pèt ki akseptab nan algorithm la. Google Stadia gen yon etap adisyonèl nan diminye gwosè imaj la sou sèvè a, ak ankadreman yo ogmante nan yon pi bon kalite anvan yo transmèt bay kanmarad yo.

    3. Distribiye enfrastrikti ak routage jeyografik
    Kèlkeswa jan algorithm ak kòd konpresyon yo optimize, rezo a se toujou faktè k ap deside ki pi kontribye nan latansi. Achitekti a dwe gen yon mekanis pou pè sèvè ki pi pre itilizatè a pou diminye tan pou ale/retou (RTT). Achitekti a dwe gen 1 koòdonatè ak plizyè sèvè difizyon distribye atravè mond lan: US West, US East, Ewòp, Singapore, Lachin. Tout sèvè difizyon yo dwe konplètman izole. Sistèm nan ka ajiste distribisyon li lè yon sèvè rantre nan oswa kite rezo a. Kidonk, ak gwo trafik, ajoute serveurs adisyonèl pèmèt pou dekale orizontal.

    4. navigatè konpatibilite
    Cloud gaming se nan pi bon li yo lè li mande pou pi piti nan men itilizatè yo. Sa vle di ke li posib pou kouri nan yon navigatè. Navigatè yo ede fè eksperyans nan jwèt konfòtab ke posib pou itilizatè yo, sove yo soti nan enstale lojisyèl ak pyès ki nan konpitè. Navigatè yo ede tou bay fonksyon kwa-platfòm ant vèsyon mobil ak Desktop. Erezman, WebRTC byen sipòte atravè yon varyete navigatè.

    5. Klè separasyon nan koòdone nan jwèt ak sèvis
    Mwen wè sèvis jwèt nwaj la kòm yon platfòm. Tout moun ta dwe kapab konekte anyen ak platfòm la. Koulye a, mwen te entegre LibRetro ak sèvis jwèt nwaj paske LibRetro ofri yon bèl koòdone emulation jwèt pou jwèt retro tankou SNES, GBA, PS.

    6. Chanm pou multijoueurs, jwe foul moun ak ekstèn ki lye (deep-link) ak jwèt la
    CloudRetro sipòte anpil nouvo jeu tankou CrowdPlay ak Online MultiPlayer pou jwèt retro. Si plizyè itilizatè yo louvri menm lyen pwofon sou òdinatè diferan, yo pral wè menm jwèt la ap kouri epi yo pral menm kapab rantre nan li.

    Anplis, eta jwèt yo estoke nan depo nwaj. Sa a pèmèt itilizatè yo kontinye jwe nenpòt ki lè sou nenpòt lòt aparèy.

    7. Dekale orizontal
    Menm jan ak nenpòt SAAS jodi a, jwèt nwaj yo dwe fèt pou yo kapab évolutive orizontal. Konsepsyon koòdonatè-travayè pèmèt ou ajoute plis travayè pou sèvi plis trafik.

    8. Pa gen koneksyon ak yon sèl nwaj
    Enfrastrikti CloudRetro a òganize sou diferan founisè nwaj (Oseyan dijital, Alibaba, founisè koutim) pou diferan rejyon yo. Mwen pèmèt kouri nan yon veso Docker pou enfrastrikti a ak konfigirasyon anviwònman rezo lè l sèvi avèk yon script bash pou evite fèmen nan yon founisè nwaj sèl. Lè nou konbine sa a ak NAT Traversal nan WebRTC, nou ka gen fleksibilite pou deplwaye CloudRetro sou nenpòt platfòm nwaj e menm sou machin nenpòt itilizatè.

    Konsepsyon achitekti

    Travayè: (oswa difizyon sèvè mansyone pi wo a) miltipliye jwèt yo, kouri tiyo kodaj la, ak kouran medya yo kode bay itilizatè yo. Enstans travayè yo distribye atravè mond lan, epi chak travayè ka okipe plizyè sesyon itilizatè ansanm.

    Koòdonatè: se responsab pou asosye nouvo itilizatè a ak travayè ki pi apwopriye pou difizyon. Koòdonatè a reyaji avèk travayè yo atravè WebSocket.

    Depo eta jwèt: depo santral aleka pou tout eta jwèt. Depo sa a bay fonksyon enpòtan tankou aleka sove/chaj.

    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Achitekti wo nivo nan CloudRetro

    Custom Script

    Lè yon nouvo itilizatè ouvri CloudRetro nan etap 1 ak 2 yo montre nan figi ki anba a, kowòdonatè a ansanm ak lis travayè ki disponib yo mande nan premye paj la. Apre sa, nan etap 3 kliyan an kalkile reta yo pou tout kandida lè l sèvi avèk yon demann HTTP ping. Lè sa a, lis reta sa yo voye tounen bay kowòdonatè a pou li ka detèmine travayè ki pi apwopriye pou sèvi itilizatè a. Etap 4 anba a kreye jwèt la. Yon koneksyon difizyon WebRTC etabli ant itilizatè a ak travayè ki asiyen an.
    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Itilizatè script apre jwenn aksè

    Ki sa ki anndan travayè a

    Tiyo jwèt ak difizyon yo estoke andedan travayè a nan izolasyon epi fè echanj enfòmasyon la atravè koòdone a. Kounye a, kominikasyon sa a te pote soti nan transfere done nan memwa atravè Chanèl Golang nan menm pwosesis la. Objektif kap vini an se segregasyon, i.e. lansman endepandan nan jwèt la nan yon lòt pwosesis.

    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Entèaksyon konpozan travayè yo

    Eleman prensipal yo:

    • WebRTC: yon eleman kliyan ki aksepte opinyon itilizatè ak pwodiksyon medya kode soti nan sèvè a.
    • Emulation jwèt: eleman jwèt. Mèsi a bibliyotèk Libretro a, sistèm nan kapab kouri jwèt la andedan menm pwosesis la ak entèsepte medya ak kouran D '.
    • Ankadreman nan-jwèt yo kaptire epi voye nan ankode a.
    • Ankode imaj/odyo: yon tiyo kodaj ki pran ankadreman medya, kode yo nan background nan, ak rezilta imaj / odyo kode.

    Aplikasyon

    CloudRetro konte sou WebRTC kòm teknoloji kolòn vètebral li yo, se konsa anvan plonje nan detay yo nan aplikasyon an Golang, mwen deside pale sou WebRTC tèt li. Sa a se teknoloji etonan ki te ede m anpil nan reyalize latansi anba-dezyèm pou done difizyon.

    WebRTC

    WebRTC fèt pou bay bon jan kalite koneksyon kanmarad sou aplikasyon mobil natif natal ak navigatè lè l sèvi avèk API senp.

    NAT Traversal

    WebRTC se li te ye pou fonksyonalite NAT Traversal li yo. WebRTC fèt pou kominikasyon kanmarad-a-kanmarad. Objektif li se jwenn wout dirèk ki pi apwopriye, evite pòtay NAT ak firewall pou kominikasyon kanmarad-a-kanmarad atravè yon pwosesis ki rele ICE. Kòm yon pati nan pwosesis sa a, API WebRTC yo jwenn adrès IP piblik ou a lè l sèvi avèk sèvè STUN epi voye li bay sèvè relè a (VIRE) lè yo pa kapab etabli yon koneksyon dirèk.

    Sepandan, CloudRetro pa konplètman eksplwate karakteristik sa a. Koneksyon kanmarad-a-kanmarad li yo pa egziste ant itilizatè yo, men ant itilizatè yo ak sèvè nwaj yo. Bò sèvè modèl la gen mwens restriksyon kominikasyon dirèk pase yon aparèy itilizatè tipik. Sa a pèmèt ou pre-louvri pò fèk ap rantre oswa itilize adrès IP piblik dirèkteman, paske sèvè a pa dèyè NAT.

    Anvan sa, mwen te vle fè pwojè a nan yon platfòm distribisyon jwèt pou Cloud Gaming. Lide a se te pèmèt kreyatè jwèt yo bay jwèt ak resous difizyon. Ak itilizatè yo ta kominike avèk founisè yo dirèkteman. Nan fason sa a desantralize, CloudRetro se jis yon fondasyon pou konekte resous difizyon twazyèm pati ak itilizatè yo, fè li pi évolutive lè li pa anime ankò. Wòl WebRTC NAT Traversal isit la trè enpòtan pou fasilite inisyalizasyon koneksyon kanmarad-a-kanmarad sou resous difizyon twazyèm pati, sa ki fè li pi fasil pou kreyatè a konekte ak rezo a.

    Konpresyon videyo

    Konpresyon videyo se yon pati endispansab nan tiyo a epi li kontribye anpil nan yon koule lis. Pandan ke li pa nesesè pou konnen tout detay nan kodaj videyo VP8/H264, konprann konsèp yo ka ede w konprann opsyon vitès videyo difizyon, debogaj konpòtman inatandi, ak ajiste latansi.

    Konpresyon videyo pou yon sèvis difizyon se yon defi paske algorithm la dwe asire ke tan total kodaj + tan transmisyon rezo + tan dekodaj pi ba ke posib. Anplis de sa, pwosesis kodaj la dwe konsistan ak kontinyèl. Gen kèk konpwomi kodaj ki pa aplike-pa egzanp, nou pa ka favorize tan kodaj ki pi long sou pi piti gwosè dosye ak tan dekodaj, oswa itilize konpresyon enkonsistan.

    Lide a dèyè konpresyon videyo se elimine ti moso enfòmasyon ki pa nesesè pandan y ap kenbe yon nivo akseptab nan presizyon pou itilizatè yo. Anplis de sa nan kode ankadreman endividyèl imaj estatik, algorithm la dedwi ankadreman aktyèl la soti nan anvan yo ak pwochen yo, kidonk se sèlman diferans yo voye. Kòm yo ka wè nan egzanp lan ak Pacman, se sèlman pwen diferans yo transmèt.

    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Konparezon ankadreman videyo lè l sèvi avèk Pacman kòm yon egzanp

    Konpresyon odyo

    Menm jan an tou, algorithm konpresyon odyo a omite done moun pa ka konnen. Opus se kounye a kodèk odyo ki pi bon. Li fèt pou transmèt yon vag odyo sou yon pwotokòl datagram kòmande tankou RTP (Protokòl Transpò an tan reyèl). Latansi li pi ba pase mp3 ak aac, ak bon jan kalite a pi wo. Latansi a anjeneral alantou 5 ~ 66,5ms.

    Pion, WebRTC nan Golang

    Pyon se yon pwojè sous louvri ki pote WebRTC nan Golang. Olye de vlope nòmal nan bibliyotèk natif natal C++ WebRTC, Pion se yon aplikasyon natif natal Golang nan WebRTC ak pi bon pèfòmans, entegrasyon Go, ak kontwòl vèsyon sou pwotokòl WebRTC.

    Bibliyotèk la pèmèt tou difizyon ak anpil gwo entegre ak latansi anba-dezyèm. Li gen pwòp aplikasyon STUN, DTLS, SCTP, elatriye. ak kèk eksperyans ak QUIC ak WebAssembly. Bibliyotèk sous louvri sa a li menm se yon bon resous aprantisaj ak dokimantasyon ekselan, aplikasyon pwotokòl rezo a, ak egzanp fre.

    Kominote Pyon an, ki te dirije pa yon kreyatè trè pasyone, se byen vivan, ak yon anpil nan bon jan kalite diskisyon k ap pase sou WebRTC. Si w enterese nan teknoloji sa a, rantre nan http://pion.ly/slack - ou pral aprann anpil bagay nouvo.

    Ekri CloudRetro nan Golang

    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Aplikasyon yon travayè nan Go

    Ale Chanèl nan Aksyon

    Mèsi a bèl konsepsyon chanèl Go a, pwoblèm yo nan difizyon evènman ak konkou yo anpil senplifye. Menm jan nan dyagram nan, diferan GoRoutine gen plizyè konpozan kap kouri an paralèl. Chak eleman jere eta li yo ak kominike atravè chanèl. Afimasyon selektif Golang a fòse yon evènman atomik yo dwe trete chak fwa nan jwèt la (jwèt tik). Sa vle di ke pa gen okenn bloke ki nesesè pou konsepsyon sa a. Pou egzanp, lè yon itilizatè sove, yo mande yon snapshot konplè sou eta jwèt la. Eta sa a ta dwe rete kontinyèl, konekte jiskaske sove a fini. Pandan chak tik jwèt, backend la ka sèlman okipe yon operasyon sove oswa antre, fè fil pwosesis la san danje.

    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-an/Fan-soti

    Modèl Golang sa a adapte ak ka itilize CrowdPlay ak plizyè jwè mwen an pafètman. Apre modèl sa a, tout antre itilizatè yo nan yon chanm yo bati nan kanal antre santral la. Lè sa a, medya jwèt yo deplwaye bay tout itilizatè yo nan menm chanm lan. Nan fason sa a, nou reyalize divizyon eta jwèt la ant plizyè sesyon jwèt nan itilizatè diferan.

    Jwèt nwaj sous louvri sou WebRTC: p2p, multijoueurs, zewo latansi
    Senkronizasyon ant diferan sesyon yo

    Dezavantaj nan Golang

    Golang pa pafè. Channel la dousman. Konpare ak bloke, Go channel se tou senpleman yon fason pi fasil pou jere evènman konkouran ak threaded, men chanèl pa bay pi bon pèfòmans. Gen lojik bloke konplèks anba kanal la. Se konsa, mwen te fè kèk ajisteman nan aplikasyon an, reaplike kadna ak valè atomik lè ranplase chanèl yo optimize pèfòmans.

    Anplis de sa, pèseptè fatra a nan Golang pa jere, ki pafwa lakòz poz sispèk long. Sa a anpil entèfere ak aplikasyon an difizyon an tan reyèl.

    COG

    Pwojè a sèvi ak bibliyotèk ki egziste deja Golang VP8/H264 pou konpresyon medya ak Libretro pou emulateur jwèt. Tout bibliyotèk sa yo se tou senpleman vlope nan bibliyotèk C nan ale itilize COG. Gen kèk nan dezavantaj yo ki nan lis nan pòs sa a pa Dave Cheney. Pwoblèm mwen te rankontre:

    • enkapasite pou trape yon aksidan nan CGO, menm avèk Golang RecoveryCrash;
    • echèk pou idantifye blokaj pèfòmans lè nou pa kapab detekte pwoblèm detaye nan CGO.

    Konklizyon

    Mwen reyalize objektif mwen pou m konprann sèvis jwèt nwaj yo ak kreye yon platfòm ki ede m jwe jwèt retro nostaljik ak zanmi m yo sou entènèt. Pwojè sa a pa t ap posib san bibliyotèk Pyon an ak sipò kominote Pyon an. Mwen trè rekonesan pou devlopman entansif li. API senp yo bay WebRTC ak Pion asire entegrasyon san pwoblèm. Premye prèv konsèp mwen te pibliye menm semèn sa a, menmsi mwen pa t gen konesans anvan sou kominikasyon kanmarad-a-kanmarad (P2P).

    Malgre fasilite nan entegrasyon, difizyon P2P se vre yon zòn trè konplèks nan syans enfòmatik. Li gen fè fas ak konpleksite a nan achitekti rezo ki dire lontan tankou IP ak NAT yo kreye yon sesyon kanmarad-a-kanmarad. Pandan m ap travay sou pwojè sa a, mwen te jwenn anpil konesans enpòtan sou rezo ak optimize pèfòmans, kidonk mwen ankouraje tout moun pou yo eseye bati pwodwi P2P lè l sèvi avèk WebRTC.

    CloudRetro akeyi tout ka itilizasyon mwen te espere nan pèspektiv mwen kòm yon jwè retro. Sepandan, mwen panse ke gen anpil domèn nan pwojè a ke mwen ka amelyore, tankou fè rezo a pi serye ak pèfòmans, bay pi bon kalite grafik jwèt, oswa kapasite nan pataje jwèt ant itilizatè yo. M ap travay di sou sa. Tanpri swiv pwojè epi sipòte li si ou renmen li.

Sous: www.habr.com

Add nouvo kòmantè