ProHoster > Blog > Administrasi > Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
Parangkat lunak salaku jasa, infrastruktur salaku jasa, platform salaku jasa, platform komunikasi salaku jasa, konferensi video salaku jasa, kumaha upami kaulinan awan salaku jasa? Geus aya sababaraha usaha pikeun nyieun kaulinan awan (Cloud Gaming), sapertos Stadia, nembe diluncurkeun ku Google. Stadia teu anyar pikeun WebRTC, tapi batur tiasa nganggo WebRTC dina cara anu sami?
Thanh Nguyen mutuskeun pikeun nguji kasempetan ieu dina proyék open source na CloudRetro. CloudRetro dumasar kana Pion, populér Perpustakaan WebRTC dumasar kana Go (hatur nuhun Ditémbongkeun ti tim pamekar Pion pikeun bantosanana dina nyiapkeun tulisan ieu). Dina artikel ieu, Thanh nyadiakeun tinjauan arsitéktur proyék na, sarta ogé ngobrol ngeunaan naon mangpaat anjeunna diajar sarta naon tantangan anjeunna encountered salila karyana.
asup
Taun ka tukang, nalika Google ngumumkeun Stadia, éta matak pikasieuneun. Idena unik sareng inovatif anu kuring terus-terusan heran kumaha ieu tiasa dilakukeun ku téknologi anu tos aya. Kahayang pikeun langkung ngartos topik ieu nyababkeun kuring nyiptakeun versi kuring sorangan tina kaulinan awan open-source. hasilna éta saukur hebat. Di handap ieu abdi hoyong bagikeun prosés gawé dina taun abdi proyék.
TLDR: Vérsi slide pondok kalawan highlights
Naha kaulinan awan nyaéta masa depan
Kuring yakin yén Cloud Gaming baris geura-giru jadi generasi saterusna teu ukur kaulinan, tapi ogé wewengkon séjén tina elmu komputer. Kaulinan awan mangrupikeun puncak modél klien / server. Modél ieu maximizes manajemén backend sarta ngaleutikan karya frontend ku hosting logika kaulinan dina server jauh jeung ngalirkeun data gambar / audio ka klien nu. Server ngalakukeun pamrosésan anu beurat ku kituna klien henteu aya deui dina watesan watesan hardware.
Google Stadia dasarna ngamungkinkeun anjeun maén kaulinan AAA (nyaéta kaulinan blockbuster high-end) dina antarmuka sapertos YouTube. Métodologi anu sami tiasa diterapkeun kana aplikasi offline anu beurat sapertos sistem operasi atanapi desain grafis 2D / 3D, jsb. ku kituna urang bisa ngajalankeun eta konsistén dina alat-spésifik low sakuliah sababaraha platform.
Masa depan téknologi ieu: Bayangkeun upami Microsoft Windows 10 dijalankeun dina browser Chrome?
Cloud kaulinan téhnisna nangtang
Kaulinan mangrupikeun salah sahiji daérah anu jarang dimana réspon pangguna anu konstan sareng gancang diperyogikeun. Lamun aya kalana urang sapatemon reureuh 2 detik nalika ngaklik dina kaca, ieu bisa ditarima. Live stream video condong lag sababaraha detik, tapi masih nawarkeun usability lumrah. Sanajan kitu, lamun kaulinan remen lags ku 500ms, éta saukur unplayable. Tujuan kami nyaéta pikeun ngahontal latensi anu handap pisan supados gap antara input sareng média sakedik-gancang. Ku alatan éta, pendekatan tradisional pikeun streaming video henteu lumaku di dieu.
Umum Awan Game Citakan
Open source proyék CloudRetro
Kuring mutuskeun hiji nyieun sampel test tina kaulinan awan pikeun nempo lamun kabeh ieu mungkin kalawan larangan jaringan ketat sapertos. Kuring milih Golang pikeun bukti konsép sabab éta basa kuring paling akrab jeung éta ogé cocog pikeun palaksanaan ieu loba alesan séjén, sakumaha kuring engké kapanggih. Go téh basajan tur ngamekarkeun pisan gancang; Saluran di Go saé pikeun ngatur multithreading.
proyek CloudRetro.io mangrupikeun jasa kaulinan awan open source pikeun kaulinan retro. Tujuan tina proyék nyaéta pikeun nyangking pangalaman kaulinan anu paling nyaman pikeun kaulinan retro tradisional sareng nambihan multiplayer.
Anjeun tiasa diajar langkung seueur ngeunaan proyék di dieu: https://github.com/giongto35/cloud-game.
fungsionalitas CloudRetro
CloudRetro nganggo kaulinan retro pikeun nunjukkeun kakuatan kaulinan awan. Anu ngamungkinkeun anjeun kéngingkeun seueur pangalaman kaulinan anu unik.
Portability tina kaulinan
Puteran instan nalika muka halaman; euweuh download atawa instalasi diperlukeun
Gawéna dina browser mobile, jadi euweuh software diperlukeun pikeun ngajalankeun eta
Sesi kaulinan tiasa dibagikeun dina sababaraha alat sareng disimpen dina méga kanggo waktos salajengna anjeun asup
Kaulinan tiasa dialirkeun, atanapi tiasa dicoo ku sababaraha pangguna sakaligus:
Crowdplay kawas TwitchPlayPokemon, ngan leuwih cross-platform jeung leuwih real-time
Kaulinan offline online. Seueur pangguna tiasa maén tanpa nyetél jaringan. Samurai Shodown ayeuna tiasa dicoo ku 2 pamaén dina jaringan CloudRetro
Vérsi demo kaulinan multiplayer online dina alat béda
infrastruktur
Sarat jeung téhnologi tumpukan
Di handap ieu daptar sarat anu kuring setel sateuacan ngamimitian proyek.
1. Hiji pamaén
sarat ieu bisa jadi teu sigana teuing penting atawa atra di dieu, tapi mangrupa salah sahiji takeaways konci kuring, hal ieu ngamungkinkeun kaulinan awan tetep jauh ti layanan streaming tradisional sabisa. Lamun urang difokuskeun kaulinan single-pamuter, urang bisa meunang leupas tina server terpusat atawa CDN sabab urang teu kudu ngalirkeun data ka massa. Gantina unggah aliran ka server tilelep atawa ngalirkeun pakét ka server WebSocket terpusat, aliran jasa dikirimkeun langsung ka pamaké ngaliwatan sambungan WebRTC peer-to-peer.
2. aliran média latency low
Maca ngeunaan Stadia, kuring sering ningali WebRTC disebatkeun dina sababaraha tulisan. Kuring sadar yén WebRTC mangrupikeun téknologi anu luar biasa sareng sampurna pikeun dianggo dina kaulinan awan. WebRTC mangrupikeun proyék anu nyayogikeun panyungsi wéb sareng aplikasi sélulér kalayan komunikasi waktos nyata ngalangkungan API anu sederhana. Éta nyayogikeun konektipitas peer-to-peer, dioptimalkeun pikeun média, sareng gaduh codec standar anu diwangun sapertos VP8 sareng H264.
Kuring prioritized mastikeun pangalaman pamaké pangalusna mungkin leuwih ngajaga grafik kualitas luhur. Sababaraha karugian anu ditarima dina algoritma. Google Stadia ngagaduhan léngkah tambahan pikeun ngirangan ukuran gambar dina server, sareng pigura ditingkatkeun kana kualitas anu langkung luhur sateuacan dikirimkeun ka peers.
3. Infrastruktur disebarkeun kalawan routing géografis
Perkara teu sabaraha dioptimalkeun algoritma komprési jeung kode téh, jaringan masih faktor mutuskeun nu nyumbang paling ka latency. Arsitéktur kudu boga mékanisme pikeun nyapasangkeun server pangdeukeutna ka pamaké pikeun ngurangan round-trip time (RTT). Arsitéktur kedah gaduh 1 koordinator sareng sababaraha server streaming anu disebarkeun di sakumna dunya: AS Kulon, AS Wétan, Eropa, Singapura, Cina. Sadaya server streaming kedah diisolasi lengkep. Sistim nu bisa nyaluyukeun distribusi na nalika server ngagabung atawa ninggalkeun jaringan. Ku kituna, kalawan lalulintas badag, nambahkeun server tambahan ngamungkinkeun pikeun skala horizontal.
4. kasaluyuan Browser
Awan kaulinan anu pangalusna lamun merlukeun sahenteuna tina pamaké. Ieu ngandung harti yén kasebut nyaéta dimungkinkeun pikeun ngajalankeun dina browser a. Browser mantuan nyieun pangalaman kaulinan jadi nyaman sabisa pikeun pamaké, ngahemat aranjeunna tina masang software jeung hardware. Browser ogé mantuan nyadiakeun fungsionalitas cross-platform antara versi mobile jeung desktop. Kabeneran, WebRTC dirojong saé dina rupa-rupa panyungsi.
5. Separation jelas tina panganteur kaulinan sarta jasa
Kuring ningali jasa kaulinan awan salaku platform. Sadayana kedah tiasa nyambungkeun naon waé kana platform. Ayeuna kuring geus terpadu LibRetro kalawan layanan kaulinan awan sabab LibRetro nawarkeun panganteur émulator kaulinan geulis keur kaulinan retro kayaning SNES, GBA, PS.
6. Kamar pikeun multiplayer, muter riungan jeung linking éksternal (jero-link) jeung kaulinan
CloudRetro ngadukung seueur midangkeun énggal sapertos CrowdPlay sareng Online MultiPlayer pikeun kaulinan retro. Upami sababaraha pangguna muka tautan jero anu sami dina komputer anu béda, aranjeunna bakal ningali kaulinan anu sami sareng tiasa ngiringan.
Leuwih ti éta, nagara kaulinan disimpen dina gudang awan. Hal ieu ngamungkinkeun pamaké pikeun nuluykeun maén iraha wae dina sagala alat sejenna.
7. Skala horizontal
Sapertos SAAS ayeuna, kaulinan awan kedah dirarancang pikeun skala horisontal. Desain koordinator-worker ngidinan Anjeun pikeun nambahkeun leuwih pagawe pikeun ngalayanan leuwih lalulintas.
8. Taya sambungan kana hiji awan
Infrastruktur CloudRetro di-host dina panyadia awan anu béda (Digital Ocean, Alibaba, panyadia khusus) pikeun daérah anu béda. Kuring ngaktifkeun ngajalankeun dina wadah Docker pikeun infrastruktur sareng ngonpigurasikeun setélan jaringan nganggo skrip bash pikeun nyegah dikonci kana panyadia awan tunggal. Ku ngagabungkeun ieu sareng NAT Traversal di WebRTC, urang tiasa gaduh kalenturan pikeun nyebarkeun CloudRetro dina platform awan naon waé bahkan dina mesin naon waé pangguna.
Desain arsitéktur
Pagawe: (atanapi server streaming anu disebatkeun di luhur) ngalikeun kaulinan, ngajalankeun pipa encoding, sareng ngalirkeun média anu disandikeun ka pangguna. Instansi pagawe disebarkeun ka sakuliah dunya, sareng unggal padamel tiasa ngadamel sababaraha sesi pangguna sakaligus.
Koordinator: tanggung jawab pikeun nyapasangkeun pangguna anyar sareng pagawe anu paling cocog pikeun streaming. Koordinator berinteraksi sareng pagawé via WebSocket.
Panyimpen kaayaan kaulinan: gudang jauh sentral pikeun sakabéh nagara bagian kaulinan. Panyimpenan ieu nyayogikeun fungsi penting sapertos nyimpen/beban jauh.
Arsitéktur tingkat luhur CloudRetro
Skrip custom
Nalika pangguna anyar muka CloudRetro dina léngkah 1 sareng 2 anu dipidangkeun dina gambar di handap ieu, koordinator sareng daptar karyawan anu sayogi dipénta ka halaman munggaran. Saatos ieu, dina lengkah 3 klien ngitung telat pikeun sadaya calon nganggo pamundut ping HTTP. Daptar telat ieu teras dikirim deui ka koordinator supados anjeunna tiasa nangtoskeun padamelan anu paling cocog pikeun ngalayanan pangguna. Lengkah 4 handap nyieun kaulinan. Sambungan streaming WebRTC diadegkeun antara pangguna sareng pagawe anu ditugaskeun.
Aksara pamaké sanggeus gaining aksés
Naon anu aya di jero pagawé
Pipa kaulinan sareng streaming disimpen di jero pagawé diisolasi sareng tukeur inpormasi di dinya ngalangkungan antarmuka. Ayeuna, komunikasi ieu dilumangsungkeun ku mindahkeun data dina mémori via Saluran Golang dina prosés anu sarua. Tujuan salajengna nyaeta segregation, i.e. bebas peluncuran kaulinan dina prosés séjén.
Interaksi komponén worker
Komponén utama:
WebRTC: komponén klien nu narima input pamaké sarta outputs média disandikeun ti server.
émulator kaulinan: komponén kaulinan. Hatur nuhun kana perpustakaan Libretro, sistem tiasa ngajalankeun kaulinan dina prosés anu sami sareng intercept média internal sareng aliran input.
Pigura dina kaulinan direbut sarta dikirim ka encoder nu.
Encoder Gambar/Audio: hiji pipa encoding nu nyandak pigura média, encodes aranjeunna dina latar tukang, sarta outputs disandikeun gambar / audio.
Реализация
CloudRetro ngandelkeun WebRTC salaku téknologi tulang tonggongna, janten sateuacan nyilem kana detil palaksanaan Golang, kuring mutuskeun pikeun ngobrol ngeunaan WebRTC sorangan. Ieu mangrupikeun téknologi anu luar biasa anu parantos ngabantosan kuring pikeun ngahontal latency sub-detik pikeun ngalirkeun data.
WebRTC
WebRTC dirancang pikeun nyadiakeun sambungan peer-to-peer kualitas luhur dina aplikasi mobile asli jeung browser maké API basajan.
NAT Traversal
WebRTC dipikanyaho pikeun fungsionalitas NAT Traversal na. WebRTC dirancang pikeun komunikasi peer-to-peer. Tujuanana nyaéta pikeun milarian rute langsung anu paling cocog, ngahindarkeun gerbang NAT sareng firewall pikeun komunikasi peer-to-peer ngaliwatan prosés anu disebut. ICE. Salaku bagian tina prosés ieu, API WebRTC mendakan alamat IP umum anjeun nganggo server STUN teras teraskeun ka server relay (Bélok) lamun sambungan langsung teu bisa dijieun.
Sanajan kitu, CloudRetro teu pinuh ngamangpaatkeun fitur ieu. Sambungan peer-to-peer na henteu aya antara pangguna, tapi antara pangguna sareng pangladén awan. Sisi server model boga pangsaeutikna larangan komunikasi langsung ti alat pamaké has. Ieu ngamungkinkeun anjeun pikeun muka palabuhan asup atanapi nganggo alamat IP umum sacara langsung, sabab serverna henteu aya di tukangeun NAT.
Saméméhna, kuring hayang ngahurungkeun proyék kana platform distribusi kaulinan pikeun Cloud Gaming. Ide ieu ngamungkinkeun panyipta kaulinan pikeun nyayogikeun kaulinan sareng sumber streaming. Sareng pangguna bakal langsung berinteraksi sareng panyadia. Dina cara desentralisasi ieu, CloudRetro ngan ukur kerangka pikeun nyambungkeun sumber streaming pihak katilu ka pangguna, ngajantenkeun langkung skalabel nalika henteu di-host deui. Peran WebRTC NAT Traversal di dieu penting pisan pikeun ngagampangkeun inisialisasi sambungan peer-to-peer dina sumber streaming pihak katilu, sahingga ngagampangkeun panyipta pikeun nyambung ka jaringan.
Komprési video
Komprési pidéo mangrupikeun bagian anu penting dina pipa sareng nyumbang pisan kana aliran anu lancar. Sanaos henteu kedah terang unggal detil panyandian pidéo VP8/H264, ngartos konsép tiasa ngabantosan anjeun ngartos pilihan laju video streaming, debug kabiasaan anu teu kaduga, sareng nyaluyukeun latency.
Ngompresi pidéo pikeun layanan streaming hésé pisan sabab algoritma kedah mastikeun yén total waktos panyandian + waktos pangiriman jaringan + waktos decoding sakedik-gancang. Salaku tambahan, prosés coding kedah konsisten sareng kontinyu. Sababaraha tradeoffs encoding teu lumaku-contona, urang teu bisa milih waktos encoding lila leuwih ukuran file leutik tur waktu decoding, atawa make komprési inconsistent.
Gagasan di balik komprési pidéo nyaéta ngaleungitkeun bit inpormasi anu teu dipikabutuh bari ngajaga tingkat akurasi anu ditampi pikeun pangguna. Salian encoding pigura gambar statik individu, algoritma infers pigura ayeuna ti nu saméméhna jeung saterusna, jadi ngan bédana maranéhanana dikirim. Salaku bisa ditempo ti conto jeung Pacman, ngan titik diferensial dikirimkeun.
Babandingan pigura video ngagunakeun Pacman sabagé conto
Komprési audio
Kitu ogé, algoritma komprési audio ngaleungitkeun data anu teu tiasa katarima ku manusa. Opus ayeuna mangrupikeun codec audio anu paling saé. Hal ieu dirarancang pikeun ngirimkeun gelombang audio ngaliwatan hiji protokol datagram maréntahkeun kayaning RTP (Real Time Transport Protocol). Latensina langkung handap tina mp3 sareng aac, sareng kualitasna langkung luhur. Laténna biasana sakitar 5~66,5ms.
Pion, WebRTC di Golang
Pawn mangrupa proyék open source nu brings WebRTC ka Golang. Gantina bungkus biasa tina perpustakaan WebRTC C ++ asli, Pion mangrupikeun palaksanaan Golang asli tina WebRTC kalayan kinerja anu langkung saé, integrasi Go, sareng kontrol versi dina protokol WebRTC.
Perpustakaan ogé ngamungkinkeun streaming sareng seueur built-in anu saé sareng latency sub-detik. Éta gaduh palaksanaan STUN, DTLS, SCTP, jsb. jeung sababaraha percobaan kalawan QUIC na WebAssembly. Perpustakaan open source ieu mangrupikeun sumber diajar anu saé kalayan dokuméntasi anu saé, palaksanaan protokol jaringan, sareng conto anu saé.
Komunitas Pion, dipingpin ku panyipta anu gairah, cukup meriah, kalayan seueur diskusi kualitas anu lumangsung ngeunaan WebRTC. Upami anjeun kabetot dina téknologi ieu, gabung http://pion.ly/slack – anjeun bakal diajar loba hal anyar.
Nulis CloudRetro di Golang
Palaksanaan pagawe di Go
Buka Saluran dina Aksi
Hatur nuhun kana desain saluran Go anu saé, masalah streaming acara sareng konkurensi saderhana pisan. Sapertos dina diagram, GoRoutine béda gaduh sababaraha komponén anu dijalankeun paralel. Unggal komponén ngatur kaayaan sarta komunikasi ngaliwatan saluran. Pernyataan selektif Golang maksakeun hiji kajadian atom pikeun diolah unggal waktos di buruan (game tick). Ieu ngandung harti yén euweuh konci diperlukeun pikeun desain ieu. Contona, nalika pamaké ngahemat, diperlukeun snapshot pinuh ku kaayaan kaulinan. Kaayaan ieu kedah tetep kontinyu, log in dugi ka ngahemat parantos réngsé. Salila unggal keletik kaulinan, backend ngan bisa nanganan a nyimpen atawa operasi input, sahingga thread prosés aman.
func (e *gameEmulator) gameUpdate() {
for {
select {
case <-e.saveOperation:
e.saveGameState()
case key := <-e.input:
e.updateGameState(key)
case <-e.done:
e.close()
return
}
}
}
Kipas-in / kipas-kaluar
Témplat Golang ieu cocog sareng kasus panggunaan CrowdPlay sareng Multiple Player kuring. Saatos pola ieu, sadaya input pangguna dina hiji rohangan diwangun kana saluran lawang sentral. Média kaulinan teras disebarkeun ka sadaya pangguna dina rohangan anu sami. Ku cara kieu, urang ngahontal division tina kaayaan kaulinan antara sababaraha sesi kaulinan pamaké béda.
Sinkronisasi antara sési anu béda
Kakurangan Golang
Golang teu sampurna. Saluranna lalaunan. Dibandingkeun sareng meungpeuk, saluran Go mangrupikeun cara anu langkung gampang pikeun nanganan acara anu sakaligus sareng benang, tapi saluran henteu nyayogikeun kinerja anu pangsaéna. Aya logika blocking kompléks di handapeun saluran. Janten kuring ngadamel sababaraha panyesuaian kana palaksanaan, nerapkeun deui konci sareng nilai atom nalika ngagentos saluran pikeun ngaoptimalkeun kinerja.
Sajaba ti éta, tukang sampah di Golang teu diatur, nu kadang ngabalukarkeun curiga lila jeda. Ieu pisan ngaganggu aplikasi streaming waktos nyata.
COG
Proyék ngagunakeun perpustakaan open source Golang VP8 / H264 pikeun komprési média sareng Libretro pikeun émulator kaulinan. Sakabéh perpustakaan ieu ngan saukur wrappers perpustakaan C di Go ngagunakeun COG. Sababaraha kalemahan didaptarkeun dina pos ieu ku Dave Cheney. Masalah anu kuring hadapi:
henteu mampuh nyekel kacilakaan di CGO, sanajan kalawan Golang RecoveryCrash;
gagal pikeun ngaidentipikasi bottlenecks kinerja nalika urang teu bisa ngadeteksi masalah lengkep dina CGO.
kacindekan
Kuring ngahontal tujuan kuring pikeun ngartos jasa kaulinan awan sareng nyiptakeun platform anu ngabantosan kuring maénkeun kaulinan retro nostalgia sareng réréncangan online. Proyék ieu moal mungkin tanpa perpustakaan Pion sareng dukungan komunitas Pion. Abdi nganuhunkeun pisan pikeun pangwangunan anu intensif. API saderhana anu disayogikeun ku WebRTC sareng Pion mastikeun integrasi anu mulus. Bukti konsép munggaran kuring dileupaskeun dina minggu anu sami, sanaos kuring henteu gaduh pangaweruh sateuacanna ngeunaan komunikasi peer-to-peer (P2P).
Sanaos gampangna integrasi, streaming P2P memang mangrupikeun daérah anu kompleks dina élmu komputer. Anjeunna kedah nungkulan pajeulitna arsitéktur jaringan anu lami sapertos IP sareng NAT pikeun nyiptakeun sési peer-to-peer. Nalika ngerjakeun proyék ieu, kuring nampi seueur pangaweruh anu berharga ngeunaan jejaring sareng optimasi kinerja, janten kuring ajak sadayana nyobian ngawangun produk P2P nganggo WebRTC.
CloudRetro nyayogikeun sadaya kasus pamakean anu kuring ngarepkeun tina sudut pandang kuring salaku tukang game retro. Sanajan kitu, Jigana aya loba wewengkon dina proyék nu abdi tiasa ningkatkeun, kayaning nyieun jaringan nu leuwih dipercaya jeung performant, nyadiakeun grafik kaulinan kualitas luhur, atawa kamampuhan pikeun babagi kaulinan antara pamaké. Kuring digawé teuas dina ieu. Mangga tuturkeun proyék sareng ngadukung upami anjeun resep.