Logiciel en tant que service, infrastructure en tant que service, plateforme en tant que service, plateforme de communication en tant que service, vidéoconférence en tant que service, mais qu'en est-il des jeux cloud en tant que service? Il y a déjà eu plusieurs tentatives de création de cloud gaming (Cloud Gaming), par exemple Stadia, récemment lancé par Google. Stadia n'est pas nouveau dans WebRTC , mais d'autres peuvent-ils utiliser WebRTC de la même manière?
Thanh Nguyen a décidé de tester cette possibilité sur son projet open source CloudRetro. CloudRetro est basé sur Pion, la bibliothèque WebRTC populaire basée sur Go (merci à Sean de l'équipe de développement Pion pour son aide avec cet article). Dans cet article, Thanh donne un aperçu de l'architecture de son projet, et raconte également les choses utiles qu'il a apprises et les défis auxquels il a été confronté au cours de son travail.
introduction
L'année dernière, lorsque Google a annoncé Stadia, cela m'a époustouflé. L'idée est si unique et innovante que je me suis constamment demandé comment cela était possible avec les technologies existantes. Le désir de mieux comprendre ce sujet m'a incité à créer ma propre version du jeu cloud open source. Le résultat était fantastique. Ci-dessous, je voudrais partager le processus de travail sur mon projet d' un an .
TLDR: version courte diapositive avec points forts
Pourquoi le cloud gaming est l'avenir
Je crois que Cloud Gaming deviendra bientôt une nouvelle génération non seulement de jeux, mais également d'autres domaines de l'informatique. Le cloud gaming est le summum du modèle client / serveur. Ce modèle maximise le contrôle du backend et minimise le travail du frontend en hébergeant la logique du jeu sur un serveur distant et en diffusant des images / audio vers le client. Le serveur effectue des traitements lourds, le client n'est donc plus soumis à des contraintes matérielles.
Google Stadia vous permet essentiellement de jouer à des jeux AAA(c'est-à -dire des jeux à succès haut de gamme) sur une interface comme YouTube. La même méthodologie peut être appliquée à d'autres applications hors ligne lourdes, telles que le système d'exploitation ou la conception graphique 2D / 3D, etc. afin que nous puissions les exécuter de manière stable sur des appareils à faible spécification sur différentes plates-formes.
L'avenir de cette technologie: pouvez-vous imaginer si Microsoft Windows 10 fonctionnait dans le navigateur Chrome?
Le cloud gaming est techniquement difficile
Le jeu est l'un de ces rares domaines où une réponse rapide et constante de l'utilisateur est requise. Si nous rencontrons occasionnellement un délai de 2 secondes lorsque nous cliquons sur une page, c'est très bien. Les flux vidéo en direct ont tendance à prendre quelques secondes mais offrent toujours une bonne convivialité. Cependant, si le jeu est souvent retardé de 500 ms, il est tout simplement impossible de jouer. Notre objectif est d'obtenir une latence extrêmement faible afin que l'écart entre l'entrée et le support soit aussi petit que possible. Par conséquent, l'approche traditionnelle du streaming vidéo n'est pas applicable ici.
Modèle de jeu cloud commun
Projet open source CloudRetro
J'ai décidé de créer un échantillon de test d'un jeu en nuage pour tester si tout cela est possible sous des restrictions réseau aussi strictes. J'ai choisi Golang pour la preuve de concept parce que c'est le langage que je connais le plus et qui est bien adapté à cette implémentation pour de nombreuses autres raisons, comme cela s'est avéré plus tard. Go est simple et évolue très rapidement; Les tuyaux dans Go sont parfaits pour gérer le multithreading.
Le projet CloudRetro.io est un service de jeu en nuage open source pour les jeux rétro. Le but du projet est d'apporter l'expérience de jeu la plus confortable aux jeux rétro traditionnels et d'ajouter du multijoueur.
Vous pouvez en savoir plus sur le projet ici: https://github.com/giongto35/cloud-game .
Fonctionnalité CloudRetro
Pour présenter toute la puissance du jeu en nuage, CloudRetro utilise le jeu rétro. Cela permet une variété d'expériences de jeu uniques.
- Portabilité du jeu
- Lecture instantanée lors de l'ouverture d'une page; aucun téléchargement ni installation requis
- Fonctionne dans un navigateur mobile, aucun logiciel n'est donc nécessaire pour fonctionner
- Les sessions de jeu peuvent être partagées sur plusieurs appareils et stockées dans le cloud pour la prochaine connexion
- Le jeu peut être diffusé en streaming, ou vous pouvez y jouer par plusieurs utilisateurs à la fois:
- Crowdplay comme TwitchPlayPokemon, seulement plus multiplateforme et plus en temps réel
- Jeux hors ligne en ligne. De nombreux utilisateurs peuvent jouer sans configurer de réseau. Samurai Shodown peut désormais être joué par 2 joueurs sur le réseau CloudRetro
Version de démonstration d'un jeu multijoueur en ligne sur différents appareils
Infrastructure
Exigences et pile technologique
, .
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 , , , -. , , , , , , , . . , , .