WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish

WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
Xizmat sifatida dasturiy ta'minot, xizmat sifatida infratuzilma, xizmat sifatida platforma, xizmat sifatida aloqa platformasi, xizmat sifatida video konferentsiya, xizmat sifatida bulutli o'yin haqida nima deyish mumkin? Google tomonidan yaqinda ishga tushirilgan Stadia kabi bulutli oʻyinlarni (Cloud Gaming) yaratishga bir necha bor urinishlar boʻlgan. Stadiya WebRTC uchun yangi emas, lekin boshqalar WebRTC dan xuddi shu tarzda foydalanishi mumkinmi?

Than Nguyen bu imkoniyatni o'zining ochiq manbali CloudRetro loyihasida sinab ko'rishga qaror qildi. CloudRetro Pion-ga asoslangan, mashhur Go-ga asoslangan WebRTC kutubxonasi (rahmat Ko'rsatilgan Pion ishlab chiqish guruhidan ushbu maqolani tayyorlashda yordam bergani uchun). Ushbu maqolada Thanh o'z loyihasining arxitekturasi haqida umumiy ma'lumot beradi, shuningdek, u qanday foydali narsalarni o'rganganligi va ish paytida qanday qiyinchiliklarga duch kelgani haqida gapiradi.

kirish

O'tgan yili Google Stadia-ni e'lon qilganida, bu meni hayratda qoldirdi. G'oya shu qadar noyob va innovatsion bo'lib, men doimo bu mavjud texnologiyalar bilan qanday qilib mumkin bo'lganiga hayron bo'ldim. Ushbu mavzuni yaxshiroq tushunish istagi meni ochiq manbali bulutli o'yinning o'z versiyasini yaratishga undadi. Natija shunchaki ajoyib edi. Quyida men o'z yilimdagi ish jarayoni bilan bo'lishmoqchiman loyiha.

TLDR: diqqatga sazovor joylar bilan qisqa slayd versiyasi

Nima uchun bulutli o'yinlar kelajak

O'ylaymanki, Cloud Gaming tez orada nafaqat o'yin, balki kompyuter fanining boshqa sohalarining keyingi avlodiga aylanadi. Bulutli o'yinlar mijoz/server modelining eng yuqori cho'qqisidir. Ushbu model uzoq serverda o'yin mantig'ini joylashtirish va mijozga tasvirlar/audiolarni uzatish orqali backend boshqaruvini maksimal darajada oshiradi va frontend ishini minimallashtiradi. Server jiddiy ishlov berishni amalga oshiradi, shuning uchun mijoz endi apparat cheklovlari rahm-shafqatiga ega emas.

Google Stadia sizga o'ynash imkonini beradi AAA o'yinlar (ya'ni, yuqori darajadagi blokbaster o'yinlari) YouTube kabi interfeysda. Xuddi shu metodologiya operatsion tizim yoki 2D/3D grafik dizayn va boshqalar kabi boshqa og'ir oflayn ilovalarga ham qo'llanilishi mumkin. Shunday qilib, biz ularni bir nechta platformalarda past texnik qurilmalarda doimiy ravishda ishlatishimiz mumkin.

WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
Ushbu texnologiyaning kelajagi: Tasavvur qiling-a, Microsoft Windows 10 Chrome brauzerida ishlaganmi?

Bulutli o'yinlar texnik jihatdan qiyin

O'yin doimiy, tezkor foydalanuvchi javobini talab qiladigan noyob sohalardan biridir. Vaqti-vaqti bilan biz sahifani bosishda 2 soniya kechikishga duch kelsak, bu qabul qilinadi. Jonli video oqimlari odatda bir necha soniya kechikadi, lekin baribir o'rtacha qulaylikni taklif qiladi. Biroq, agar o'yin tez-tez 500 ms ga kechiksa, uni shunchaki o'ynab bo'lmaydi. Bizning maqsadimiz juda past kechikishga erishishdir, shunda kirish va media o'rtasidagi bo'shliq imkon qadar kichik bo'ladi. Shuning uchun, video oqimiga an'anaviy yondashuv bu erda qo'llanilmaydi.

WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
Umumiy bulutli o'yin shabloni

Ochiq kodli CloudRetro loyihasi

Bularning barchasi tarmoq cheklovlari bilan mumkinmi yoki yo'qligini bilish uchun men bulutli o'yinning sinov namunasini yaratishga qaror qildim. Men kontseptsiyani isbotlash uchun Golangni tanladim, chunki bu menga eng tanish bo'lgan til edi va keyinroq kashf qilganimdek, boshqa ko'plab sabablarga ko'ra ushbu amaliyot uchun juda mos edi. Go oddiy va juda tez rivojlanadi; Go'dagi kanallar ko'p oqimlarni boshqarish uchun juda yaxshi.

Loyiha CloudRetro.io retro oʻyinlar uchun ochiq manba bulutli oʻyin xizmatidir. Loyihaning maqsadi an'anaviy retro o'yinlarga eng qulay o'yin tajribasini olib kelish va multiplayerni qo'shishdir.
Loyiha haqida batafsil ma’lumotni bu yerda olishingiz mumkin: https://github.com/giongto35/cloud-game.

CloudRetro funksiyasi

CloudRetro bulutli oʻyinlar kuchini namoyish qilish uchun retro oʻyinlardan foydalanadi. Bu sizga ko'plab noyob o'yin tajribalarini olish imkonini beradi.

  • O'yinning portativligi
    • Sahifani ochishda darhol ijro etish; yuklab olish yoki o'rnatish kerak emas
    • Mobil brauzerda ishlaydi, shuning uchun uni ishga tushirish uchun hech qanday dastur kerak emas

  • Oʻyin seanslari bir nechta qurilmalarda baham koʻrilishi va keyingi safar tizimga kirganingizda bulutda saqlanishi mumkin
  • O'yinni oqimlash mumkin yoki uni bir vaqtning o'zida bir nechta foydalanuvchi o'ynashi mumkin:
    • TwitchPlayPokemon kabi olomon o'yini, faqat ko'proq platformalararo va ko'proq real vaqtda
    • Oflayn onlayn o'yinlar. Ko'p foydalanuvchilar tarmoqni o'rnatmasdan o'ynashlari mumkin. Samurai Shodown endi CloudRetro tarmog'i orqali 2 ta o'yinchi tomonidan o'ynashi mumkin

    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    Turli qurilmalarda onlayn multiplayer o'yinining demo versiyasi

    Infrastruktura

    Talablar va texnologiya to'plami

    Quyida men loyihani boshlashdan oldin qo'ygan talablar ro'yxati keltirilgan.

    1. Bitta o'yinchi
    Bu talab bu erda unchalik muhim yoki ravshan ko'rinmasligi mumkin, ammo bu mening asosiy fikrlarimdan biri bo'lib, bulutli o'yinlarni an'anaviy oqim xizmatlaridan iloji boricha uzoqroq tutishga imkon beradi. Agar biz bitta o'yinchi o'yiniga e'tibor qaratadigan bo'lsak, biz markazlashtirilgan serverdan yoki CDNdan xalos bo'lishimiz mumkin, chunki biz ommaga translyatsiya qilishimiz shart emas. Oqimlarni sink serveriga yuklash yoki paketlarni markazlashtirilgan WebSocket serveriga o‘tkazish o‘rniga, xizmat oqimlari to‘g‘ridan-to‘g‘ri foydalanuvchiga WebRTC ulanishi orqali yetkaziladi.

    2. Past kechikishli media oqimi
    Stadia haqida o'qiyotganimda, ba'zi maqolalarda WebRTC ni tez-tez ko'raman. Men WebRTC ajoyib texnologiya ekanligini va bulutli o'yinlarda foydalanish uchun juda mos ekanligini angladim. WebRTC - bu oddiy API orqali veb-brauzerlar va mobil ilovalarni real vaqtda aloqa bilan ta'minlaydigan loyiha. U tengdoshga ulanishni ta'minlaydi, media uchun optimallashtirilgan va VP8 va H264 kabi o'rnatilgan standart kodeklarga ega.

    Men yuqori sifatli grafikani saqlab qolishdan ko'ra eng yaxshi foydalanuvchi tajribasini ta'minlashni birinchi o'ringa qo'ydim. Algoritmda ba'zi yo'qotishlar qabul qilinadi. Google Stadia serverdagi tasvir hajmini kamaytirishning qo'shimcha bosqichiga ega va ramkalar tengdoshlarga uzatilgunga qadar yuqori sifatga ko'tariladi.

    3. Geografik marshrutlash bilan taqsimlangan infratuzilma
    Siqish algoritmi va kodi qanchalik optimallashtirilgan bo'lishidan qat'i nazar, tarmoq hali ham kechikishga eng ko'p hissa qo'shadigan hal qiluvchi omil bo'lib qolmoqda. Arxitekturada aylanish vaqtini (RTT) qisqartirish uchun foydalanuvchiga eng yaqin serverni ulash mexanizmi bo'lishi kerak. Arxitekturada 1 ta koordinator va butun dunyo bo'ylab tarqalgan bir nechta oqim serverlari bo'lishi kerak: G'arbiy AQSh, Sharqiy AQSh, Yevropa, Singapur, Xitoy. Barcha oqim serverlari butunlay izolyatsiya qilingan bo'lishi kerak. Server tarmoqqa qo'shilganda yoki undan chiqib ketganda tizim o'z taqsimotini sozlashi mumkin. Shunday qilib, katta trafik bilan qo'shimcha serverlarni qo'shish gorizontal masshtablash imkonini beradi.

    4. Brauzerning mosligi
    Bulutli o'yin foydalanuvchilardan eng kam talab qilganda eng yaxshisidir. Bu shuni anglatadiki, brauzerda ishlash mumkin. Brauzerlar o'yin tajribasini foydalanuvchilar uchun imkon qadar qulay qilishlariga yordam beradi va ularni dasturiy ta'minot va apparat o'rnatishdan saqlaydi. Brauzerlar, shuningdek, mobil va ish stoli versiyalari o'rtasida platformalararo funksiyalarni ta'minlashga yordam beradi. Yaxshiyamki, WebRTC turli xil brauzerlarda yaxshi qo'llab-quvvatlanadi.

    5. O'yin interfeysi va xizmatini aniq ajratish
    Men bulutli o'yin xizmatini platforma sifatida ko'raman. Har kim har qanday narsani platformaga ulashi kerak. Endi men birlashdim LibRetro bulutli o'yin xizmati bilan, chunki LibRetro SNES, GBA, PS kabi retro o'yinlar uchun chiroyli o'yin emulyatori interfeysini taklif qiladi.

    6. Ko'p o'yinchi, olomon o'ynash va o'yin bilan tashqi bog'lanish (chuqur bog'lanish) uchun xonalar
    CloudRetro retro o'yinlar uchun CrowdPlay va Online MultiPlayer kabi ko'plab yangi o'yinlarni qo'llab-quvvatlaydi. Agar bir nechta foydalanuvchi turli xil kompyuterlarda bir xil chuqur havolani ochsa, ular bir xil ishlaydigan o'yinni ko'radilar va hatto unga qo'shila oladilar.

    Bundan tashqari, o'yin holatlari bulutli xotirada saqlanadi. Bu foydalanuvchilarga istalgan vaqtda istalgan boshqa qurilmada oʻynashni davom ettirish imkonini beradi.

    7. Gorizontal masshtablash
    Bugungi kunda har qanday SAAS singari, bulutli o'yinlar ham gorizontal ravishda kengaytiriladigan bo'lishi kerak. Koordinator-ishchi dizayni sizga ko'proq trafikka xizmat ko'rsatish uchun ko'proq ishchilarni qo'shish imkonini beradi.

    8. Bitta bulutga ulanish yo'q
    CloudRetro infratuzilmasi turli hududlar uchun turli xil bulutli provayderlarda (Digital Ocean, Alibaba, maxsus provayder) joylashtirilgan. Men infratuzilma uchun Docker konteynerida ishlashni yoqaman va bitta bulut provayderiga qulflanib qolmaslik uchun bash skripti yordamida tarmoq sozlamalarini sozlayman. Buni WebRTC-dagi NAT Traversal bilan birlashtirib, biz CloudRetro-ni istalgan bulutli platformada va hatto istalgan foydalanuvchining mashinalarida o‘rnatish uchun moslashuvchanlikka ega bo‘lishimiz mumkin.

    Arxitektura dizayni

    Ishchi: (yoki yuqorida aytib o'tilgan oqim serveri) o'yinlarni ko'paytiradi, kodlash quvurini boshqaradi va kodlangan mediani foydalanuvchilarga uzatadi. Ishchi namunalari butun dunyo bo'ylab tarqatiladi va har bir ishchi bir vaqtning o'zida bir nechta foydalanuvchi seanslarini boshqarishi mumkin.

    Koordinator: yangi foydalanuvchini oqim uchun eng mos ishchi bilan bog'lash uchun javobgardir. Koordinator ishchilar bilan WebSocket orqali muloqot qiladi.

    O'yin holatini saqlash: barcha o'yin holatlari uchun markaziy masofaviy saqlash. Ushbu xotira masofadan saqlash/yuklash kabi muhim funksiyalarni ta'minlaydi.

    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    CloudRetroning yuqori darajadagi arxitekturasi

    Maxsus skript

    Quyidagi rasmda ko'rsatilgan 1 va 2-bosqichlarda yangi foydalanuvchi CloudRetro-ni ochganda, koordinator va mavjud ishchilar ro'yxati birinchi sahifaga so'raladi. Shundan so'ng, 3-bosqichda mijoz HTTP ping so'rovi yordamida barcha nomzodlar uchun kechikishlarni hisoblab chiqadi. Keyinchalik bu kechikishlar ro'yxati koordinatorga qaytariladi, shunda u foydalanuvchiga xizmat ko'rsatish uchun eng mos ishchini aniqlay oladi. Quyidagi 4-bosqich o'yinni yaratadi. Foydalanuvchi va tayinlangan ishchi o'rtasida WebRTC oqim aloqasi o'rnatiladi.
    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    Kirish huquqiga ega bo'lgandan keyin foydalanuvchi skripti

    Ishchining ichida nima bor

    O'yin va oqim quvurlari ishchi ichida alohida saqlanadi va u erda interfeys orqali ma'lumot almashadi. Hozirgi vaqtda ushbu aloqa xotiradagi ma'lumotlarni uzatish orqali amalga oshiriladi Golang kanallari xuddi shu jarayonda. Keyingi maqsad - segregatsiya, ya'ni. boshqa jarayonda o'yinning mustaqil ishga tushirilishi.

    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    Ishchi komponentlarning o'zaro ta'siri

    Asosiy komponentlar:

    • WebRTC: foydalanuvchi kiritishini qabul qiluvchi va serverdan kodlangan mediani chiqaradigan mijoz komponenti.
    • O'yin emulyatori: o'yin komponenti. Libretro kutubxonasi tufayli tizim o'yinni bir xil jarayon ichida boshqarishi va media va kirish oqimini ichki ravishda ushlab turishi mumkin.
    • O'yin ichidagi kadrlar yozib olinadi va kodlovchiga yuboriladi.
    • Tasvir/audio kodlovchi: media ramkalarni oladigan, ularni fonda kodlaydigan va kodlangan tasvirlar/audiolarni chiqaradigan kodlash quvuri.

    Реализация

    CloudRetro o'zining asosiy texnologiyasi sifatida WebRTC-ga tayanadi, shuning uchun Golangni amalga oshirish tafsilotlariga sho'ng'ishdan oldin, men WebRTC-ning o'zi haqida gapirishga qaror qildim. Bu ajoyib texnologiya bo'lib, u menga ma'lumotlarni uzatish uchun ikkinchi soniya kechikishiga erishishda katta yordam berdi.

    WebRTC

    WebRTC oddiy API yordamida mahalliy mobil ilovalar va brauzerlarda yuqori sifatli peer-to-peer ulanishlarini ta'minlash uchun mo'ljallangan.

    NAT traversal

    WebRTC NAT Traversal funksiyasi bilan mashhur. WebRTC peer-to-peer muloqot uchun mo'ljallangan. Uning maqsadi NAT shlyuzlari va xavfsizlik devorlaridan qochib, eng mos to'g'ridan-to'g'ri yo'nalishni topishdir. ICE. Ushbu jarayonning bir qismi sifatida WebRTC API'lari STUN serverlari yordamida umumiy IP manzilingizni topadi va uni relay serveriga yuboradi (Qaytish) to'g'ridan-to'g'ri ulanish o'rnatilmaganda.

    Biroq, CloudRetro bu xususiyatdan to'liq foydalanmaydi. Uning tengdoshli aloqalari foydalanuvchilar o'rtasida emas, balki foydalanuvchilar va bulutli serverlar o'rtasida mavjud. Modelning server tomoni odatdagi foydalanuvchi qurilmasiga qaraganda kamroq to'g'ridan-to'g'ri aloqa cheklovlariga ega. Bu sizga kiruvchi portlarni oldindan ochish yoki to'g'ridan-to'g'ri umumiy IP manzillardan foydalanish imkonini beradi, chunki server NAT dan orqada emas.

    Ilgari men loyihani Cloud Gaming uchun o'yin tarqatish platformasiga aylantirmoqchi edim. G'oya o'yin yaratuvchilarga o'yinlar va oqim manbalarini taqdim etishga ruxsat berish edi. Va foydalanuvchilar provayderlar bilan bevosita muloqot qilishlari mumkin edi. Ushbu markazlashtirilmagan tarzda, CloudRetro uchinchi tomon oqim manbalarini foydalanuvchilarga ulash uchun asos bo'lib, u boshqa joylashmaganda uni yanada kengaytirilishi mumkin. Bu yerda WebRTC NAT Traversal roli uchinchi tomon oqim manbalarida peer-to-peer ulanishni ishga tushirishni osonlashtirish uchun juda muhim, bu esa yaratuvchining tarmoqqa ulanishini osonlashtiradi.

    Videoni siqish

    Videoni siqish quvur liniyasining ajralmas qismidir va silliq oqimga katta hissa qo'shadi. VP8/H264 video kodlashning har bir tafsilotini bilish shart bo'lmasa-da, tushunchalarni tushunish sizga oqimli video tezligi variantlarini tushunishga, kutilmagan xatti-harakatlarni tuzatishga va kechikishni sozlashga yordam beradi.

    Oqim xizmati uchun videoni siqish qiyin, chunki algoritm umumiy kodlash vaqti + tarmoq uzatish vaqti + dekodlash vaqti imkon qadar past bo'lishini ta'minlashi kerak. Bundan tashqari, kodlash jarayoni izchil va uzluksiz bo'lishi kerak. Ba'zi kodlash kelishuvlari qo'llanilmaydi - masalan, biz kichikroq fayl o'lchamlari va dekodlash vaqtlariga nisbatan uzoq kodlash vaqtini afzal ko'ra olmaymiz yoki mos kelmaydigan siqishni ishlata olmaymiz.

    Videoni siqish g'oyasi foydalanuvchilar uchun maqbul darajadagi aniqlikni saqlab, keraksiz ma'lumotlar bitlarini yo'q qilishdir. Alohida statik tasvir freymlarini kodlashdan tashqari, algoritm oldingi va keyingilaridan joriy kadrni chiqaradi, shuning uchun faqat ularning farqi yuboriladi. Pacman bilan misoldan ko'rinib turibdiki, faqat differentsial nuqtalar uzatiladi.

    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    Misol sifatida Pacman yordamida video ramkalarni taqqoslash

    Ovozni siqish

    Xuddi shunday, ovozni siqish algoritmi odamlar tomonidan idrok eta olmaydigan ma'lumotlarni o'tkazib yuboradi. Opus hozirda eng yaxshi ishlaydigan audio kodek hisoblanadi. U RTP (Real Time Transport Protocol) kabi buyurtma qilingan datagram protokoli orqali audio to'lqinni uzatish uchun mo'ljallangan. Uning kechikishi mp3 va aac dan pastroq va sifati yuqoriroq. Kechikish odatda 5 ~ 66,5 ms atrofida.

    Pion, Golangdagi WebRTC

    Lombard WebRTC ni Golangga olib keladigan ochiq kodli loyihadir. Mahalliy C++ WebRTC kutubxonalarining odatiy oʻrami oʻrniga, Pion WebRTC protokollarida yaxshi ishlashi, Go integratsiyasi va versiya boshqaruviga ega boʻlgan WebRTC ning mahalliy Golang ilovasi hisoblanadi.

    Kutubxona, shuningdek, soniyadan past kechikish bilan juda ko'p ajoyib o'rnatilgan qurilmalar bilan translatsiya qilish imkonini beradi. U o'zining STUN, DTLS, SCTP va boshqalarni amalga oshirishga ega. va QUIC va WebAssembly bilan ba'zi tajribalar. Ushbu ochiq manbali kutubxonaning o'zi ajoyib hujjatlar, tarmoq protokollarini amalga oshirish va ajoyib misollar bilan juda yaxshi o'quv resursidir.

    Juda ishtiyoqli ijodkor boshchiligidagi Pion hamjamiyati juda jonli, WebRTC haqida ko'plab sifatli muhokamalar olib borilmoqda. Agar siz ushbu texnologiyaga qiziqsangiz, qo'shiling http://pion.ly/slack - ko'p yangi narsalarni o'rganasiz.

    Golangda CloudRetro yozish

    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    Go'da ishchini amalga oshirish

    Kanallar harakatda

    Go-ning go'zal kanal dizayni tufayli voqealar oqimi va parallellik muammolari ancha soddalashtirilgan. Diagrammada bo'lgani kabi, turli GoRoutines parallel ravishda ishlaydigan bir nechta komponentlarga ega. Har bir komponent o'z holatini boshqaradi va kanallar orqali aloqa qiladi. Golangning tanlangan tasdiqlanishi o'yinda har safar bitta atom hodisasini qayta ishlashga majbur qiladi (o'yin belgisi). Bu shuni anglatadiki, ushbu dizayn uchun hech qanday qulflash kerak emas. Misol uchun, foydalanuvchi saqlaganida, o'yin holatining to'liq surati talab qilinadi. Saqlash tugaguniga qadar tizimga kirgan holda bu holat uzluksiz qolishi kerak. Har bir o'yin belgisi paytida, backend faqat saqlash yoki kiritish operatsiyasini bajarishi mumkin, bu jarayonni xavfsiz qiladi.

    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

    Ushbu Golang shabloni mening CrowdPlay va Multiple Player foydalanish holatlarimga juda mos keladi. Ushbu sxema bo'yicha, bitta xonadagi barcha foydalanuvchi ma'lumotlari markaziy kirish kanaliga o'rnatiladi. Keyin o'yin mediasi bir xonadagi barcha foydalanuvchilarga tarqatiladi. Shunday qilib, biz o'yin holatini turli foydalanuvchilarning bir nechta o'yin seanslari o'rtasida taqsimlashga erishamiz.

    WebRTC-da ochiq manbali bulutli oʻyinlar: p2p, koʻp oʻyinchi, nol kechikish
    Turli seanslar o'rtasida sinxronizatsiya

    Golangning kamchiliklari

    Golang mukammal emas. Kanal sekin ishlaydi. Bloklash bilan solishtirganda, Go kanali bir vaqtning o'zida va o'zaro bog'liq hodisalarni boshqarishning oddiy usuli hisoblanadi, ammo kanal eng yaxshi ishlashni ta'minlamaydi. Kanal ostida murakkab blokirovka mantig'i mavjud. Shunday qilib, ishlashni optimallashtirish uchun kanallarni almashtirishda qulflar va atom qiymatlarini qayta qo'llash orqali amalga oshirishga ba'zi o'zgarishlar kiritdim.

    Bundan tashqari, Golangdagi axlat yig'uvchi boshqarilmaydi, bu ba'zida shubhali uzoq pauzalarga sabab bo'ladi. Bu real vaqtda oqim ilovasiga katta xalaqit beradi.

    COG

    Loyiha media siqish uchun mavjud ochiq manba Golang VP8/H264 kutubxonasidan va oʻyin emulyatorlari uchun Libretrodan foydalanadi. Bu kutubxonalarning barchasi Go-dan foydalangan holda C kutubxonasining shunchaki o'ramlaridir COG. Ba'zi kamchiliklar ro'yxatda keltirilgan bu Deyv Cheyni tomonidan yozilgan xabar. Men duch kelgan muammolar:

    • CGO-da, hatto Golang RecoveryCrash bilan ham halokatga uchramaslik;
    • CGOda batafsil muammolarni aniqlay olmaganimizda, ishlashdagi qiyinchiliklarni aniqlay olmaslik.

    xulosa

    Men bulutli oʻyin xizmatlarini tushunish va doʻstlarim bilan onlayn nostaljik retro oʻyinlarni oʻynashga yordam beradigan platforma yaratish maqsadimga erishdim. Bu loyiha Pion kutubxonasisiz va Pion hamjamiyatining ko‘magisiz amalga oshirilmas edi. Men uning jadal rivojlanishi uchun juda minnatdorman. WebRTC va Pion tomonidan taqdim etilgan oddiy API-lar uzluksiz integratsiyani ta'minladi. Mening birinchi kontseptsiyam o'sha haftada e'lon qilindi, garchi men peer-to-peer (P2P) aloqasi haqida oldindan ma'lumotga ega bo'lmasam ham.

    Integratsiyaning qulayligiga qaramay, P2P oqimi haqiqatan ham kompyuter fanida juda murakkab sohadir. Peer-to-peer sessiyasini yaratish uchun u IP va NAT kabi uzoq muddatli tarmoq arxitekturalarining murakkabligi bilan shug'ullanishi kerak. Ushbu loyiha ustida ishlayotganda men tarmoq va ishlashni optimallashtirish haqida juda ko'p qimmatli bilimlarga ega bo'ldim, shuning uchun men hammani WebRTC yordamida P2P mahsulotlarini yaratishga harakat qilishni taklif qilaman.

    CloudRetro men retro geymer sifatida men kutgan barcha holatlarga javob beradi. Biroq, menimcha, loyihada men yaxshilashim mumkin bo'lgan ko'plab sohalar mavjud, masalan, tarmoqni yanada ishonchli va samarali qilish, yuqori sifatli o'yin grafikalarini taqdim etish yoki foydalanuvchilar o'rtasida o'yinlarni almashish imkoniyati. Men bu borada qattiq ishlayapman. Iltimos, kuzatib boring loyiha va agar sizga yoqsa qo'llab-quvvatlang.

Manba: www.habr.com

a Izoh qo'shish