Jeux en nuage open source sur WebRTC: p2p, multijoueur, latence nulle



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 , , , -. , , , , , , , . . , , .



All Articles