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.

Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
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.

Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
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

    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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.

    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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.
    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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.

    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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.

    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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

    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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.

    Kaulinan awan sumber terbuka dina WebRTC: p2p, multiplayer, nol latency
    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.

sumber: www.habr.com

Tambahkeun komentar