{"id":89303,"date":"2020-07-22T01:42:30","date_gmt":"2020-07-21T23:42:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency"},"modified":"2020-07-22T01:42:30","modified_gmt":"2020-07-21T23:42:30","slug":"oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","title":{"rendered":"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/Voximplant\/blog\/511626\/\"><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/22dbf7665d7fded15671d98a2afe599b.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\nSzolg\u00e1ltat\u00e1sk\u00e9nt megval\u00f3s\u00edtott ESET, infrastrukt\u00fara mint szolg\u00e1ltat\u00e1s, platform mint szolg\u00e1ltat\u00e1s, kommunik\u00e1ci\u00f3s platform mint szolg\u00e1ltat\u00e1s, videokonferenci\u00e1k mint szolg\u00e1ltat\u00e1s, mi a helyzet a felh\u0151 alap\u00fa j\u00e1t\u00e9kokkal mint szolg\u00e1ltat\u00e1ssal? M\u00e1r sz\u00e1mos k\u00eds\u00e9rlet t\u00f6rt\u00e9nt a felh\u0151alap\u00fa j\u00e1t\u00e9kok (Cloud Gaming) l\u00e9trehoz\u00e1s\u00e1ra, p\u00e9ld\u00e1ul a Stadia, amelyet a Google ind\u00edtott el nemr\u00e9giben. Stadia <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/avtlQeaxd_I?t=440\">nem \u00fajdons\u00e1g a WebRTC vil\u00e1g\u00e1ban<\/a><\/noindex>, de tudj\u00e1k-e m\u00e1sok is haszn\u00e1lni a WebRTC-t ugyan\u00fagy?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Thanh Nguyen \u00fagy d\u00f6nt\u00f6tt, hogy ellen\u0151rzi ezt a lehet\u0151s\u00e9get az open-source CloudRetro projektj\u00e9vel. A CloudRetro a Pion-ra \u00e9p\u00fcl, <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/webrtc-open-source-most-popular\/\">n\u00e9pszer\u0171<\/a><\/noindex> Go alap\u00fa WebRTC k\u00f6nyvt\u00e1r (k\u00f6sz\u00f6nj\u00fck <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Sean-Der\">Shonnak<\/a><\/noindex> a Pion fejleszt\u0151csapat\u00e1b\u00f3l a cikk el\u0151k\u00e9sz\u00edt\u00e9s\u00e9ben ny\u00fajtott seg\u00edts\u00e9g\u00e9rt). Ebben a cikkben Thanh \u00e1ttekinti projektje architekt\u00far\u00e1j\u00e1t, valamint elmondja, hogy mit tanult \u00e9s milyen kih\u00edv\u00e1sokkal tal\u00e1lkozott a munka sor\u00e1n.<\/p>\n<h2>Bevezet\u00e9s<\/h2>\n<p>\nTavaly, amikor a Google bejelentette a Stadi\u00e1t, egyszer\u0171en leny\u0171g\u00f6z\u00f6tt. Az \u00f6tlet olyan egyedi \u00e9s innovat\u00edv, hogy folyamatosan azon t\u0171n\u0151dtem, hogyan lehets\u00e9ges ez a megl\u00e9v\u0151 technol\u00f3gi\u00e1k mellett. Az, hogy jobban meg\u00e9rtsem ezt a t\u00e9m\u00e1t, arra \u00f6szt\u00f6k\u00e9lt, hogy l\u00e9trehozzam a saj\u00e1t open-source felh\u0151s j\u00e1t\u00e9komat. Az eredm\u00e9ny egyszer\u0171en fantasztikus volt. Az al\u00e1bbiakban szeretn\u00e9m megosztani a munk\u00e1m folyamat\u00e1t a h\u00e1rom \u00e9ves <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">projekt<\/a><\/noindex>.<\/p>\n<p><i>TLDR: r\u00f6vid diak\u00e9pes verzi\u00f3 a f\u0151bb pontokkal<\/i><\/p>\n<h3>Mi\u00e9rt van a felh\u0151alap\u00fa j\u00e1t\u00e9koknak j\u00f6v\u0151je<\/h3>\n<p>\nHiszem, hogy a Cloud Gaming hamarosan az \u00faj gener\u00e1ci\u00f3t k\u00e9pviseli nemcsak a j\u00e1t\u00e9kokban, hanem m\u00e1s informatikai ter\u00fcleteken is. A felh\u0151alap\u00fa j\u00e1t\u00e9kok a kliens\/szerver modell cs\u00facsa. Ez a modell maximaliz\u00e1lja a h\u00e1tt\u00e9rkezel\u00e9st \u00e9s minimaliz\u00e1lja a frontend munk\u00e1j\u00e1t azzal, hogy a j\u00e1t\u00e9klogik\u00e1t t\u00e1voli szerveren helyezi el, mik\u00f6zben k\u00e9pek\/audio streamel\u00e9s\u00e9t biztos\u00edtja a kliens fel\u00e9. A szerver v\u00e9gzi a neh\u00e9z feldolgoz\u00e1st, \u00edgy a kliens m\u00e1r nem f\u00fcgg a hardver korl\u00e1tait\u00f3l.<\/p>\n<p>A Google Stadia l\u00e9nyeg\u00e9ben lehet\u0151v\u00e9 teszi AAA-j\u00e1t\u00e9kok <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/AAA_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B)\">(azaz pr\u00e9mium, blokbusterek k\u00f6z\u00e9 sorolt j\u00e1t\u00e9kok) j\u00e1tsz\u00e1s\u00e1t a YouTube-szer\u0171 fel\u00fcleten. Ugyanazt a metodol\u00f3gi\u00e1t m\u00e1s neh\u00e9z offline alkalmaz\u00e1sokra is lehet alkalmazni, mint p\u00e9ld\u00e1ul egy oper\u00e1ci\u00f3s rendszer vagy 2D\/3D grafikai tervez\u00e9s, stb., hogy stabilan futtathassuk \u0151ket alacsony teljes\u00edtm\u00e9ny\u0171 eszk\u00f6z\u00f6k\u00f6n k\u00fcl\u00f6nb\u00f6z\u0151 platformokon.<\/a><\/noindex> Ennek a technol\u00f3gi\u00e1nak a j\u00f6v\u0151je: k\u00e9pzelje el, hogy a Microsoft Windows 10 b\u00f6ng\u00e9sz\u0151ben futna, mint a Chrome?<\/p>\n<p><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/d6ca3e47db5c8e3d9880b304cc3be33b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA felh\u0151alap\u00fa j\u00e1t\u00e9kok technikailag bonyolultak.<\/p>\n<h3>A felh\u0151 alap\u00fa j\u00e1t\u00e9kok technikailag bonyolultak<\/h3>\n<p>\nA j\u00e1t\u00e9kz\u00e1s az egyik ritka ter\u00fclet, ahol a felhaszn\u00e1l\u00f3 folyamatos gyors reakci\u00f3ja sz\u00fcks\u00e9ges. Ha ritk\u00e1n tal\u00e1lkozunk 2 m\u00e1sodperces k\u00e9s\u00e9ssel a weboldalon, az elfogadhat\u00f3. Az \u00e9l\u0151 videostreaming \u00e1ltal\u00e1ban n\u00e9h\u00e1ny m\u00e1sodperces lemarad\u00e1ssal m\u0171k\u00f6dik, de m\u00e9g mindig megfelel\u0151 k\u00e9nyelmet biztos\u00edt. Azonban ha a j\u00e1t\u00e9k gyakran 500 ms-os k\u00e9sleltet\u00e9st tapasztal, m\u00e1r lehetetlenn\u00e9 v\u00e1lik a j\u00e1t\u00e9k. C\u00e9lunk az extr\u00e9m alacsony k\u00e9s\u00e9s el\u00e9r\u00e9se, hogy a bemenet \u00e9s a m\u00e9dia k\u00f6z\u00f6tti szakad\u00e9k a lehet\u0151 legkisebb legyen. Ez\u00e9rt a hagyom\u00e1nyos video streaming megk\u00f6zel\u00edt\u00e9sek itt nem alkalmazhat\u00f3k.<\/p>\n<p><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/d73765a3c9277c026f407883e1091473.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c1tfog\u00f3 sablon a felh\u0151s j\u00e1t\u00e9khoz<\/p>\n<h2>Ny\u00edlt forr\u00e1sk\u00f3d\u00fa CloudRetro projekt<\/h2>\n<p>\n\u00dagy d\u00f6nt\u00f6ttem, hogy l\u00e9trehozok egy tesztp\u00e9ld\u00e1nyt a felh\u0151s j\u00e1t\u00e9khoz, hogy ellen\u0151rizzem, hogy mindez lehets\u00e9ges-e ilyen szigor\u00fa h\u00e1l\u00f3zati korl\u00e1tok mellett. A koncepci\u00f3 tesztel\u00e9s\u00e9hez a Golang-ot v\u00e1lasztottam, mivel ez a sz\u00e1momra legjobban ismert nyelv, \u00e9s sok m\u00e1s okb\u00f3l is j\u00f3l illik ehhez a megval\u00f3s\u00edt\u00e1shoz, ahogy k\u00e9s\u0151bb kider\u00fclt. A Go egyszer\u0171 \u00e9s nagyon gyorsan fejl\u0151dik; a Go csatorn\u00e1k t\u00f6k\u00e9letesen alkalmasak a p\u00e1rhuzamoss\u00e1g kezel\u00e9s\u00e9re.<\/p>\n<p>Projekt <noindex><a rel=\"nofollow\" href=\"http:\/\/cloudretro.io\/\">CloudRetro.io<\/a><\/noindex> \u2013 ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kszolg\u00e1ltat\u00e1s retro j\u00e1t\u00e9kokhoz. A projekt c\u00e9lja, hogy a hagyom\u00e1nyos retro j\u00e1t\u00e9kokba a lehet\u0151 legk\u00e9nyelmesebb j\u00e1t\u00e9k\u00e9lm\u00e9nyt hozza, \u00e9s multiplayer lehet\u0151s\u00e9geket adjon hozz\u00e1.<br \/>\nA projektr\u0151l r\u00e9szletesen itt t\u00e1j\u00e9koz\u00f3dhat: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">https:\/\/github.com\/giongto35\/cloud-game<\/a><\/noindex>.<\/p>\n<h3>CloudRetro funkcionalit\u00e1s<\/h3>\n<p>\nA CloudRetro bemutat\u00e1s\u00e1hoz a retro j\u00e1t\u00e9kok mutatj\u00e1k be a felh\u0151s j\u00e1t\u00e9kok teljes erej\u00e9t. Ez sz\u00e1mos egyedi j\u00e1t\u00e9k\u00e9lm\u00e9nyt eredm\u00e9nyez.<\/p>\n<ul>\n<li>A j\u00e1t\u00e9k hordozhat\u00f3s\u00e1ga\n<ul>\n<li>Azonnali lej\u00e1tsz\u00e1s az oldal megnyit\u00e1sakor; let\u00f6lt\u00e9s \u00e9s telep\u00edt\u00e9s nem sz\u00fcks\u00e9ges<\/li>\n<li>Mobil b\u00f6ng\u00e9sz\u0151ben m\u0171k\u00f6dik, \u00edgy nincs sz\u00fcks\u00e9g szoftver telep\u00edt\u00e9s\u00e9re a futtat\u00e1shoz<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>A j\u00e1t\u00e9k \u00fcl\u00e9s\u00e9t t\u00f6bb eszk\u00f6z\u00f6n megoszthatja, \u00e9s felh\u0151ben t\u00e1rolhatja a k\u00f6vetkez\u0151 bejelentkez\u00e9shez<\/li>\n<li>A j\u00e1t\u00e9kot streamelheti, vagy t\u00f6bb felhaszn\u00e1l\u00f3 egyszerre j\u00e1tszhat benne:\n<ul>\n<li>Crowdplay t\u00edpus\u00fa TwitchPlayPokemon, csak t\u00f6bb platformon \u00e9s val\u00f3s idej\u0171bb<\/li>\n<li>Offline j\u00e1t\u00e9k az online t\u00e9rben. Sok felhaszn\u00e1l\u00f3 j\u00e1tszhat an\u00e9lk\u00fcl, hogy a h\u00e1l\u00f3zatot be kellene \u00e1ll\u00edtani. A Samurai Shodown most m\u00e1r 2 j\u00e1t\u00e9kos \u00e1ltal j\u00e1tszhat\u00f3 a CloudRetro h\u00e1l\u00f3zat\u00e1n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/bdc715971755d669a026f830ce888520.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDem\u00f3 verzi\u00f3 a t\u00f6bbj\u00e1t\u00e9kos online j\u00e1t\u00e9khoz k\u00fcl\u00f6nb\u00f6z\u0151 eszk\u00f6z\u00f6k\u00f6n<\/p>\n<h2>Infrastrukt\u00fara<\/h2>\n<p><\/p>\n<h3>K\u00f6vetelm\u00e9nyek \u00e9s technol\u00f3giai stack<\/h3>\n<p>\nAz al\u00e1bbiakban tal\u00e1lhat\u00f3 a k\u00f6vetelm\u00e9nyek list\u00e1ja, amelyeket a projekt megkezd\u00e9se el\u0151tt \u00e1ll\u00edtottam fel.<\/p>\n<p><b>1. Egy j\u00e1t\u00e9kos<\/b><br \/>\nEz a k\u00f6vetelm\u00e9ny tal\u00e1n nem t\u0171nik t\u00fal fontosnak \u00e9s nyilv\u00e1nval\u00f3nak itt, de ez az egyik kulcsfontoss\u00e1g\u00fa meg\u00e1llap\u00edt\u00e1som, hogy a felh\u0151alap\u00fa j\u00e1t\u00e9kok min\u00e9l t\u00e1volabb tarthass\u00e1k magukat a hagyom\u00e1nyos streaming szolg\u00e1ltat\u00e1sokt\u00f3l. Ha a single-player j\u00e1t\u00e9kra \u00f6sszpontos\u00edtunk, megszabadulhatunk a k\u00f6zpontos\u00edtott szervert\u0151l vagy CDN-t\u0151l, mert nincs sz\u00fcks\u00e9g\u00fcnk arra, hogy t\u00f6megesen streamelj\u00fcnk. Ahelyett, hogy folyamokat t\u00f6lten\u00e9nk fel egy ig\u00e9nybe vev\u0151 szerverre vagy csomagokat k\u00fclden\u00e9nk egy k\u00f6zpontos\u00edtott WebSocket szerverre, a szolg\u00e1ltat\u00f3i folyamok k\u00f6zvetlen\u00fcl a felhaszn\u00e1l\u00f3hoz jutnak el egy peer-to-peer WebRTC kapcsolaton kereszt\u00fcl.<\/p>\n<p><b>2. Alacsony k\u00e9sleltet\u00e9s\u0171 m\u00e9diastream<\/b><br \/>\nMik\u00f6zben a Stadi\u00e1r\u00f3l olvastam, gyakran tal\u00e1lkozom a WebRTC eml\u00edt\u00e9s\u00e9vel egyes cikkekben. Meg\u00e9rtettem, hogy a WebRTC egy kiemelked\u0151 technol\u00f3gia, \u00e9s t\u00f6k\u00e9letesen alkalmas a felh\u0151alap\u00fa j\u00e1t\u00e9kokhoz. A WebRTC egy projekt, amely val\u00f3s idej\u0171 kommunik\u00e1ci\u00f3t biztos\u00edt a web b\u00f6ng\u00e9sz\u0151k \u00e9s mobil alkalmaz\u00e1sok sz\u00e1m\u00e1ra, egy egyszer\u0171 API-n kereszt\u00fcl. Ez egy peer-to-peer kapcsolatot biztos\u00edt, amely optimaliz\u00e1lt a m\u00e9di\u00e1hoz \u00e9s be\u00e9p\u00edtett szabv\u00e1nyos kodekekkel rendelkezik, mint p\u00e9ld\u00e1ul VP8 \u00e9s H264.<\/p>\n<p>\u00c9n a felhaszn\u00e1l\u00f3k maxim\u00e1lis k\u00e9nyelm\u00e9nek biztos\u00edt\u00e1s\u00e1t r\u00e9szes\u00edtettem el\u0151nyben, nem pedig a grafika magas sz\u00ednvonal\u00e1nak meg\u0151rz\u00e9s\u00e9t. Az algoritmusban megengedettek bizonyos vesztes\u00e9gek. A Google Stadi\u00e1n\u00e1l van egy plusz l\u00e9p\u00e9s a k\u00e9p m\u00e9ret\u00e9nek cs\u00f6kkent\u00e9s\u00e9re a szerveren, \u00edgy a k\u00e9pkock\u00e1k magasabb min\u0151s\u00e9gre sk\u00e1l\u00e1z\u00f3dnak a peer-to-peer csom\u00f3pontokhoz val\u00f3 tov\u00e1bb\u00edt\u00e1s el\u0151tt.<\/p>\n<p><b>3. F\u00f6ldrajzi ir\u00e1ny\u00edt\u00e1ssal rendelkez\u0151 elosztott infrastrukt\u00fara<\/b><br \/>\nF\u00fcggetlen\u00fcl att\u00f3l, hogy mennyire van optimaliz\u00e1lva a t\u00f6m\u00f6r\u00edt\u00e9si algoritmus \u00e9s a k\u00f3d, a h\u00e1l\u00f3zat tov\u00e1bbra is d\u00f6nt\u0151 t\u00e9nyez\u0151, amely legink\u00e1bb hozz\u00e1j\u00e1rul a k\u00e9sleltet\u00e9shez. Az architekt\u00far\u00e1nak rendelkeznie kell egy mechanizmussal, amely illeszti a felhaszn\u00e1l\u00f3hoz legk\u00f6zelebbi szervert a k\u00e9sleltet\u00e9si id\u0151 (RTT) cs\u00f6kkent\u00e9s\u00e9re. Az architekt\u00far\u00e1nak 1 koordin\u00e1torral \u00e9s t\u00f6bb streaming szerverrel kell rendelkeznie, amelyek szerte a vil\u00e1gban helyezkednek el: Nyugat-Egyes\u00fclt \u00c1llamok, Kelet-Egyes\u00fclt \u00c1llamok, Eur\u00f3pa, Szingap\u00far, K\u00edna. Minden streaming szervernek teljesen izol\u00e1ltnak kell lennie. A rendszer k\u00e9pes kezelni a terjeszt\u00e9s\u00e9t, amikor a szerver csatlakozik a h\u00e1l\u00f3zathoz vagy kil\u00e9p bel\u0151le. \u00cdgy nagy forgalom eset\u00e9n tov\u00e1bbi szerverek hozz\u00e1ad\u00e1sa lehet\u0151v\u00e9 teszi a v\u00edzszintes sk\u00e1l\u00e1z\u00e1st.<\/p>\n<p><b>4. B\u00f6ng\u00e9sz\u0151kompatibilit\u00e1s<\/b><br \/>\nA felh\u0151alap\u00fa j\u00e1t\u00e9kok legjobban akkor teljes\u00edtenek, ha a felhaszn\u00e1l\u00f3kt\u00f3l a lehet\u0151 legkevesebb er\u0151forr\u00e1st ig\u00e9nyelnek. Ez azt jelenti, hogy lehet\u0151s\u00e9g van a j\u00e1t\u00e9kok b\u00f6ng\u00e9sz\u0151ben val\u00f3 ind\u00edt\u00e1s\u00e1ra. A b\u00f6ng\u00e9sz\u0151k seg\u00edtenek a j\u00e1t\u00e9k\u00e9lm\u00e9ny maxim\u00e1lis k\u00e9nyelm\u00e9nek biztos\u00edt\u00e1s\u00e1ban, elt\u00fcntetve a sz\u00fcks\u00e9gess\u00e9get programok \u00e9s hardverek telep\u00edt\u00e9s\u00e9re. A b\u00f6ng\u00e9sz\u0151k a mobil \u00e9s asztali verzi\u00f3k k\u00f6z\u00f6tti platformf\u00fcggetlens\u00e9get is seg\u00edtik. Szerencs\u00e9re a WebRTC j\u00f3l t\u00e1mogatott a k\u00fcl\u00f6nb\u00f6z\u0151 b\u00f6ng\u00e9sz\u0151kben.<\/p>\n<p><b>5. A j\u00e1t\u00e9knak \u00e9s a szolg\u00e1ltat\u00e1snak a j\u00f3l elk\u00fcl\u00f6n\u00edtett interf\u00e9sze<\/b><br \/>\nA felh\u0151alap\u00fa j\u00e1t\u00e9kokat platformk\u00e9nt tekintek. Mindenki sz\u00e1m\u00e1ra lehet\u0151s\u00e9get kell biztos\u00edtani a platformhoz val\u00f3 csatlakoz\u00e1sra. Jelenleg integr\u00e1ltam <noindex><a rel=\"nofollow\" href=\"http:\/\/LibRetro\">LibRetro<\/a><\/noindex> a felh\u0151alap\u00fa j\u00e1t\u00e9k szolg\u00e1ltat\u00e1ssal, mert a LibRetro sz\u00e9p emul\u00e1tor fel\u00fcletet k\u00edn\u00e1l retro j\u00e1t\u00e9kokhoz, p\u00e9ld\u00e1ul SNES, GBA, PS.<\/p>\n<p><b>6. Multiplayer szob\u00e1k, crowd play \u00e9s k\u00fcls\u0151 deep-linkel\u00e9s a j\u00e1t\u00e9khoz<\/b><br \/>\nA CloudRetro sz\u00e1mos \u00faj j\u00e1t\u00e9kform\u00e1tumot t\u00e1mogat, mint p\u00e9ld\u00e1ul a CrowdPlay \u00e9s az Online MultiPlayer retro j\u00e1t\u00e9kokhoz. Ha t\u00f6bb felhaszn\u00e1l\u00f3 ugyanazt a deep-linket nyitja meg k\u00fcl\u00f6nb\u00f6z\u0151 sz\u00e1m\u00edt\u00f3g\u00e9peken, ugyanazt a j\u00e1t\u00e9kot fogj\u00e1k l\u00e1tni, \u00e9s ak\u00e1r csatlakozhatnak is hozz\u00e1.<\/p>\n<p>Tov\u00e1bb\u00e1, a j\u00e1t\u00e9k\u00e1llapotokat a felh\u0151ben t\u00e1rolj\u00e1k. Ez lehet\u0151v\u00e9 teszi a felhaszn\u00e1l\u00f3k sz\u00e1m\u00e1ra, hogy b\u00e1rmikor b\u00e1rmilyen m\u00e1s eszk\u00f6zr\u0151l folytathass\u00e1k a j\u00e1t\u00e9kot.<\/p>\n<p><b>7. Horizont\u00e1lis sk\u00e1l\u00e1zhat\u00f3s\u00e1g<\/b><br \/>\nMint minden SAAS eset\u00e9ben, a felh\u0151alap\u00fa j\u00e1t\u00e9kokat is \u00fagy kell tervezni, hogy horizont\u00e1lisan sk\u00e1l\u00e1zhat\u00f3ak legyenek. A 'koordin\u00e1tor-munk\u00e1s' fel\u00e9p\u00edt\u00e9s lehet\u0151v\u00e9 teszi, hogy tov\u00e1bbi munk\u00e1sokat adjunk hozz\u00e1 a nagyobb forgalom kiszolg\u00e1l\u00e1s\u00e1hoz.<\/p>\n<p><b>8. Nincs k\u00f6t\u0151d\u00e9s egyetlen felh\u0151szolg\u00e1ltat\u00f3hoz sem<\/b><br \/>\nA CloudRetro infrastrukt\u00far\u00e1ja k\u00fcl\u00f6nb\u00f6z\u0151 felh\u0151szolg\u00e1ltat\u00f3kn\u00e1l (Digital Ocean, Alibaba, egyedi szolg\u00e1ltat\u00f3) tal\u00e1lhat\u00f3 a k\u00fcl\u00f6nb\u00f6z\u0151 r\u00e9gi\u00f3k sz\u00e1m\u00e1ra. A Docker kont\u00e9nerben val\u00f3 ind\u00edt\u00e1st aktiv\u00e1lom az infrastrukt\u00far\u00e1ra, \u00e9s bash-szkripttel \u00e1ll\u00edtom be a h\u00e1l\u00f3zati param\u00e9tereket, hogy elker\u00fcljem az egyetlen felh\u0151szolg\u00e1ltat\u00f3t\u00f3l val\u00f3 f\u00fcgg\u0151s\u00e9get. Ezt a NAT Traversal-nal a WebRTC-ben kombin\u00e1lva rugalmass\u00e1got nyer\u00fcnk a CloudRetro b\u00e1rmely felh\u0151platformra val\u00f3 telep\u00edt\u00e9s\u00e9hez, s\u0151t b\u00e1rmely felhaszn\u00e1l\u00f3 g\u00e9p\u00e9n is.<\/p>\n<h3>Architektur\u00e1lis tervez\u00e9s<\/h3>\n<p>\n<b>Munk\u00e1s:<\/b> (vagy a fent eml\u00edtett stream szerver) megszorozza a j\u00e1t\u00e9kokat, elind\u00edtja a k\u00f3dol\u00f3 cs\u0151vezet\u00e9ket, \u00e9s tov\u00e1bb\u00edtja a k\u00f3dolt m\u00e9di\u00e1t a felhaszn\u00e1l\u00f3knak. A worker p\u00e9ld\u00e1nyok vil\u00e1gszerte eloszlanak, \u00e9s minden worker t\u00f6bb felhaszn\u00e1l\u00f3i munkamenetet is kezelhet egyszerre.<\/p>\n<p><b>Koordin\u00e1tor:<\/b> feladata, hogy \u00faj felhaszn\u00e1l\u00f3t \u00f6sszep\u00e1ros\u00edtson a legmegfelel\u0151bb workerrel a streaminghez. A koordin\u00e1tor WebSocketen kereszt\u00fcl kommunik\u00e1l a workerekkel.<\/p>\n<p><b>J\u00e1t\u00e9k\u00e1llapot-t\u00e1rol\u00f3:<\/b> k\u00f6zponti t\u00e1voli t\u00e1rol\u00f3 minden j\u00e1t\u00e9k\u00e1llapot sz\u00e1m\u00e1ra. Ez a t\u00e1rol\u00f3 fontos funkci\u00f3kat biztos\u00edt, mint p\u00e9ld\u00e1ul a t\u00e1voli ment\u00e9s\/let\u00f6lt\u00e9s.<\/p>\n<p><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/985447b81350a640b0bd1344b5705113.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCloudRetro fels\u0151 szint\u0171 architekt\u00far\u00e1ja<\/p>\n<h3>Felhaszn\u00e1l\u00f3i forgat\u00f3k\u00f6nyv<\/h3>\n<p>\nAmikor egy \u00faj felhaszn\u00e1l\u00f3 megnyitja a CloudRetro-t az al\u00e1bbi 1. \u00e9s 2. l\u00e9p\u00e9sben, a koordin\u00e1tor a rendelkez\u00e9sre \u00e1ll\u00f3 workerek list\u00e1j\u00e1val a kezd\u0151oldalon k\u00e9rd\u00e9st kap. Ezut\u00e1n a 3. l\u00e9p\u00e9sben az \u00fcgyf\u00e9l HTTP ping k\u00e9r\u00e9s seg\u00edts\u00e9g\u00e9vel kisz\u00e1m\u00edtja a k\u00e9sleltet\u00e9seket minden jel\u00f6lt eset\u00e9ben. Ez a k\u00e9sleltet\u00e9si lista ezut\u00e1n vissza ker\u00fcl a koordin\u00e1torhoz, hogy meghat\u00e1rozhassa a legmegfelel\u0151bb worker-t a felhaszn\u00e1l\u00f3 kiszolg\u00e1l\u00e1s\u00e1ra. Az al\u00e1bbi 4. l\u00e9p\u00e9sben l\u00e9trej\u00f6n a j\u00e1t\u00e9k. A felhaszn\u00e1l\u00f3 \u00e9s a kijel\u00f6lt worker k\u00f6z\u00f6tt WebRTC streaming kapcsolat \u00e1ll fel.<br \/>\n<img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/00199b5942e3e4314609ec0e70ea7162.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFelhaszn\u00e1l\u00f3i forgat\u00f3k\u00f6nyv hozz\u00e1f\u00e9r\u00e9s ut\u00e1n<\/p>\n<h3>Mi van a workerben<\/h3>\n<p>\nA j\u00e1t\u00e9k- \u00e9s streamingcs\u0151vezet\u00e9sek elszigetelten t\u00e1rol\u00f3dnak a workerben, \u00e9s ott inform\u00e1ci\u00f3t cser\u00e9lnek az interf\u00e9szen kereszt\u00fcl. Jelenleg a kapcsolat az adatok mem\u00f3ri\u00e1ban val\u00f3 \u00e1tad\u00e1s\u00e1val t\u00f6rt\u00e9nik a <noindex><a rel=\"nofollow\" href=\"https:\/\/tour.golang.org\/concurrency\/2\">Golang csatorn\u00e1kban<\/a><\/noindex> ugyanabban a folyamatban. A k\u00f6vetkez\u0151 c\u00e9l a szegment\u00e1l\u00e1s, azaz a j\u00e1t\u00e9k f\u00fcggetlen elind\u00edt\u00e1sa egy m\u00e1sik folyamatban.<\/p>\n<p><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/7a90ec2638344467a34604cd4322165c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA worker komponenseinek k\u00f6lcs\u00f6nhat\u00e1sa<\/p>\n<p>F\u0151 alkot\u00f3elemek:<\/p>\n<ul>\n<li><b>WebRTC:<\/b> \u00fcgyf\u00e9lkomponens, amely fogadja a felhaszn\u00e1l\u00f3i bemenetet \u00e9s a k\u00f3dolt m\u00e9di\u00e1t tov\u00e1bb\u00edtja a szerverr\u0151l.\n<\/li>\n<li><b>J\u00e1t\u00e9kemul\u00e1tor:<\/b> j\u00e1t\u00e9k komponens. A Libretro k\u00f6nyvt\u00e1rnak k\u00f6sz\u00f6nhet\u0151en a rendszer k\u00e9pes j\u00e1t\u00e9kot ind\u00edtani ugyanabban a folyamatban, \u00e9s bels\u0151leg elfogni a m\u00e9dia- \u00e9s bemeneti folyamot.\n<\/li>\n<li>A j\u00e1t\u00e9kon bel\u00fcli k\u00e9pkock\u00e1k r\u00f6gz\u00edtve lesznek \u00e9s elk\u00fcldve a k\u00f3dol\u00f3nak.\n<\/li>\n<li><b>K\u00e9p\/audio k\u00f3dol\u00f3:<\/b> k\u00f3dol\u00f3 cs\u0151vezet\u00e9k, amely a m\u00e9dia k\u00e9pkock\u00e1kat fogadja, k\u00f3dolja \u0151ket a h\u00e1tt\u00e9rben, \u00e9s k\u00f3dolt k\u00e9peket\/audio-t \u00e1ll\u00edt el\u0151.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Megval\u00f3s\u00edt\u00e1s<\/h2>\n<p>\nA CloudRetro a WebRTC-t v\u00e1lasztotta alaptechnol\u00f3gi\u00e1j\u00e1nak, ez\u00e9rt miel\u0151tt m\u00e9lyebben belemer\u00fcln\u00e9k a Golangban val\u00f3 megval\u00f3s\u00edt\u00e1s r\u00e9szleteibe, szeretn\u00e9m bemutatni mag\u00e1t a WebRTC-t. Ez egy csod\u00e1latos technol\u00f3gia, amely jelent\u0151sen seg\u00edtett nekem abban, hogy csak egy tizedm\u00e1sodperces k\u00e9sleltet\u00e9st \u00e9rjek el az adatok streamel\u00e9s\u00e9ben.<\/p>\n<h3>WebRTC<\/h3>\n<p>\nA WebRTC c\u00e9lja a kiv\u00e1l\u00f3 min\u0151s\u00e9g\u0171, peer-to-peer kapcsolatok biztos\u00edt\u00e1sa nat\u00edv mobilalkalmaz\u00e1sok \u00e9s b\u00f6ng\u00e9sz\u0151k sz\u00e1m\u00e1ra egyszer\u0171 API-kon kereszt\u00fcl.<\/p>\n<h4>NAT Traversal <\/h4>\n<p>\nA WebRTC ismert a NAT Traversal funkci\u00f3j\u00e1r\u00f3l. A WebRTC c\u00e9lja a peer-to-peer kommunik\u00e1ci\u00f3. C\u00e9lja, hogy megtal\u00e1lja a legmegfelel\u0151bb k\u00f6zvetlen \u00fatvonalat a NAT \u00e1tj\u00e1r\u00f3k \u00e9s t\u0171zfalak elker\u00fcl\u00e9s\u00e9vel a peer-to-peer kapcsolat megval\u00f3s\u00edt\u00e1sa \u00e9rdek\u00e9ben, egy folyamat sor\u00e1n, amelyet <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/trickle-ice\/\">ICE<\/a><\/noindex>. Ebben a folyamatban a WebRTC API-k a STUN szervereken kereszt\u00fcl megtal\u00e1lj\u00e1k a nyilv\u00e1nos IP-c\u00edmedet, \u00e9s azt tov\u00e1bb\u00edtj\u00e1k egy rel\u00e9 szerverre (<noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/?s=turn\">Ide\u00e1lisan olyan h\u00e1l\u00f3zati API-t szeretn\u00e9nk l\u00e9trehozni, amely bels\u0151leg WebRTC-t haszn\u00e1l, de a lehet\u0151 legjobban hasonl\u00edt az UDP Sockets interf\u00e9sz\u00e9hez, amely nem ig\u00e9nyel kapcsolatot.<\/a><\/noindex>), amikor a k\u00f6zvetlen kapcsolat nem hozhat\u00f3 l\u00e9tre.<\/p>\n<p>A CloudRetro azonban nem haszn\u00e1lja ki teljes m\u00e9rt\u00e9kben ezt a lehet\u0151s\u00e9get. A peer-to-peer kapcsolatai nem a felhaszn\u00e1l\u00f3k k\u00f6z\u00f6tt, hanem a felhaszn\u00e1l\u00f3k \u00e9s a felh\u0151s szerverek k\u00f6z\u00f6tt l\u00e9teznek. A szerver oldali modellnek kevesebb korl\u00e1toz\u00e1sa van a k\u00f6zvetlen kapcsolatra, mint a hagyom\u00e1nyos felhaszn\u00e1l\u00f3i eszk\u00f6z\u00f6knek. Ez lehet\u0151v\u00e9 teszi a bej\u00f6v\u0151 portok el\u0151nyit\u00e1s\u00e1t vagy a nyilv\u00e1nos IP-c\u00edmek k\u00f6zvetlen haszn\u00e1lat\u00e1t, mivel a szerver nem NAT m\u00f6g\u00f6tt tal\u00e1lhat\u00f3.<\/p>\n<p>Kor\u00e1bban azt akartam, hogy a projektet a Cloud Gaming j\u00e1t\u00e9kainak terjeszt\u0151 platformj\u00e1v\u00e1 alak\u00edtsam. Az \u00f6tlet az volt, hogy a j\u00e1t\u00e9kfejleszt\u0151k lehet\u0151s\u00e9get kapjanak a j\u00e1t\u00e9kok \u00e9s streamelt forr\u00e1sok biztos\u00edt\u00e1s\u00e1ra. A felhaszn\u00e1l\u00f3k pedig k\u00f6zvetlen\u00fcl l\u00e9ptek kapcsolatba a szolg\u00e1ltat\u00f3kkal. Ebben a decentraliz\u00e1lt form\u00e1ban a CloudRetro csup\u00e1n k\u00f6zeget jelent a k\u00fcls\u0151 streamelt forr\u00e1sok felhaszn\u00e1l\u00f3khoz val\u00f3 csatlakoztat\u00e1s\u00e1hoz, ez\u00e1ltal a m\u00e9retezhet\u0151s\u00e9ge is n\u0151, amikor m\u00e1r nem terheli a hosting. A WebRTC NAT Traversal szerepe itt nagyon fontos a peer-to-peer kapcsolat inicializ\u00e1l\u00e1s\u00e1nak megk\u00f6nny\u00edt\u00e9s\u00e9ben k\u00fcls\u0151 streamelt forr\u00e1sokon, ami egyszer\u0171s\u00edti a fejleszt\u0151 \u00e9s a h\u00e1l\u00f3zat \u00f6sszekapcsol\u00e1s\u00e1t.<\/p>\n<h4>Vide\u00f3 t\u00f6m\u00f6r\u00edt\u00e9s<\/h4>\n<p>\nA vide\u00f3k t\u00f6m\u00f6r\u00edt\u00e9se elengedhetetlen r\u00e9sze a folyamatnak, ami nagym\u00e9rt\u00e9kben hozz\u00e1j\u00e1rul a folyamat z\u00f6kken\u0151mentess\u00e9g\u00e9hez. B\u00e1r nem sz\u00fcks\u00e9ges ismerni a VP8\/H264 vide\u00f3dolgoz\u00e1s r\u00e9szleteit, a koncepci\u00f3 meg\u00e9rt\u00e9se seg\u00edt eligibiliz\u00e1lni a streaming vide\u00f3 sebess\u00e9gi param\u00e9tereit, \u00e9s finomhangolni a v\u00e1ratlan viselked\u00e9st valamint a k\u00e9sleltet\u00e9st.<\/p>\n<p>A vide\u00f3k t\u00f6m\u00f6r\u00edt\u00e9se a streamel\u00e9si szolg\u00e1ltat\u00e1sok sz\u00e1m\u00e1ra \u00f6sszetett feladat, mivel az algoritmusnak biztos\u00edtania kell, hogy a teljes k\u00f3dol\u00e1si id\u0151 + a h\u00e1l\u00f3zati \u00e1tvitel ideje + a dek\u00f3dol\u00e1si id\u0151 a lehet\u0151 legkisebb legyen. Ezenk\u00edv\u00fcl a k\u00f3dol\u00e1si folyamatnak k\u00f6vetkezetesnek \u00e9s folytonosnak kell lennie. Egyes k\u00f6lcs\u00f6n\u00f6s engedm\u00e9nyek a k\u00f3dol\u00e1s sor\u00e1n nem alkalmazhat\u00f3k \u2013 p\u00e9ld\u00e1ul nem prefer\u00e1lhatjuk a hossz\u00fa k\u00f3dol\u00e1si id\u0151t a kisebb f\u00e1jlm\u00e9ret \u00e9s dek\u00f3dol\u00e1si id\u0151 \u00e9rdek\u00e9ben, vagy haszn\u00e1lhatunk k\u00f6vetkezetlen t\u00f6m\u00f6r\u00edt\u00e9st.<\/p>\n<p>A vide\u00f3k t\u00f6m\u00f6r\u00edt\u00e9s\u00e9nek l\u00e9nyege, hogy elt\u00e1vol\u00edtsuk a sz\u00fcks\u00e9gtelen inform\u00e1ci\u00f3kat, mik\u00f6zben meg\u0151rizz\u00fck a felhaszn\u00e1l\u00f3k sz\u00e1m\u00e1ra elfogadhat\u00f3 pontoss\u00e1gi szintet. A statikus k\u00e9pkeretek k\u00f3dol\u00e1sa mellett az algoritmus a jelenlegi keretet a kor\u00e1bbi \u00e9s k\u00f6vetkez\u0151 keret alapj\u00e1n hat\u00e1rozza meg, \u00edgy csak a k\u00f6z\u00f6tt\u00fck l\u00e9v\u0151 k\u00fcl\u00f6nbs\u00e9g ker\u00fcl tov\u00e1bb\u00edt\u00e1sra. Ahogy a Pacman p\u00e9lda is mutatja, csak a differenci\u00e1lis pontok ker\u00fclnek \u00e1tk\u00fcld\u00e9sre.<\/p>\n<p><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/e452c54c53ab7797b610620aefbba8d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVide\u00f3k \u00f6sszehasonl\u00edt\u00e1sa a Pacman p\u00e9ld\u00e1j\u00e1n<\/p>\n<h4>Hangkode\u00e1l\u00e1s<\/h4>\n<p>\nHasonl\u00f3k\u00e9ppen, a hang t\u00f6m\u00f6r\u00edt\u0151 algoritmus is elhagyja azokat az adatokat, amelyeket az ember nem \u00e9rz\u00e9kelhet. Jelenleg az Opus a legjobb teljes\u00edtm\u00e9ny\u0171 audio kodek. Az audiov\u00e1ltoz\u00e1s RTP (Real Time Transport Protocol \u2013 val\u00f3s idej\u0171 forgalom\u00e1tviteli protokoll) protokollon kereszt\u00fcl val\u00f3 tov\u00e1bb\u00edt\u00e1s\u00e1ra lett kifejlesztve. K\u00e9s\u00e9se alacsonyabb, mint az mp3 \u00e9s aac, m\u00edg a min\u0151s\u00e9ge magasabb. A k\u00e9sleltet\u00e9s \u00e1ltal\u00e1ban k\u00f6r\u00fclbel\u00fcl 5~66,5 ms.<\/p>\n<h4>Pion, WebRTC a Golangban<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pion\/webrtc\">Pion<\/a><\/noindex> egy ny\u00edlt forr\u00e1sk\u00f3d\u00fa projekt, amely a WebRTC-t \u00e1th\u00fazza a Golangba. A klasszikus nat\u00edv C++ WebRTC k\u00f6nyvt\u00e1rak burkol\u00e1sa helyett a Pion egy nat\u00edv Golang-alap\u00fa WebRTC megval\u00f3s\u00edt\u00e1s, amely jobb teljes\u00edtm\u00e9nyt, Go-integr\u00e1ci\u00f3t, valamint verzi\u00f3kezel\u00e9st biztos\u00edt a WebRTC protokollokhoz.<\/p>\n<p>A k\u00f6nyvt\u00e1r emellett gyors adatfolyamot biztos\u00edt sz\u00e1mos nagyszer\u0171, be\u00e9p\u00edtett modullal, kevesebb, mint egy m\u00e1sodperces k\u00e9s\u00e9ssel. Saj\u00e1t megval\u00f3s\u00edt\u00e1sai vannak STUN, DTLS, SCTP \u00e9s hasonl\u00f3k ter\u00e9n, \u00e9s n\u00e9mi k\u00eds\u00e9rletez\u00e9s a QUIC \u00e9s WebAssembly technol\u00f3gi\u00e1val. Ez az open-source k\u00f6nyvt\u00e1r val\u00f3ban nagyszer\u0171 tanul\u00e1si forr\u00e1st jelent, remek dokument\u00e1ci\u00f3val, h\u00e1l\u00f3zati protokollok megval\u00f3s\u00edt\u00e1saival \u00e9s klassz p\u00e9ld\u00e1kkal.<\/p>\n<p>A Pion k\u00f6z\u00f6ss\u00e9g, amelyet egy nagyon szenved\u00e9lyes alap\u00edt\u00f3 vezet, meglehet\u0151sen \u00e9l\u00e9nk; sok min\u0151s\u00e9gi diskurzus zajlik a WebRTC-r\u0151l. Ha \u00e9rdekli ez a technol\u00f3gia, csatlakozzon <noindex><a rel=\"nofollow\" href=\"http:\/\/pion.ly\/slack\">http:\/\/pion.ly\/slack<\/a><\/noindex> - sok \u00faj dolgot fog tanulni.<\/p>\n<h3>CloudRetro \u00edr\u00e1sa Golang nyelven<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/f85f7b8ea579fab964d870aad698c7e7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWorker megval\u00f3s\u00edt\u00e1sa Go nyelven<\/p>\n<h4>Go csatorn\u00e1k m\u0171k\u00f6d\u00e9s k\u00f6zben<\/h4>\n<p>\nA Go csatorn\u00e1k sz\u00e9p tervez\u00e9se miatt az esem\u00e9nyfolyam \u00e9s a p\u00e1rhuzamoss\u00e1g probl\u00e9m\u00e1i jelent\u0151sen leegyszer\u0171s\u00f6dnek. Ahogy a diagramon l\u00e1that\u00f3, t\u00f6bb komponens p\u00e1rhuzamosan m\u0171k\u00f6dik k\u00fcl\u00f6nb\u00f6z\u0151 GoRoutines-ban. Minden komponens a saj\u00e1t \u00e1llapot\u00e1t kezeli \u00e9s csatorn\u00e1kon kereszt\u00fcl kommunik\u00e1l. A Golang kiv\u00e1laszt\u00e1si nyilatkozata lehet\u0151v\u00e9 teszi, hogy minden egyes atom\u00e1ris esem\u00e9nyt egy korszakonk\u00e9nt (game tick) kezelj\u00fcnk. Ez azt jelenti, hogy az ilyen tervez\u00e9shez nincs sz\u00fcks\u00e9g z\u00e1rol\u00e1sra. P\u00e9ld\u00e1ul, amikor a felhaszn\u00e1l\u00f3 ment, sz\u00fcks\u00e9g van a j\u00e1t\u00e9k \u00e1llapot\u00e1nak teljes snapshotj\u00e1ra. Ennek az \u00e1llapotnak folyamatosan meg kell maradnia, am\u00edg a ment\u00e9s be nem fejez\u0151dik. Minden game tick sor\u00e1n a backend csak ment\u00e9si vagy bel\u00e9p\u00e9si m\u0171veletet kezelhet, \u00edgy a folyamat sz\u00e1lbiztos lesz.<\/p>\n<pre><code class=\"go\">func (e *gameEmulator) gameUpdate() {\nfor {\n\tselect {\n\t\tcase &lt;-e.saveOperation:\n\t\t\te.saveGameState()\n\t\tcase key := &lt;-e.input:\n\t\t\te.updateGameState(key)\n\t\tcase &lt;-e.done:\n\t\t\te.close()\n\t\t\treturn\n\t}\n    }\n}<\/code><\/pre>\n<p><\/p>\n<h4>Fan-in \/ Fan-out<\/h4>\n<p>\nEz a Golang minta t\u00f6k\u00e9letes a CrowdPlay \u00e9s a Multiple Player haszn\u00e1lati esetemhez. E minta k\u00f6vet\u00e9s\u00e9vel minden felhaszn\u00e1l\u00f3i input egy szob\u00e1ban egy k\u00f6zponti bel\u00e9p\u00e9si csatorn\u00e1ba integr\u00e1l\u00f3dik. A j\u00e1t\u00e9k m\u00e9di\u00e1it ezut\u00e1n minden felhaszn\u00e1l\u00f3nak a szob\u00e1ban kiadj\u00e1k. \u00cdgy el\u00e9rj\u00fck a j\u00e1t\u00e9k\u00e1llapot megoszt\u00e1s\u00e1t a k\u00fcl\u00f6nb\u00f6z\u0151 felhaszn\u00e1l\u00f3k j\u00e1t\u00e9kmenetei k\u00f6z\u00f6tt.<\/p>\n<p><img decoding=\"async\" alt=\"Felhaszn\u00e1l\u00e1sra k\u00e9sz, ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151s j\u00e1t\u00e9kz\u00e9s WebRTC-n: p2p, multiplayer, zero latency.\" src=\"\/wp-content\/uploads\/2020\/07\/000a495d7f214246a8a396aab11a3ac5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSzinkroniz\u00e1l\u00e1s k\u00fcl\u00f6nb\u00f6z\u0151 \u00fcl\u00e9sek k\u00f6z\u00f6tt<\/p>\n<h4>A Golang h\u00e1tr\u00e1nyai<\/h4>\n<p>\nA Golang nem t\u00f6k\u00e9letes. A csatorna lass\u00fa. A Go csatorna a blokkol\u00e1shoz k\u00e9pest egyszer\u0171bb m\u00f3dot k\u00edn\u00e1l a p\u00e1rhuzamos \u00e9s esem\u00e9nyalap\u00fa gyakorlatok kezel\u00e9s\u00e9re, de a csatorna nem biztos\u00edt a legjobb teljes\u00edtm\u00e9nyt. A csatorna alatt bonyolult blokkol\u00e1si logika h\u00faz\u00f3dik meg. Ez\u00e9rt n\u00e9h\u00e1ny m\u00f3dos\u00edt\u00e1st v\u00e9geztem a megval\u00f3s\u00edt\u00e1son, \u00fajra alkalmazva a blokkol\u00e1sokat \u00e9s atomikus \u00e9rt\u00e9keket a csatorn\u00e1k teljes\u00edtm\u00e9ny\u00e9nek optimaliz\u00e1l\u00e1sa \u00e9rdek\u00e9ben.<\/p>\n<p>Tov\u00e1bb\u00e1, a Golang garbage collector nem k\u00e9zben tartott, ami miatt n\u00e9ha gyan\u00fasan hossz\u00fa sz\u00fcnetek l\u00e9pnek fel. Ez jelent\u0151sen megnehez\u00edti a val\u00f3s idej\u0171 streaming alkalmaz\u00e1sok m\u0171k\u00f6d\u00e9s\u00e9t.<\/p>\n<h4>CGO<\/h4>\n<p>\nA projekt az open-source VP8\/H264 Golang k\u00f6nyvt\u00e1rat haszn\u00e1lja a m\u00e9dia t\u00f6m\u00f6r\u00edt\u00e9s\u00e9re, valamint a Libretro-t a j\u00e1t\u00e9k emul\u00e1torokhoz. Mindezek a k\u00f6nyvt\u00e1rak egyszer\u0171en a C k\u00f6nyvt\u00e1r Go-ra val\u00f3 becsomagol\u00e1sai. <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/cmd\/cgo\/\">CGO<\/a><\/noindex>N\u00e9h\u00e1ny h\u00e1tr\u00e1nyt felsorolnak a <noindex><a rel=\"nofollow\" href=\"https:\/\/dave.cheney.net\/2019\/10\/06\/use-internal-packages-to-reduce-your-public-api-surface\">Dave Cheney ezen a poszton.<\/a><\/noindex>A probl\u00e9m\u00e1k, amelyekkel szembes\u00fcltem:<\/p>\n<ul>\n<li>a CGO-ban bek\u00f6vetkez\u0151 \u00f6sszeoml\u00e1sok elkap\u00e1s\u00e1nak lehetetlens\u00e9ge, m\u00e9g a Golang RecoveryCrash seg\u00edts\u00e9g\u00e9vel is;<\/li>\n<li>nincs lehet\u0151s\u00e9g a teljes\u00edtm\u00e9ny sz\u0171k keresztmetszeteinek meghat\u00e1roz\u00e1s\u00e1ra, amikor nem tudunk r\u00e9szletes probl\u00e9m\u00e1kat felfedezni a CGO-ban.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Z\u00e1r\u00e1s<\/h2>\n<p>\nEl\u00e9rtem a c\u00e9lomat \u2013 meg\u00e9rtettem a felh\u0151alap\u00fa j\u00e1t\u00e9k szolg\u00e1ltat\u00e1sokat \u00e9s l\u00e9trehoztam egy platformot, amely seg\u00edt r\u00e9gi nosztalgikus j\u00e1t\u00e9kok online j\u00e1tsz\u00e1s\u00e1ban a bar\u00e1taimmal. Ennek a projektnek a l\u00e9trehoz\u00e1sa Pion k\u00f6nyvt\u00e1r \u00e9s a Pion k\u00f6z\u00f6ss\u00e9g t\u00e1mogat\u00e1sa n\u00e9lk\u00fcl lehetetlen lett volna. Rendk\u00edv\u00fcl h\u00e1l\u00e1s vagyok a folyamatos fejleszt\u00e9s\u00e9\u00e9rt. A WebRTC \u00e9s a Pion \u00e1ltal biztos\u00edtott egyszer\u0171 API-k z\u00f6kken\u0151mentes integr\u00e1l\u00e1st biztos\u00edtottak. Az els\u0151 koncepci\u00f3m a megfelel\u0151 h\u00e9ten jelent meg, annak ellen\u00e9re, hogy el\u0151re nem tudtam a peer-to-peer (P2P) kapcsolatr\u00f3l.<\/p>\n<p>A be\u00e9p\u00edt\u00e9s egyszer\u0171s\u00e9ge ellen\u00e9re a P2P streaming val\u00f3ban nagyon \u00f6sszetett ter\u00fclet a sz\u00e1m\u00edt\u00e1stechnika vil\u00e1g\u00e1ban. Olyan r\u00e9gi h\u00e1l\u00f3zati architekt\u00far\u00e1kkal kell foglalkoznia, mint az IP \u00e9s a NAT, hogy peer-to-peer \u00fcl\u00e9st hozzon l\u00e9tre. A projekt sor\u00e1n rengeteg \u00e9rt\u00e9kes tud\u00e1st szereztem a h\u00e1l\u00f3zatokr\u00f3l \u00e9s a teljes\u00edtm\u00e9ny optimaliz\u00e1l\u00e1s\u00e1r\u00f3l, \u00edgy mindenkinek aj\u00e1nlom, hogy pr\u00f3b\u00e1ljon P2P term\u00e9keket \u00e9p\u00edteni WebRTC seg\u00edts\u00e9g\u00e9vel.<\/p>\n<p>A CloudRetro minden olyan felhaszn\u00e1l\u00e1si forgat\u00f3k\u00f6nyvet lefed, amit retro j\u00e1t\u00e9kosk\u00e9nt elv\u00e1rtam. Mindazon\u00e1ltal \u00fagy \u00e9rzem, hogy a projektben m\u00e9g sok ter\u00fclet van, amit jav\u00edthatn\u00e9k, p\u00e9ld\u00e1ul megb\u00edzhat\u00f3bb \u00e9s teljes\u00edtm\u00e9nyesebb h\u00e1l\u00f3zatot l\u00e9trehozni, magasabb grafikai min\u0151s\u00e9get biztos\u00edtani, vagy lehet\u0151s\u00e9get adni a felhaszn\u00e1l\u00f3k k\u00f6z\u00f6tti j\u00e1t\u00e9kmegoszt\u00e1sra. Ezen dolgozom. K\u00e9rem, figyelj\u00e9k a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">projekt<\/a><\/noindex> \u00e9s t\u00e1mogass\u00e1k, ha tetszik \u00f6n\u00f6knek.<\/li>\n<\/ul>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/Voximplant\/blog\/511626\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u041e \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430, \u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u0433\u0440 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0438? \u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u0433\u0440 (Cloud Gaming), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Stadia, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Google. Stadia \u043d\u0435 \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0432 WebRTC, \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c WebRTC \u0442\u0430\u043a \u0436\u0435? \u0422\u0445\u0430\u043d\u044c \u041d\u0433\u0443\u0435\u043d (Thanh [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89304,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89303","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u0438\u043d\u0433 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 WebRTC: p2p, \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, zero latency | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-21T23:42:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-21T23:42:30+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ny\u00edlt forr\u00e1sk\u00f3d\u00fa felh\u0151alap\u00fa j\u00e1t\u00e9k a WebRTC-n: p2p, multiplayer, nulla k\u00e9sleltet\u00e9s | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u0438\u043d\u0433 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 WebRTC: p2p, \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, zero latency | ProHoster","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-21T23:42:30+00:00","article:modified_time":"2020-07-21T23:42:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89303","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:12:27","updated":"2022-09-29 13:03:06","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/89303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=89303"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/89303\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/89304"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=89303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=89303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=89303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}