Open source maya game ing WebRTC: p2p, bebarengan, nul latensi

Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
Piranti lunak minangka layanan, infrastruktur minangka layanan, platform minangka layanan, platform komunikasi minangka layanan, konferensi video minangka layanan, kepiye babagan game awan minangka layanan? Wis ana sawetara upaya kanggo nggawe game awan (Cloud Gaming), kayata Stadia, sing bubar diluncurake dening Google. Stadia ora anyar kanggo WebRTC, nanging wong liya bisa nggunakake WebRTC kanthi cara sing padha?

Thanh Nguyen mutusake kanggo nyoba kesempatan iki ing proyek open source CloudRetro. CloudRetro adhedhasar Pion, populer Pustaka WebRTC adhedhasar Go (matur nuwun Dituduhake saka tim pangembangan Pion kanggo pitulungan kanggo nyiapake artikel iki). Ing artikel iki, Thanh nyedhiyakake ringkesan arsitektur proyeke, lan uga ngomong babagan apa sing migunani sing disinaoni lan tantangan apa wae sing ditemoni sajrone karyane.

entri

Taun kepungkur, nalika Google ngumumake Stadia, aku kaget. Ide kasebut unik lan inovatif, mula aku terus-terusan mikir kepiye carane bisa ditindakake kanthi teknologi sing ana. Kepinginan kanggo luwih ngerti topik iki nyebabake aku nggawe versi game awan open-source dhewe. Asil iki mung Fantastic. Ing ngisor iki aku pengin nuduhake proses nggarap taunku proyek.

TLDR: versi geser cendhak kanthi sorotan

Napa game maya minangka masa depan

Aku yakin Cloud Gaming bakal dadi generasi sabanjure ora mung game, nanging uga bidang ilmu komputer liyane. Cloud game minangka puncak model klien / server. Model iki maximizes Manajemen backend lan nyilikake karya frontend dening hosting logika game ing server remot lan streaming gambar / audio kanggo klien. Server nindakake pangolahan abot supaya klien ora ana maneh ing watesan hardware.

Google Stadia pancen ngidini sampeyan muter game AAA (yaiku game blockbuster dhuwur) ing antarmuka kaya YouTube. Metodologi sing padha bisa ditrapake kanggo aplikasi offline abot kayata sistem operasi utawa desain grafis 2D/3D, lsp. supaya kita bisa mbukak kanthi konsisten ing piranti spek sing sithik ing pirang-pirang platform.

Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
Masa depan teknologi iki: Mbayangno yen Microsoft Windows 10 mlaku ing browser Chrome?

Cloud game sacara teknis nantang

Game minangka salah sawijining wilayah langka sing mbutuhake respon pangguna sing cepet lan cepet. Yen sok-sok kita nemoni wektu tundha 2 detik nalika ngeklik kaca, iki bisa ditampa. Aliran video langsung cenderung telat sawetara detik, nanging isih menehi kegunaan sing cukup. Nanging, yen game kerep lags 500ms, iku mung unplayable. Tujuane yaiku nggayuh latensi sing sithik banget supaya jurang antarane input lan media dadi sithik. Mulane, pendekatan tradisional kanggo streaming video ora ditrapake ing kene.

Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
Cithakan Game Cloud Umum

Proyek sumber terbuka CloudRetro

Aku mutusakΓ© kanggo nggawe sampel test game maya kanggo ndeleng yen kabeh iki bisa karo watesan jaringan nyenyet. Aku milih Golang kanggo bukti konsep amarga iku basa aku paling menowo lan cocok kanggo implementasine iki kanggo akeh alasan liyane, minangka aku banjur ditemokakΓ©. Go iku prasaja lan berkembang cepet banget; Saluran ing Go apik kanggo ngatur multithreading.

Proyek kasebut CloudRetro.io iku layanan game maya open source kanggo game retro. Tujuane proyek kasebut yaiku nggawa pengalaman game sing paling nyaman menyang game retro tradisional lan nambah bebarengan.
Sampeyan bisa sinau luwih lengkap babagan proyek ing kene: https://github.com/giongto35/cloud-game.

Fungsi CloudRetro

CloudRetro nggunakake game retro kanggo nuduhake kekuwatan game maya. Sing ngidini sampeyan entuk akeh pengalaman game sing unik.

  • Portabilitas game
    • Puter maneh cepet nalika mbukak kaca; ora perlu download utawa instalasi
    • Bisa digunakake ing browser seluler, mula ora perlu piranti lunak kanggo mbukak

  • Sesi game bisa dienggo bareng ing pirang-pirang piranti lan disimpen ing mΓ©ga kanggo mbesuk sampeyan mlebu
  • Game kasebut bisa dialirake, utawa bisa dimainake dening sawetara pangguna sekaligus:
    • Crowdplay kaya TwitchPlayPokemon, mung luwih cross-platform lan luwih nyata-wektu
    • Game offline online. Akeh pangguna bisa muter tanpa nyetel jaringan. Samurai Shodown saiki bisa dimainake dening 2 pemain liwat jaringan CloudRetro

    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Versi demo saka game bebarengan online ing piranti beda

    Infrastruktur

    Requirements lan tumpukan teknologi

    Ing ngisor iki minangka dhaptar syarat sing aku aturake sadurunge miwiti proyek kasebut.

    1. Pemain siji
    Keperluan iki bisa uga ora penting banget utawa jelas ing kene, nanging minangka salah sawijining kunci utama, ngidini game maya tetep adoh saka layanan streaming tradisional. Yen kita fokus ing game siji-pamuter, kita bisa njaluk nyisihaken saka server terpusat utawa CDN amarga kita ora kudu stream kanggo massa. Tinimbang ngunggah stream menyang server sink utawa ngirim paket menyang server WebSocket terpusat, aliran layanan dikirim langsung menyang pangguna liwat sambungan WebRTC peer-to-peer.

    2. Stream media latency kurang
    Maca babagan Stadia, aku kerep ndeleng WebRTC sing kasebut ing sawetara artikel. Aku nyadari yen WebRTC minangka teknologi sing luar biasa lan cocog kanggo digunakake ing game maya. WebRTC minangka proyek sing nyedhiyakake browser web lan aplikasi seluler kanthi komunikasi wektu nyata liwat API sing prasaja. Iki nyedhiyakake konektivitas peer-to-peer, dioptimalake kanggo media, lan duwe codec standar sing dibangun kayata VP8 lan H264.

    Aku prioritized mesthekake pengalaman panganggo paling apik saka ngramut grafis kualitas dhuwur. Sawetara losses bisa ditampa ing algoritma. Google Stadia duwe langkah tambahan kanggo nyuda ukuran gambar ing server, lan pigura ditingkatake kanthi kualitas sing luwih dhuwur sadurunge dikirim menyang kanca-kanca.

    3. Infrastruktur sing disebarake kanthi rute geografis
    Ora ketompo carane ngoptimalake algoritma lan kode kompresi, jaringan isih dadi faktor penentu sing paling akeh nyumbang kanggo latensi. Arsitektur kudu duwe mekanisme kanggo masangake server sing paling cedhak karo pangguna kanggo nyuda wektu round-trip (RTT). Arsitektur kudu duwe koordinator 1 lan sawetara server streaming sing disebar ing saindenging jagad: AS Kulon, AS Timur, Eropa, Singapura, China. Kabeh server streaming kudu rampung diisolasi. Sistem bisa nyetel distribusi nalika server gabung utawa ninggalake jaringan. Mangkono, kanthi lalu lintas gedhe, nambah server tambahan ngidini kanggo skala horisontal.

    4. Kompatibilitas browser
    Cloud game paling apik nalika mbutuhake paling ora saka pangguna. Iki tegese iku bisa kanggo mbukak ing browser. Browser mbantu nggawe pengalaman game dadi nyaman kanggo pangguna, ngirit saka nginstal piranti lunak lan hardware. Browser uga mbantu nyedhiyakake fungsionalitas lintas platform antarane versi seluler lan desktop. Untunge, WebRTC didhukung kanthi apik ing macem-macem browser.

    5. pamisah cetha saka antarmuka game lan layanan
    Aku ndeleng layanan game maya minangka platform. Saben uwong kudu bisa nyambungake apa wae menyang platform kasebut. Saiki aku wis Integrasi LibRetro karo layanan game maya amarga LibRetro nawakake antarmuka emulator game ayu kanggo game retro kayata SNES, GBA, PS.

    6. Kamar kanggo bebarengan, muter akeh lan pranala njaba (deep-link) karo game
    CloudRetro ndhukung akeh game anyar kayata CrowdPlay lan MultiPlayer Online kanggo game retro. Yen sawetara pangguna mbukak link jero sing padha ing komputer sing beda-beda, dheweke bakal weruh game sing padha lan malah bisa gabung.

    Kajaba iku, negara game disimpen ing panyimpenan maya. Iki ngidini pangguna kanggo terus muter ing sembarang wektu ing piranti liyane.

    7. Skala horisontal
    Kaya SAAS saiki, game awan kudu dirancang kanthi skala horisontal. Desain koordinator-pegawe ngidini sampeyan nambah luwih akeh buruh kanggo nglayani lalu lintas liyane.

    8. Ora ana sambungan menyang siji awan
    Infrastruktur CloudRetro di-host ing macem-macem panyedhiya awan (Digital Ocean, Alibaba, panyedhiya khusus) kanggo macem-macem wilayah. Aku ngaktifake mlaku ing wadhah Docker kanggo infrastruktur lan ngatur setelan jaringan nggunakake skrip bash supaya ora dikunci dadi panyedhiya maya siji. Kanthi nggabungake iki karo NAT Traversal ing WebRTC, kita bisa duwe keluwesan kanggo nyebarake CloudRetro ing platform maya lan malah ing mesin pangguna.

    Desain arsitektur

    buruh: (utawa server streaming kasebut ing ndhuwur) multiplies game, mbukak pipa enkoding, lan stream media dienkode kanggo pangguna. Kasus buruh disebar ing saindenging jagad, lan saben buruh bisa nangani pirang-pirang sesi pangguna bebarengan.

    Koordinator: tanggung jawab kanggo masangake pangguna anyar karo pekerja sing paling cocog kanggo streaming. Koordinator sesambungan karo buruh liwat WebSocket.

    Panyimpenan negara game: panyimpenan remot tengah kanggo kabeh negara game. Panyimpenan iki nyedhiyakake fungsi penting kayata nyimpen / mbukak remot.

    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Arsitektur tingkat paling dhuwur saka CloudRetro

    Skrip Kustom

    Nalika pangguna anyar mbukak CloudRetro ing langkah 1 lan 2 sing ditampilake ing gambar ing ngisor iki, koordinator bebarengan karo dhaptar buruh sing kasedhiya dijaluk menyang kaca pisanan. Sawise iki, ing langkah 3 klien ngetung wektu tundha kanggo kabeh calon nggunakake panjalukan ping HTTP. Dhaptar telat iki banjur dikirim maneh menyang koordinator supaya bisa nemtokake buruh sing paling cocok kanggo ngladeni pangguna. Langkah 4 ing ngisor iki nggawe game. Sambungan streaming WebRTC ditetepake antarane pangguna lan buruh sing ditugasake.
    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Skrip pangguna sawise entuk akses

    Apa sing ana ing njero buruh

    Pipa game lan streaming disimpen ing njero pekerja kanthi sepi lan ijol-ijolan informasi ing kana liwat antarmuka. Saiki, komunikasi iki ditindakake kanthi mindhah data ing memori liwat Saluran Golang ing proses sing padha. Tujuan sabanjure yaiku segregasi, yaiku. Bukak sawijining game ing proses liyane.

    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Interaksi komponen buruh

    Komponen utama:

    • WebRTC: komponen klien sing nampa input pangguna lan output media dienkode saka server.
    • Emulator game: komponen game. Thanks kanggo perpustakaan Libretro, sistem bisa mbukak game ing proses sing padha lan nyegat media lan input stream.
    • Bingkai ing game dijupuk lan dikirim menyang encoder.
    • Encoder Gambar/Audio: pipa enkoding sing njupuk pigura media, ngodhe ing latar mburi, lan output gambar/audio dienkode.

    РСализация

    CloudRetro gumantung ing WebRTC minangka teknologi backbone, supaya sadurunge nyilem menyang rincian implementasine Golang, aku mutusakΓ© kanggo pirembagan bab WebRTC dhewe. Iki minangka teknologi sing luar biasa sing wis mbantu aku entuk latensi sub-detik kanggo streaming data.

    WebRTC

    WebRTC dirancang kanggo nyedhiyakake sambungan peer-to-peer kanthi kualitas dhuwur ing aplikasi seluler lan browser asli nggunakake API sing prasaja.

    NAT Traversal

    WebRTC dikenal kanthi fungsi NAT Traversal. WebRTC dirancang kanggo komunikasi peer-to-peer. Tujuane yaiku nemokake rute langsung sing paling cocog, ngindhari gateway lan firewall NAT kanggo komunikasi peer-to-peer liwat proses sing diarani ICE. Minangka bagΓ©an saka proses iki, API WebRTC nemokake alamat IP umum sampeyan nggunakake server STUN lan nerusake menyang server relay (NGABUK) nalika sambungan langsung ora bisa ditetepake.

    Nanging, CloudRetro ora ngeksploitasi fitur iki kanthi lengkap. Sambungan peer-to-peer ora ana ing antarane pangguna, nanging ing antarane pangguna lan server maya. Sisih server model nduweni watesan komunikasi langsung sing luwih sithik tinimbang piranti pangguna biasa. Iki ngidini sampeyan mbukak port mlebu utawa nggunakake alamat IP umum kanthi langsung, amarga server ora ana ing mburi NAT.

    Sadurunge, aku pengin ngowahi proyek kasebut dadi platform distribusi game kanggo Cloud Gaming. Ide iki ngidini para pencipta game nyedhiyakake game lan sumber daya streaming. Lan pangguna bakal langsung sesambungan karo panyedhiya. Kanthi cara desentralisasi iki, CloudRetro mung minangka kerangka kanggo nyambungake sumber daya streaming pihak katelu menyang pangguna, dadi luwih bisa diukur nalika ora di-host maneh. Peranan WebRTC NAT Traversal ing kene penting banget kanggo nggampangake inisialisasi sambungan peer-to-peer ing sumber daya streaming pihak katelu, nggawe luwih gampang kanggo pangripta nyambung menyang jaringan.

    Kompresi video

    Kompresi video minangka bagean penting saka pipa lan nyumbang banget kanggo aliran sing lancar. Sanajan ora perlu ngerti kabeh rincian enkoding video VP8/H264, ngerti konsep kasebut bisa mbantu sampeyan ngerti opsi kacepetan video streaming, debug prilaku sing ora dikarepke, lan nyetel latensi.

    Ngompres video kanggo layanan streaming angel amarga algoritma kudu mesthekake yen total wektu enkoding + wektu transmisi jaringan + wektu dekoding paling sithik. Kajaba iku, proses coding kudu konsisten lan terus-terusan. Sawetara tradeoff enkoding ora ditrapake-contone, kita ora bisa milih wektu enkoding sing dawa tinimbang ukuran file sing luwih cilik lan wektu dekoding, utawa nggunakake kompresi sing ora konsisten.

    Gagasan ing mburi kompresi video yaiku ngilangi informasi sing ora perlu nalika njaga tingkat akurasi sing bisa ditampa kanggo pangguna. Saliyane ngodhe pigura gambar statis individu, algoritma kasebut nemtokake pigura saiki saka sing sadurunge lan sabanjure, mula mung bedane sing dikirim. Kaya sing bisa dideleng saka conto karo Pacman, mung titik diferensial sing ditularake.

    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Perbandingan pigura video nggunakake Pacman minangka conto

    Kompresi audio

    Kajaba iku, algoritma kompresi audio ngilangi data sing ora bisa dingerteni manungsa. Opus saiki dadi codec audio sing paling apik. Iki dirancang kanggo ngirim gelombang audio liwat protokol datagram sing diurutake kayata RTP (Real Time Transport Protocol). Latensi luwih murah tinimbang mp3 lan aac, lan kualitase luwih dhuwur. Latensi biasane udakara 5 ~ 66,5ms.

    Pion, WebRTC in Golang

    Pawn minangka proyek open source sing nggawa WebRTC menyang Golang. Tinimbang bungkus pustaka WebRTC C ++ asli, Pion minangka implementasi Golang asli saka WebRTC kanthi kinerja sing luwih apik, integrasi Go, lan kontrol versi ing protokol WebRTC.

    Perpustakaan kasebut uga ngidini streaming kanthi akeh built-in kanthi latensi sub-detik. Wis implementasine dhewe saka STUN, DTLS, SCTP, etc. lan sawetara eksperimen karo QUIC lan WebAssembly. Pustaka sumber terbuka iki dhewe minangka sumber belajar sing apik banget kanthi dokumentasi sing apik, implementasi protokol jaringan, lan conto sing apik.

    Komunitas Pion, dipimpin dening pencipta sing semangat banget, cukup rame, kanthi akeh diskusi kualitas babagan WebRTC. Yen sampeyan kasengsem ing teknologi iki, gabung http://pion.ly/slack – sampeyan bakal sinau akΓ¨h iku anyar.

    Nulis CloudRetro ing Golang

    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Implementasine buruh ing Go

    Go Channels in Action

    Thanks kanggo desain saluran Go sing apik, masalah streaming acara lan konkurensi luwih gampang. Kaya ing diagram, GoRoutine beda duwe sawetara komponen sing mlaku bebarengan. Saben komponen ngatur negara lan komunikasi liwat saluran. Penegasan selektif Golang meksa siji acara atom diproses saben wektu ing game (game tick). Iki tegese ora ana kunci sing dibutuhake kanggo desain iki. Contone, nalika pangguna nyimpen, gambar asli seko lengkap negara game dibutuhake. Negara iki kudu tetep terus-terusan, mlebu nganti panyimpenan rampung. Sajrone saben obah game, backend mung bisa nangani nyimpen utawa operasi input, nggawe thread proses 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
    	}
        }
    }

    Fan-in / Fan-out

    Cithakan Golang iki cocog karo kasus panggunaan CrowdPlay lan Multiple Player. Kanthi pola iki, kabeh input pangguna ing sak kamar dibangun ing saluran mlebu tengah. Media game banjur disebarake menyang kabeh pangguna ing kamar sing padha. Kanthi cara iki, kita entuk divisi negara game ing antarane sawetara sesi game saka pangguna sing beda.

    Open source maya game ing WebRTC: p2p, bebarengan, nul latensi
    Sinkronisasi antarane macem-macem sesi

    Kakurangan Golang

    Golang ora sampurna. Saluran iki alon. Dibandhingake karo pamblokiran, saluran Go mung minangka cara sing luwih gampang kanggo nangani acara bebarengan lan berulir, nanging saluran ora nyedhiyakake kinerja sing paling apik. Ana logika pamblokiran kompleks ing ngisor saluran kasebut. Dadi aku nggawe sawetara pangaturan kanggo implementasine, nglamar maneh kunci lan nilai atom nalika ngganti saluran kanggo ngoptimalake kinerja.

    Kajaba iku, tukang sampah ing Golang ora dikelola, sing kadhangkala nyebabake jeda sing curiga. Iki banget ngganggu aplikasi streaming wektu nyata.

    COG

    Proyèk iki nggunakake perpustakaan Golang VP8/H264 open source kanggo kompresi media lan Libretro kanggo emulator game. Kabeh perpustakaan iki mung bungkus perpustakaan C ing Go nggunakake COG. Sawetara kekurangan sing kadhaptar ing kirim iki dening Dave Cheney. Masalah sing aku nemoni:

    • ora bisa nyekel kacilakan ing CGO, sanajan karo Golang RecoveryCrash;
    • Gagal kanggo ngenali bottlenecks kinerja nalika kita ora bisa ndeteksi masalah rinci ing CGO.

    kesimpulan

    Aku entuk tujuan kanggo ngerti layanan game maya lan nggawe platform sing mbantu aku main game retro nostalgia karo kanca-kanca online. Proyek iki ora bakal bisa ditindakake tanpa perpustakaan Pion lan dhukungan saka komunitas Pion. Aku ngucapke matur nuwun banget kanggo pembangunan intensif sawijining. API prasaja sing diwenehake dening WebRTC lan Pion njamin integrasi sing lancar. Bukti konsep pisanan saya dirilis ing minggu sing padha, sanajan aku ora ngerti babagan komunikasi peer-to-peer (P2P).

    Sanajan gampang integrasi, streaming P2P pancen dadi wilayah sing kompleks banget ing ilmu komputer. Dheweke kudu ngatasi kerumitan arsitektur jaringan sing wis suwe kayata IP lan NAT kanggo nggawe sesi peer-to-peer. Nalika nggarap proyek iki, aku entuk akeh kawruh babagan jaringan lan optimasi kinerja, mula aku ngajak kabeh wong nyoba mbangun produk P2P nggunakake WebRTC.

    CloudRetro nyedhiyakake kabeh kasus panggunaan sing dakkarepake saka perspektif minangka tukang game retro. Nanging, aku mikir ana akeh wilayah ing proyek sing bisa saya tambah, kayata nggawe jaringan luwih dipercaya lan performa, nyedhiyakake grafis game sing luwih dhuwur, utawa kemampuan kanggo nuduhake game ing antarane pangguna. Aku kerja keras iki. Mangga tindakake proyek lan ndhukung yen sampeyan seneng.

Source: www.habr.com

Add a comment