Jogos em nuvem de código aberto em WebRTC: p2p, multijogador, latência zero



Software como serviço, infraestrutura como serviço, plataforma como serviço, plataforma de comunicação como serviço, videoconferência como serviço, e os jogos em nuvem como serviço? Já houve várias tentativas de criar jogos em nuvem (Cloud Gaming), por exemplo Stadia, recentemente lançado pelo Google. O Stadia não é novo no WebRTC , mas outras pessoas podem usar o WebRTC da mesma maneira?



Thanh Nguyen decidiu testar essa possibilidade em seu projeto de código aberto CloudRetro. CloudRetro é baseado em Pion, a popular biblioteca WebRTC baseada em Go (obrigado a Sean da equipe de desenvolvimento do Pion por ajudar com este artigo). Neste artigo, Thanh oferece uma visão geral da arquitetura de seu projeto e também conta as coisas úteis que aprendeu e os desafios que encontrou durante seu trabalho.



Introdução



No ano passado, quando o Google anunciou o Stadia, fiquei impressionado. A ideia é tão única e inovadora que sempre me pergunto como isso é possível com as tecnologias existentes. O desejo de entender melhor este tópico me levou a criar minha própria versão do jogo em nuvem de código aberto. O resultado foi fantástico. Abaixo, eu gostaria de compartilhar o processo de trabalho em meu projeto de um ano .



TLDR: versão curta do slide com destaques



Por que os jogos em nuvem são o futuro



Acredito que Cloud Gaming logo se tornará uma nova geração não apenas de jogos, mas também de outras áreas da ciência da computação. Os jogos em nuvem são o ápice do modelo cliente / servidor. Este modelo maximiza o controle de back-end e minimiza o trabalho de front-end hospedando a lógica do jogo em um servidor remoto e transmitindo imagens / áudio para o cliente. O servidor faz um processamento pesado, portanto o cliente não está mais sujeito às restrições de hardware.



O Google Stadia essencialmente permite que você jogue jogos AAA(ou seja, jogos de grande sucesso de última geração) em uma interface como o YouTube. A mesma metodologia pode ser aplicada a outros aplicativos off-line pesados, como sistema operacional ou design gráfico 2D / 3D, etc. para que possamos executá-los de forma estável em dispositivos de baixa especificação em diferentes plataformas.





O futuro dessa tecnologia: você pode imaginar se o Microsoft Windows 10 rodasse no navegador Chrome?



Jogos em nuvem são tecnicamente desafiadores



O jogo é uma daquelas áreas raras onde uma resposta rápida e constante do usuário é necessária. Se ocasionalmente encontrarmos um atraso de 2 segundos ao clicar em uma página, tudo bem. As transmissões de vídeo ao vivo tendem a demorar alguns segundos, mas ainda oferecem uma boa usabilidade. No entanto, se o jogo costuma atrasar 500 ms, é simplesmente impossível jogar. Nosso objetivo é atingir uma latência extremamente baixa para que a lacuna entre a entrada e a mídia seja a menor possível. Portanto, a abordagem tradicional para streaming de vídeo não se aplica aqui.





Modelo comum de jogo na nuvem



Projeto de código aberto CloudRetro



Decidi criar uma amostra de teste de um jogo em nuvem para testar se tudo isso é possível com essas restrições de rede rígidas. Escolhi Golang como prova de conceito, pois é minha linguagem mais conhecida e adequada para essa implementação por muitos outros motivos, como descobri mais tarde. Go é simples e evolui muito rapidamente; tubos em Go são ótimos para gerenciar multithreading.



O projeto CloudRetro.io é um serviço de jogos em nuvem de código aberto para jogos retro. O objetivo do projeto é trazer a experiência de jogo mais confortável para jogos retro tradicionais e adicionar multiplayer.

Você pode aprender mais sobre o projeto aqui: https://github.com/giongto35/cloud-game .



Funcionalidade CloudRetro



Para mostrar todo o poder dos jogos em nuvem, o CloudRetro usa jogos retro. Isso permite uma variedade de experiências de jogo exclusivas.



  • Portabilidade do jogo

    • Reprodução instantânea ao abrir uma página; nenhum download e instalação necessários
    • Funciona em um navegador móvel, portanto, nenhum software é necessário para executar


  • As sessões de jogo podem ser compartilhadas em vários dispositivos e armazenadas na nuvem para o próximo login
  • O jogo pode ser transmitido ou você pode jogá-lo por vários usuários ao mesmo tempo:

    • Crowdplay como TwitchPlayPokemon, apenas mais multiplataforma e mais em tempo real
    • Jogos offline online. Muitos usuários podem jogar sem configurar uma rede. Samurai Shodown agora pode ser jogado por 2 jogadores na rede CloudRetro




    Versão de demonstração de um jogo multijogador online em diferentes dispositivos



    A infraestrutura



    Requisitos e pilha de tecnologia



    , .



    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