{"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\/de\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency","title":{"rendered":"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz","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=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/22dbf7665d7fded15671d98a2afe599b.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\nSoftware as a Service, Infrastructure as a Service, Platform as a Service, Kommunikationsplattform als Dienst, Videokonferenzen als Dienst \u2013 und was ist mit Cloud-Gaming als Dienst? Es gab bereits mehrere Versuche, Cloud-Gaming zu entwickeln, wie beispielsweise Stadia, welches k\u00fcrzlich von Google ins Leben gerufen wurde. <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/avtlQeaxd_I?t=440\">Stadia<\/a><\/noindex>ist kein Neuling in WebRTC, aber k\u00f6nnen andere WebRTC ebenso nutzen?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Thanh Nguyen hat beschlossen, diese M\u00f6glichkeit in seinem Open-Source-Projekt CloudRetro zu testen. CloudRetro basiert auf Pion, <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/webrtc-open-source-most-popular\/\">einer beliebten<\/a><\/noindex> WebRTC-Bibliothek in Go (danke <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Sean-Der\">Sean<\/a><\/noindex> aus dem Pion-Entwicklerteam f\u00fcr die Unterst\u00fctzung bei der Erstellung dieses Artikels). In diesem Artikel gibt Thanh einen \u00dcberblick \u00fcber die Architektur seines Projekts und erz\u00e4hlt, welche wertvollen Erkenntnisse er gewonnen hat und mit welchen Herausforderungen er w\u00e4hrend der Arbeit konfrontiert war.<\/p>\n<h2>Einleitung<\/h2>\n<p>\nIm vergangenen Jahr, als Google Stadia ank\u00fcndigte, war ich einfach \u00fcberw\u00e4ltigt. Die Idee ist so einzigartig und innovativ, dass ich mich st\u00e4ndig fragte, wie so etwas mit der aktuellen Technologie m\u00f6glich ist. Mein Wunsch, dieses Thema besser zu verstehen, motivierte mich dazu, meine eigene Version eines Open-Source-Cloud-Gaming-Dienstes zu entwickeln. Das Ergebnis war einfach fantastisch. Im Folgenden m\u00f6chte ich den Prozess meiner einj\u00e4hrigen Arbeit teilen. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">dem Projekt<\/a><\/noindex>.<\/p>\n<p><i>TLDR: Eine kurze Zusammenfassung mit den Hauptpunkten<\/i><\/p>\n<h3>Warum Cloud Gaming die Zukunft hat<\/h3>\n<p>\nIch bin \u00fcberzeugt, dass Cloud Gaming bald nicht nur das kommende Zeitalter des Spielens, sondern auch anderer Informatikanwendungen einl\u00e4uten wird. Cloud Gaming stellt das H\u00f6chstma\u00df eines Client\/Server-Modells dar. Dieses Modell maximiert die Kontrolle \u00fcber das Backend und minimiert die Anforderungen an das Frontend, indem die Spiel-Logik auf einem entfernten Server platziert und Bild-\/Audiostreams an den Client \u00fcbertragen werden. Der Server \u00fcbernimmt die rechenintensive Verarbeitung, sodass der Client nicht mehr von Hardwarebeschr\u00e4nkungen abh\u00e4ngig ist.<\/p>\n<p>Google Stadia erm\u00f6glicht es im Wesentlichen, AAA-Spiele zu spielen <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)\">AAA-Spiele<\/a><\/noindex> (d.h. hochkar\u00e4tige Blockbuster-Spiele) auf einer Plattform \u00e4hnlich wie YouTube. Dieselbe Methodik kann auch auf andere ressourcenintensive Offline-Anwendungen angewendet werden, wie Betriebssysteme oder 2D\/3D-Grafikdesign, damit wir sie stabil auf Ger\u00e4ten mit niedrigen technischen Spezifikationen auf verschiedenen Plattformen ausf\u00fchren k\u00f6nnen.<\/p>\n<p><img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/d6ca3e47db5c8e3d9880b304cc3be33b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Zukunft dieser Technologie: Stellen Sie sich vor, Microsoft Windows 10 w\u00fcrde im Browser Chrome laufen?<\/p>\n<h3>Cloud-Gaming ist technisch anspruchsvoll.<\/h3>\n<p>\nGaming ist eines der wenigen Bereiche, in denen eine konstant schnelle Reaktion des Nutzers erforderlich ist. Wenn es gelegentlich eine Verz\u00f6gerung von 2 Sekunden beim Klicken auf einer Seite gibt, ist das akzeptabel. Livestreams haben normalerweise ein paar Sekunden Verz\u00f6gerung, bieten aber dennoch ausreichenden Nutzungskomfort. Wenn ein Spiel jedoch h\u00e4ufig um 500 ms verz\u00f6gert ist, ist es einfach unm\u00f6glich zu spielen. Unser Ziel ist es, eine extrem niedrige Latenz zu erreichen, um die L\u00fccke zwischen Eingabe und Medieninhalt so gering wie m\u00f6glich zu halten. Daher ist der traditionelle Ansatz f\u00fcr Streaming-Videos hier nicht anwendbar.<\/p>\n<p><img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/d73765a3c9277c026f407883e1091473.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAllgemeines Muster f\u00fcr Cloud-Gaming.<\/p>\n<h2>Open-Source-Projekt CloudRetro.<\/h2>\n<p>\nIch habe beschlossen, ein Testmuster f\u00fcr Cloud-Gaming zu erstellen, um zu \u00fcberpr\u00fcfen, ob dies unter so strikten Netzwerkbedingungen m\u00f6glich ist. F\u00fcr den Konzeptnachweis habe ich Golang gew\u00e4hlt, da es die Sprache ist, mit der ich am vertrautesten bin, und sie aus vielen anderen Gr\u00fcnden gut f\u00fcr diese Umsetzung geeignet ist, wie sich sp\u00e4ter herausstellte. Go ist einfach und entwickelt sich sehr schnell; die Kan\u00e4le in Go eignen sich hervorragend zur Verwaltung von Parallelit\u00e4t.<\/p>\n<p>Projekt <noindex><a rel=\"nofollow\" href=\"http:\/\/cloudretro.io\/\">CloudRetro.io<\/a><\/noindex> \u2013 ein Cloud-Gaming-Service mit offener Quelle f\u00fcr Retro-Spiele. Ziel des Projekts ist es, den traditionellen Retro-Spielen das angenehmste Spielerlebnis zu verleihen und den Mehrspielermodus hinzuzuf\u00fcgen.<br \/>\nHier k\u00f6nnen Sie das Projekt im Detail kennenlernen: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">https:\/\/github.com\/giongto35\/cloud-game<\/a><\/noindex>.<\/p>\n<h3>Funktionalit\u00e4t von CloudRetro<\/h3>\n<p>\nUm die gesamte Kraft des Cloud-Gamings in CloudRetro zu demonstrieren, kommen Retro-Spiele zum Einsatz. Dadurch entstehen viele einzigartige Spielerlebnisse.<\/p>\n<ul>\n<li>Spielportabilit\u00e4t\n<ul>\n<li>Sofortige Wiedergabe beim \u00d6ffnen der Seite; keine Downloads oder Installationen erforderlich.<\/li>\n<li>Funktioniert im mobilen Browser, sodass keine Softwareinstallation erforderlich ist.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Spiele k\u00f6nnen auf mehreren Ger\u00e4ten gemeinsam genutzt und in der Cloud f\u00fcr den n\u00e4chsten Login gespeichert werden.<\/li>\n<li>Das Spiel kann gestreamt oder von mehreren Benutzern gleichzeitig gespielt werden:\n<ul>\n<li>Crowdplay wie bei TwitchPlayPokemon, jedoch plattform\u00fcbergreifender und interaktiver.<\/li>\n<li>Offline-Spiele im Online-Modus. Viele Benutzer k\u00f6nnen ohne Netzwerkeinstellung spielen. In Samurai Shodown k\u00f6nnen jetzt 2 Spieler \u00fcber CloudRetro online spielen.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/bdc715971755d669a026f830ce888520.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDemo-Version eines Multiplayer-Onlinespiels auf verschiedenen Ger\u00e4ten.<\/p>\n<h2>Infrastruktur<\/h2>\n<p><\/p>\n<h3>Anforderungen und Technologie-Stack<\/h3>\n<p>\nIm Folgenden finden Sie die Liste der Anforderungen, die ich vor Projektbeginn festgelegt habe.<\/p>\n<p><b>1. Ein Spieler<\/b><br \/>\nDiese Anforderung mag hier nicht besonders wichtig oder offensichtlich erscheinen, aber sie ist eine meiner wichtigsten Erkenntnisse. Sie erm\u00f6glicht es Cloud-Gaming, sich von traditionellen Streaming-Diensten abzuwenden. Wenn wir uns auf Einzelspieler-Spiele konzentrieren, k\u00f6nnen wir auf zentrale Server oder CDN verzichten, da wir keine Massen\u00fcbertragung durchf\u00fchren m\u00fcssen. Anstatt Streams auf einen zentralen Server zu laden oder Pakete an einen zentralen WebSocket-Server zu \u00fcbertragen, werden die Dienst-Streams direkt \u00fcber eine Peer-to-Peer-Verbindung mit WebRTC an den Benutzer gesendet.<\/p>\n<p><b>2. Niedriglatente Medien\u00fcbertragung<\/b><br \/>\nWenn ich \u00fcber Stadia lese, sto\u00dfe ich h\u00e4ufig in einigen Artikeln auf Erw\u00e4hnungen von WebRTC. Mir wurde klar, dass WebRTC eine herausragende Technologie ist, die sich hervorragend f\u00fcr Cloud-Gaming eignet. WebRTC ist ein Projekt, das Webbrowsern und mobilen Anwendungen Echtzeitkommunikation \u00fcber eine einfache API erm\u00f6glicht. Es bietet eine Peer-to-Peer-Verbindung, die f\u00fcr Medien optimiert ist und \u00fcber integrierte Standardcodecs wie VP8 und H264 verf\u00fcgt.<\/p>\n<p>Ich habe den Fokus auf die Schaffung einer m\u00f6glichst komfortablen Nutzung f\u00fcr die Benutzer gelegt, anstatt die hohe Grafikqualit\u00e4t zu bewahren. Im Algorithmus sind einige Verluste zul\u00e4ssig. Google Stadia verf\u00fcgt \u00fcber einen zus\u00e4tzlichen Schritt zur Reduzierung der Bildgr\u00f6\u00dfe auf dem Server, und die Frames werden in h\u00f6herer Qualit\u00e4t skaliert, bevor sie an die Peer-to-Peer-Knoten \u00fcbertragen werden.<\/p>\n<p><b>3. Verteilte Infrastruktur mit geografischer Routenf\u00fchrung<\/b><br \/>\nEgal wie gut der Komprimierungsalgorithmus und der Code optimiert sind, das Netzwerk bleibt der entscheidende Faktor, der am meisten zur Latenz beitr\u00e4gt. Die Architektur sollte einen Mechanismus zur Anbindung des n\u00e4chstgelegenen Servers zum Benutzer haben, um die Round-Trip-Zeit (RTT) zu verk\u00fcrzen. Sie sollte einen Koordinator und mehrere Streaming-Server weltweit umfassen: Westk\u00fcste der USA, Ostk\u00fcste der USA, Europa, Singapur, China. Alle Streaming-Server m\u00fcssen vollst\u00e4ndig isoliert sein. Das System kann seine Verteilung anpassen, wenn ein Server dem Netzwerk beitritt oder es verl\u00e4sst. Auf diese Weise erm\u00f6glicht das Hinzuf\u00fcgen zus\u00e4tzlicher Server bei hohem Verkehr horizontale Skalierung.<\/p>\n<p><b>4. Browserkompatibilit\u00e4t<\/b><br \/>\nCloud-Gaming zeigt sein volles Potenzial, wenn es minimalen Aufwand von den Nutzern erfordert. Das bedeutet, dass die Spiele \u00fcber den Browser gestartet werden k\u00f6nnen. Browser erm\u00f6glichen ein komfortableres Spielerlebnis, indem sie die Installation von Software und Hardware vermeiden. Zudem f\u00f6rdern sie die plattform\u00fcbergreifende Nutzung f\u00fcr mobile und Desktop-Versionen. Gl\u00fccklicherweise wird WebRTC in verschiedenen Browsern hervorragend unterst\u00fctzt.<\/p>\n<p><b>5. Deutliche Trennung von Spieloberfl\u00e4che und Dienst<\/b><br \/>\nIch betrachte den Cloud-Gaming-Dienst als Plattform. Jeder sollte die M\u00f6glichkeit haben, beliebige Elemente an die Plattform anzuschlie\u00dfen. Aktuell habe ich <noindex><a rel=\"nofollow\" href=\"http:\/\/LibRetro\">LibRetro<\/a><\/noindex> in den Cloud-Gaming-Dienst integriert, da LibRetro eine ansprechende Schnittstelle f\u00fcr Emulatoren klassischer Spiele wie SNES, GBA und PS bietet.<\/p>\n<p><b>6. R\u00e4ume f\u00fcr Mehrspieler, Crowd Play und Deep-Linking mit dem Spiel<\/b><br \/>\nCloudRetro unterst\u00fctzt zahlreiche neue Spielmodi wie CrowdPlay und Online-Multiplayer f\u00fcr Retro-Spiele. Wenn mehrere Nutzer denselben Deep-Link auf unterschiedlichen Computern \u00f6ffnen, sehen sie dasselbe laufende Spiel und k\u00f6nnen sogar daran teilnehmen.<\/p>\n<p>Au\u00dferdem werden die Spielst\u00e4nde in der Cloud gespeichert. Das erm\u00f6glicht es den Nutzern, jederzeit auf jedem anderen Ger\u00e4t weiterzuspielen.<\/p>\n<p><b>7. Horizontale Skalierung<\/b><br \/>\nWie jede moderne SaaS-L\u00f6sung sollten Cloud-Games so konzipiert sein, dass sie horizontal skalierbar sind. Das Design mit \u201eKoordinator-Arbeiter\u201c-Modell erlaubt es, weitere Arbeiter hinzuzuf\u00fcgen, um gr\u00f6\u00dferen Traffic zu bew\u00e4ltigen.<\/p>\n<p><b>8. Keine Bindung an eine einzelne Cloud<\/b><br \/>\nDie Infrastruktur von CloudRetro wird \u00fcber verschiedene Cloud-Anbieter (Digital Ocean, Alibaba, benutzerdefinierter Anbieter) in unterschiedlichen Regionen gehostet. Ich aktiviere das Deployment in einem Docker-Container f\u00fcr die Infrastruktur und konfiguriere die Netzwerkeinstellungen mit einem Bash-Skript, um die Abh\u00e4ngigkeit von einem einzelnen Cloud-Anbieter zu vermeiden. Durch die Kombination mit NAT Traversal in WebRTC erhalten wir die Flexibilit\u00e4t, CloudRetro auf jeder Cloud-Plattform und sogar auf den Maschinen von Nutzern bereitzustellen.<\/p>\n<h3>Architekturdesign<\/h3>\n<p>\n<b>Arbeiter:<\/b> (oder Streaming-Server, wie oben erw\u00e4hnt) vervielfacht Spiele, startet den Codierungs-Pipeline und \u00fcbertr\u00e4gt codierte Medien an die Nutzer. Die Worker-Instanzen sind weltweit verteilt und jeder Worker kann mehrere Benutzersitzungen gleichzeitig verarbeiten.<\/p>\n<p><b>Koordinator:<\/b> verantwortlich f\u00fcr die Zuordnung neuer Benutzer zum am besten geeigneten Worker f\u00fcr das Streaming. Der Koordinator interagiert mit den Workern \u00fcber WebSocket.<\/p>\n<p><b>Speicher f\u00fcr Spielst\u00e4nde:<\/b> eine zentrale Remote-Speicherl\u00f6sung f\u00fcr alle Spielst\u00e4nde. Dieser Speicher bietet wichtige Funktionen wie Remote-Speicherung\/Laden.<\/p>\n<p><img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/985447b81350a640b0bd1344b5705113.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00dcbergeordnete Architektur von CloudRetro<\/p>\n<h3>Benutzerszenario<\/h3>\n<p>\nWenn ein neuer Benutzer CloudRetro in den Schritten 1 und 2 \u00f6ffnet, wie im Bild unten gezeigt, wird der Koordinator zusammen mit der Liste der verf\u00fcgbaren Worker an die erste Seite angefragt. Danach berechnet der Kunde in Schritt 3 die Latenzen f\u00fcr alle Kandidaten mithilfe einer HTTP-Ping-Anfrage. Diese Liste der Latenzen wird dann zur\u00fcck an den Koordinator gesendet, damit dieser den geeignetsten Worker zur Betreuung des Benutzers bestimmen kann. In Schritt 4 wird das Spiel erstellt. Eine Streaming-Verbindung \u00fcber WebRTC wird zwischen dem Benutzer und dem zugewiesenen Worker eingerichtet.<br \/>\n<img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/00199b5942e3e4314609ec0e70ea7162.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBenutzerszenario nach Erhalt des Zugriffs<\/p>\n<h3>Was sich im Worker befindet<\/h3>\n<p>\nDie Spiel- und Streaming-Pipelines werden isoliert im Worker gespeichert und tauschen dort Informationen \u00fcber Schnittstellen aus. Derzeit geschieht diese Verbindung \u00fcber die Speicher\u00fcbertragung \u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/tour.golang.org\/concurrency\/2\">Golang-Kan\u00e4le<\/a><\/noindex> im selben Prozess. Das n\u00e4chste Ziel ist die Segregation, d.h. das unabh\u00e4ngige Ausf\u00fchren des Spiels in einem anderen Prozess.<\/p>\n<p><img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/7a90ec2638344467a34604cd4322165c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nInteraktion der Worker-Komponenten<\/p>\n<p>Die Hauptkomponenten:<\/p>\n<ul>\n<li><b>WebRTC:<\/b> Client-Komponente, die Benutzereingaben annimmt und codierte Medien vom Server ausgibt.\n<\/li>\n<li><b>Gaming-Emulator:<\/b> Gaming-Komponente. Dank der Libretro-Bibliothek kann das System das Spiel innerhalb desselben Prozesses starten und Medien sowie Eingabestr\u00f6me intern abfangen.\n<\/li>\n<li>In-Game-Bilder werden erfasst und an den Encoder gesendet.\n<\/li>\n<li><b>Bild-\/Audio-Encoder:<\/b> Codierpipeline, die Mediendatenpakete entgegennimmt, sie im Hintergrund codiert und die codierten Bilder\/Audios ausgibt.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Implementierung<\/h2>\n<p>\nCloudRetro nutzt WebRTC als zugrunde liegende Technologie, daher wollte ich, bevor ich in die Details der Implementierung in Golang eintauche, \u00fcber WebRTC selbst sprechen. Es ist eine erstaunliche Technologie, die mir sehr geholfen hat, eine \u00dcbertragungsverz\u00f6gerung von nur einem Bruchteil einer Sekunde zu erreichen.<\/p>\n<h3>WebRTC<\/h3>\n<p>\nWebRTC ist darauf ausgelegt, qualitativ hochwertige Peer-to-Peer-Verbindungen auf nativen mobilen Anwendungen und in Browsern \u00fcber einfache APIs bereitzustellen.<\/p>\n<h4>NAT Traversal <\/h4>\n<p>\nWebRTC ist bekannt f\u00fcr seine NAT-Traversal-Funktionalit\u00e4t. WebRTC ist f\u00fcr Peer-to-Peer-Kommunikation konzipiert. Sein Ziel ist es, den am besten geeigneten direkten Weg zu finden und NAT-Gateways und Firewalls f\u00fcr Peer-to-Peer-Verbindungen zu vermeiden, durch einen Prozess namens <noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/trickle-ice\/\">ICE<\/a><\/noindex>. Im Rahmen dieses Prozesses ermittelt die WebRTC-API Ihre \u00f6ffentliche IP-Adresse \u00fcber STUN-Server und leitet sie an den Relay-Server weiter (<noindex><a rel=\"nofollow\" href=\"https:\/\/webrtchacks.com\/?s=turn\">TURN<\/a><\/noindex>), wenn eine direkte Verbindung nicht hergestellt werden kann.<\/p>\n<p>CloudRetro nutzt jedoch diese M\u00f6glichkeit nicht vollst\u00e4ndig. Dessen Peer-to-Peer-Verbindungen bestehen nicht zwischen Benutzern, sondern zwischen Benutzern und Cloud-Servern. Die Serverseite des Modells hat weniger Einschr\u00e4nkungen bei der direkten Kommunikation als gew\u00f6hnliche Benutzerger\u00e4te. Dies erm\u00f6glicht das vorzeitige \u00d6ffnen eingehender Ports oder die direkte Nutzung \u00f6ffentlicher IP-Adressen, da der Server nicht hinter einem NAT sitzt.<\/p>\n<p>Fr\u00fcher wollte ich das Projekt in eine Plattform f\u00fcr Cloud-Gaming-Verbreitung verwandeln. Die Idee war, es Spieleentwicklern zu erm\u00f6glichen, Spiele und Streaming-Ressourcen anzubieten, w\u00e4hrend die Nutzer direkt mit den Anbietern interagieren. In diesem dezentralisierten Ansatz fungiert CloudRetro lediglich als Schnittstelle, um externe Streaming-Ressourcen mit den Nutzern zu verbinden, was es skalierbarer macht, da der Hosting-Betrieb entf\u00e4llt. Die Rolle des WebRTC NAT Traversal ist hier entscheidend, um die Initiierung von Peer-to-Peer-Verbindungen zu externen Streaming-Ressourcen zu erleichtern, wodurch die Verbindung zwischen dem Entwickler und dem Netzwerk vereinfacht wird.<\/p>\n<h4>Video-Kompression<\/h4>\n<p>\nDie Video-Kompression ist ein unerl\u00e4sslicher Teil des Workflows, der erheblich zur Fl\u00fcssigkeit des Streams beitr\u00e4gt. Auch wenn es nicht notwendig ist, alle Details der Video-Codierung in VP8\/H264 zu kennen, hilft ein Verst\u00e4ndnis des Konzepts, die Streaming-Video-Bitrate einzusch\u00e4tzen, unerwartetes Verhalten zu beheben und die Latenz zu optimieren.<\/p>\n<p>Die Video-Kompression f\u00fcr Streaming-Dienste stellt eine komplexe Herausforderung dar, da der Algorithmus sicherstellen muss, dass die gesamte Kodierungszeit + die Netzwerk\u00fcbertragungszeit + die Dekodierungszeit so gering wie m\u00f6glich ist. Dar\u00fcber hinaus muss der Kodierungsprozess kontinuierlich und konsistent sein. Bestimmte Kompromisse bei der Kodierung sind nicht anwendbar \u2013 beispielsweise k\u00f6nnen wir nicht eine l\u00e4ngere Kodierungszeit einem kleinere Dateigr\u00f6\u00dfe und Dekodierungszeit vorziehen oder inkonsistente Kompression verwenden.<\/p>\n<p>Die Idee der Video-Kompression besteht darin, unn\u00f6tige Informationsbits zu entfernen und gleichzeitig ein akzeptables Genauigkeitsniveau f\u00fcr die Benutzer beizubehalten. Neben der Kodierung einzelner statischer Bildrahmen zieht der Algorithmus Schlussfolgerungen f\u00fcr den aktuellen Rahmen aus dem vorherigen und dem n\u00e4chsten, sodass nur deren Unterschiede \u00fcbertragen werden. Wie im Beispiel mit Pacman zu sehen ist, werden nur differenzielle Punkte \u00fcbertragen.<\/p>\n<p><img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/e452c54c53ab7797b610620aefbba8d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVergleich von Videorahmen am Beispiel Pacman<\/p>\n<h4>Audio-Kompression<\/h4>\n<p>\nEbenso l\u00e4sst der Audiokomprimierungsalgorithmus Daten weg, die vom Menschen nicht wahrgenommen werden k\u00f6nnen. Opus ist derzeit der leistungsf\u00e4higste Audiocodec. Er wurde entwickelt, um Audiosignale \u00fcber ein Protokoll f\u00fcr geordnete Datagramme wie RTP (Real Time Transport Protocol \u2013 Protokoll f\u00fcr die \u00dcbertragung von Echtzeitdaten) zu \u00fcbertragen. Seine Latenz ist geringer als die von mp3 und aac, w\u00e4hrend die Qualit\u00e4t h\u00f6her ist. Die Latenz betr\u00e4gt normalerweise etwa 5 bis 66,5 ms.<\/p>\n<h4>Pion, WebRTC in Golang<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pion\/webrtc\">Pion<\/a><\/noindex> ist ein Open-Source-Projekt, das WebRTC nach Golang portiert. Anstelle des \u00fcblichen Wrappers f\u00fcr native C++-Bibliotheken von WebRTC ist Pion eine native Golang-Implementierung von WebRTC mit besserer Leistung, Integration in Go und Versionierung auf den Protokollen von WebRTC.<\/p>\n<p>Die Bibliothek bietet auch Streaming mit zahlreichen gro\u00dfartigen integrierten Modulen mit einer Latenz von weniger als einer Sekunde. Sie verf\u00fcgt \u00fcber eine eigene Implementierung von STUN, DTLS, SCTP usw. sowie einige Experimente mit QUIC und WebAssembly. Diese Open-Source-Bibliothek ist selbst ein wirklich guter Lernort mit hervorragender Dokumentation, Implementierung von Netzwerkprotokollen und tollen Beispielen.<\/p>\n<p>Die Pion-Community, geleitet von einem sehr leidenschaftlichen Entwickler, ist ziemlich lebhaft und es finden viele qualitativ hochwertige Diskussionen \u00fcber WebRTC statt. Wenn Sie an dieser Technologie interessiert sind, schlie\u00dfen Sie sich uns an, <noindex><a rel=\"nofollow\" href=\"http:\/\/pion.ly\/slack\">http:\/\/pion.ly\/slack<\/a><\/noindex> \u2013 Sie werden viel Neues lernen.<\/p>\n<h3>CloudRetro in Golang schreiben<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/f85f7b8ea579fab964d870aad698c7e7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nImplementierung eines Workers in Go<\/p>\n<h4>Go-Kan\u00e4le in Aktion<\/h4>\n<p>\nDurch das ansprechende Design der Go-Kan\u00e4le werden Herausforderungen bei der Streaming-\u00dcbertragung von Ereignissen und Parallelit\u00e4t erheblich reduziert. Wie in der Grafik dargestellt, arbeiten mehrere Komponenten in verschiedenen GoRoutinen parallel. Jede Komponente verwaltet ihren eigenen Zustand und kommuniziert \u00fcber Kan\u00e4le. Die selektive Aussage in Golang zwingt dazu, jedes atomare Ereignis zu einem bestimmten Zeitpunkt im Spiel (game tick) zu verarbeiten. Das bedeutet, dass f\u00fcr dieses Design keine Sperren erforderlich sind. Wenn zum Beispiel ein Benutzer speichert, ist ein kompletter Snapshot des Spielzustands erforderlich. Dieser Zustand muss konstant bleiben, w\u00e4hrend Eingaben weiter verarbeitet werden, bis der Speicherprozess abgeschlossen ist. W\u00e4hrend jedes game tick kann das Backend nur die Speicher- oder Eingabefunktion verarbeiten, was den Prozess thread-sicher macht.<\/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>\nDiese Golang-Vorlage eignet sich hervorragend f\u00fcr mein Nutzungsszenario mit CrowdPlay und mehreren Spielern. Mit dieser Vorlage werden alle Benutzereingaben in einem Raum in einen zentralen Eingabekanal integriert. Die Spielmedien werden dann an alle Benutzer in diesem Raum verteilt. So erreichen wir eine Trennung des Spielstatus zwischen mehreren Spielsitzungen verschiedener Benutzer.<\/p>\n<p><img decoding=\"async\" alt=\"Cloud-Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz\" src=\"\/wp-content\/uploads\/2020\/07\/000a495d7f214246a8a396aab11a3ac5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSynchronisation zwischen verschiedenen Sitzungen<\/p>\n<h4>Nachteile von Golang<\/h4>\n<p>\nGolang ist nicht perfekt. Der Kanal ist langsam. Im Vergleich zu Kan\u00e4len ist Go lediglich eine einfachere Methode zur Handhabung paralleler und streamender Ereignisse, jedoch bietet der Kanal nicht die beste Leistung. Unter dem Kanal liegt eine komplexe Logik zur Blockierung. Daher habe ich einige Anpassungen an der Implementierung vorgenommen, indem ich Sperren und atomare Werte wiederverwendet habe, um die Leistung zu optimieren.<\/p>\n<p>Dar\u00fcber hinaus ist der Garbage Collector in Golang nicht verwaltbar, was gelegentlich zu verd\u00e4chtig langen Pausen f\u00fchrt. Dies beeintr\u00e4chtigt die Leistung einer Echtzeitanwendung erheblich.<\/p>\n<h4>CGO<\/h4>\n<p>\nIm Projekt wird die vorhandene VP8\/H264 Golang-Bibliothek mit Open Source verwendet, um Medien zu komprimieren, sowie Libretro f\u00fcr Spieleemulatoren. Alle diese Bibliotheken sind lediglich Wrapper der C-Bibliothek in Go, die verwendet werden. <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/cmd\/cgo\/\">CGO<\/a><\/noindex>. Einige der Nachteile werden in <noindex><a rel=\"nofollow\" href=\"https:\/\/dave.cheney.net\/2019\/10\/06\/use-internal-packages-to-reduce-your-public-api-surface\">diesem Beitrag von Dave Cheney<\/a><\/noindex>aufgef\u00fchrt. Die Herausforderungen, mit denen ich konfrontiert war:<\/p>\n<ul>\n<li>die Unf\u00e4higkeit, Abst\u00fcrze in CGO abzufangen, selbst mit Golang RecoveryCrash;<\/li>\n<li>die Unf\u00e4higkeit, Engp\u00e4sse in der Leistung zu identifizieren, wenn wir detaillierte Probleme in CGO nicht erkennen k\u00f6nnen.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Fazit<\/h2>\n<p>\nIch habe mein Ziel erreicht \u2013 ich habe mich in cloudbasierte Spieleservices eingearbeitet und eine Plattform geschaffen, die es mir erm\u00f6glicht, nostalgische Retro-Spiele online mit meinen Freunden zu spielen. Die Erstellung dieses Projekts w\u00e4re ohne die Pion-Bibliothek und die Unterst\u00fctzung der Pion-Community unm\u00f6glich gewesen. Ich bin \u00e4u\u00dferst dankbar f\u00fcr die intensive Entwicklung. Die einfachen APIs, die von WebRTC und Pion bereitgestellt werden, haben eine reibungslose Integration erm\u00f6glicht. Mein erstes Konzept wurde noch in derselben Woche ver\u00f6ffentlicht, obwohl ich im Voraus nichts \u00fcber die Peer-to-Peer-Verbindung (P2P) wusste.<\/p>\n<p>Trotz der einfachen Integration ist P2P-Streaming ein \u00e4u\u00dferst komplexes Thema in der Informatik. Es erfordert die Auseinandersetzung mit den Herausforderungen jahrzehntelanger Netzwerkarchitekturen wie IP und NAT, um eine Peer-to-Peer-Sitzung zu etablieren. W\u00e4hrend der Arbeit an diesem Projekt habe ich viele wertvolle Erkenntnisse \u00fcber Netzwerke und Leistungsoptimierung gesammelt, weshalb ich jedem empfehle, P2P-Produkte mit WebRTC zu entwickeln.<\/p>\n<p>CloudRetro unterst\u00fctzt alle Nutzungsszenarien, die ich als Retro-Gamer erwartet habe. Dennoch glaube ich, dass es viele Bereiche im Projekt gibt, die ich verbessern kann, zum Beispiel die Zuverl\u00e4ssigkeit und Leistungsf\u00e4higkeit des Netzwerks, die Grafikqualit\u00e4t der Spiele oder die M\u00f6glichkeit, Spiele unter den Nutzern zu teilen. Ich arbeite intensiv daran. Bitte bleiben Sie dran, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/giongto35\/cloud-game\">dem Projekt<\/a><\/noindex> und unterst\u00fctzen Sie es, wenn es Ihnen gef\u00e4llt.<\/li>\n<\/ul>\n<p>Quelle: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/de\/blog\/administrirovanie\/oblachnyj-gejming-s-otkrytym-ishodnym-kodom-na-webrtc-p2p-multipleer-zero-latency\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47Cloud Gaming mit Open Source auf WebRTC: p2p, Multiplayer, Null-Latenz | ProHoster","description":"Als Dienstleistung: Software, Infrastruktur, Plattform, Kommunikationsplattform, Videokonferenzen \u2013 und was ist mit Cloud Gaming als Dienstleistung? Es gab bereits mehrere Versuche, Cloud Gaming zu schaffen, wie beispielsweise Stadia, das k\u00fcrzlich von Google gestartet wurde. Stadia ist kein Neuling in WebRTC, aber k\u00f6nnen andere WebRTC ebenso nutzen? Thanh Nguyen (Thanh","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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:description":"\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","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/89303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=89303"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/89303\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/89304"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=89303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=89303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=89303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}