Open Source Cloud Gaming auf WebRTC: P2P, Multiplayer, keine Latenz



Software als Service, Infrastruktur als Service, Plattform als Service, Kommunikationsplattform als Service, Videokonferenzen als Service, aber was ist mit Cloud-Spielen als Service? Es gab bereits mehrere Versuche, Cloud-Gaming (Cloud Gaming) zu erstellen, beispielsweise Stadia, das kürzlich von Google gestartet wurde. Stadia ist für WebRTC nicht neu , aber können andere WebRTC auf die gleiche Weise verwenden?



Thanh Nguyen hat beschlossen, diese Möglichkeit in seinem CloudRetro Open Source-Projekt zu testen. CloudRetro basiert auf Pion, der beliebten Go-basierten WebRTC-Bibliothek (danke an Sean vom Pion-Entwicklungsteam für die Unterstützung bei diesem Artikel). In diesem Artikel gibt Thanh einen Überblick über die Architektur seines Projekts und erklärt, welche nützlichen Dinge er gelernt hat und welchen Herausforderungen er während seiner Arbeit begegnet ist.



Einführung



Letztes Jahr, als Google Stadia ankündigte, hat es mich umgehauen. Die Idee ist so einzigartig und innovativ, dass ich mich ständig gefragt habe, wie dies mit vorhandenen Technologien überhaupt möglich ist. Der Wunsch, dieses Thema besser zu verstehen, veranlasste mich, meine eigene Version des Open-Source-Cloud-Spiels zu erstellen. Das Ergebnis war fantastisch. Im Folgenden möchte ich den Prozess der Arbeit an meinem einjährigen Projekt vorstellen .



TLDR: Kurzdia-Version mit Highlights



Warum Cloud Gaming die Zukunft ist



Ich glaube, dass Cloud Gaming bald eine neue Generation von nicht nur Spielen, sondern auch anderen Bereichen der Informatik werden wird. Cloud-Gaming ist der Höhepunkt des Client / Server-Modells. Dieses Modell maximiert die Backend-Kontrolle und minimiert die Frontend-Arbeit, indem es die Spielelogik auf einem Remote-Server hostet und Bilder / Audio auf den Client überträgt. Der Server führt eine umfangreiche Verarbeitung durch, sodass der Client keinen Hardwareeinschränkungen mehr unterliegt.



In Google Stadia können Sie im Wesentlichen AAA-Spiele spielen(d. h. High-End-Blockbuster-Spiele) auf einer Oberfläche wie YouTube. Die gleiche Methode kann auf andere schwere Offline-Anwendungen wie Betriebssysteme oder 2D / 3D-Grafikdesign usw. angewendet werden. Damit können wir sie stabil auf Geräten mit niedrigen Spezifikationen auf verschiedenen Plattformen ausführen.





Die Zukunft dieser Technologie: Können Sie sich vorstellen, ob Microsoft Windows 10 im Chrome-Browser ausgeführt wurde?



Cloud-Gaming ist technisch anspruchsvoll



Das Spielen ist einer der seltenen Bereiche, in denen eine ständige schnelle Benutzerreaktion erforderlich ist. Wenn beim Klicken auf eine Seite gelegentlich eine Verzögerung von 2 Sekunden auftritt, ist dies in Ordnung. Live-Videostreams bleiben in der Regel einige Sekunden zurück, bieten aber dennoch ein gutes Maß an Benutzerfreundlichkeit. Wenn das Spiel jedoch häufig um 500 ms verzögert wird, ist es einfach unmöglich zu spielen. Unser Ziel ist es, eine extrem niedrige Latenz zu erreichen, damit die Lücke zwischen Eingabe und Medien so klein wie möglich ist. Daher ist der traditionelle Ansatz zum Streamen von Videos hier nicht anwendbar.





Gemeinsame Cloud-Spielvorlage



Open Source Projekt CloudRetro



Ich habe beschlossen, ein Testbeispiel für ein Cloud-Spiel zu erstellen, um zu testen, ob all dies mit solch engen Netzwerkeinschränkungen möglich ist. Ich habe Golang als Proof-of-Concept ausgewählt, weil es meine bekannteste Sprache ist und aus vielen anderen Gründen für diese Implementierung gut geeignet ist, wie sich später herausstellte. Go ist einfach und entwickelt sich sehr schnell; Pipes in Go eignen sich hervorragend zum Verwalten von Multithreading.



Das CloudRetro.io- Projekt ist ein Open-Source-Cloud-Gaming-Service für Retro-Gaming. Das Ziel des Projekts ist es, traditionellen Retro-Spielen das angenehmste Spielerlebnis zu bieten und Multiplayer hinzuzufügen.

Weitere Informationen zum Projekt finden Sie hier: https://github.com/giongto35/cloud-game .



CloudRetro-Funktionalität



Um die volle Leistungsfähigkeit von Cloud-Spielen zu demonstrieren, verwendet CloudRetro Retro-Spiele. Dies ermöglicht eine Vielzahl einzigartiger Spielerlebnisse.



  • Spielportabilität

    • Sofortige Wiedergabe beim Öffnen einer Seite; Kein Download und keine Installation erforderlich
    • Funktioniert in einem mobilen Browser, sodass zum Ausführen keine Software erforderlich ist


  • Spielsitzungen können auf mehreren Geräten gemeinsam genutzt und für die nächste Anmeldung in der Cloud gespeichert werden
  • Das Spiel kann gestreamt oder von mehreren Benutzern gleichzeitig gespielt werden:

    • Crowdplay wie TwitchPlayPokemon, nur plattformübergreifender und in Echtzeit
    • Offline-Spiele online. Viele Benutzer können spielen, ohne ein Netzwerk einzurichten. Samurai Shodown kann jetzt von 2 Spielern im CloudRetro-Netzwerk gespielt werden




    Demoversion eines Multiplayer-Online-Spiels auf verschiedenen Geräten



    Infrastruktur



    Anforderungen und Technologie-Stack



    , .



    1.

    , , . , CDN, . , WebSocket, WebRTC.



    2.

    Stadia, WebRTC. , WebRTC – , . WebRTC – , - API. , , VP8 H264.



    , . . Google Stadia , .



    3.

    , , , . - (RTT). 1 , : , , , , . . , . , , .



    4.

    , . , . , . - . , WebRTC .



    5.

    . . LibRetro , LibRetro -, SNES, GBA, PS.



    6. , crowd play (deep-link)

    CloudRetro , CrowdPlay Online MultiPlayer -. deep-link , .



    , . .



    7.

    SAAS , , . «-» , .



    8.

    CloudRetro (Digital Ocean, Alibaba, ) . Docker bash-, . NAT Traversal WebRTC, CloudRetro .





    : ( , ) , . , .



    : . WebSocket.



    : . , , , /.





    CloudRetro





    CloudRetro 1 2, , . 3 HTTP ping. , . 4 . WebRTC.









    . Golang . , .. .









    :



    • WebRTC: , .

    • : . Libretro .

    • .

    • / : , , /.





    CloudRetro WebRTC , , Golang, WebRTC. , .



    WebRTC



    WebRTC API.



    NAT Traversal



    WebRTC NAT Traversal. WebRTC . – , NAT- ICE. API WebRTC IP- STUN (TURN), .



    CloudRetro . , . , . IP- , NAT.



    Cloud Gaming. , . . CloudRetro , , . WebRTC NAT Traversal , .





    – , . , VP8/H264, , .



    , , + + , . , . – , , .



    , , . , , . c Pacman’, .





    Pacman





    , , . Opus . , RTP (Real Time Transport Protocol – ). , mp3 aac, . 5~66,5 .



    Pion, WebRTC Golang



    Pion – , WebRTC Golang. C++ WebRTC, Pion Golang- WebRTC , Go, WebRTC.



    . STUN, DTLS, SCTP .. QUIC WebAssembly. , .



    Pion, , , WebRTC. , http://pion.ly/slack – .



    CloudRetro Golang





    Go



    Go



    Go, . , GoRoutines . . Golang (game tick). , . , , . , , . game tick’ , .



    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



    Golang CrowdPlay Multiple Player. , . . , .









    Golang



    Golang . . Go – , . . , .



    , garbage collector Golang , - . .



    CGO



    VP8/H264 Golang Libretro . C Go CGO. Dave Cheney. , :



    • CGO, Golang RecoveryCrash;
    • , CGO.




    – , - . Pion Pion. . API, WebRTC Pion, . , , (P2P).



    , P2P- . , IP NAT . , P2P- WebRTC.



    CloudRetro , , , -. , , , , , , , . . , , .



All Articles