Software como servicio, infraestructura como servicio, plataforma como servicio, plataforma de comunicación como servicio, videoconferencia como servicio, ¿qué pasa con los juegos en la nube como servicio? Ya ha habido varios intentos de crear juegos en la nube (Cloud Gaming), por ejemplo, Stadia, lanzado recientemente por Google. Stadia no es nuevo en WebRTC , pero ¿otros pueden usar WebRTC de la misma manera?
Thanh Nguyen decidió probar esta posibilidad en su proyecto de código abierto CloudRetro. CloudRetro se basa en Pion, la popular biblioteca WebRTC basada en Go (gracias a Sean, del equipo de desarrollo de Pion, por ayudarnos con este artículo). En este artículo, Thanh ofrece una descripción general de la arquitectura de su proyecto y también cuenta qué cosas útiles aprendió y qué desafíos enfrentó durante su trabajo.
Introducción
El año pasado, cuando Google anunció Stadia, me dejó alucinado. La idea es tan única e innovadora que constantemente me preguntaba cómo es posible con las tecnologías existentes. El deseo de comprender mejor este tema me impulsó a crear mi propia versión del juego en la nube de código abierto. El resultado fue fantástico. A continuación, me gustaría compartir el proceso de trabajo en mi proyecto de un año .
TLDR: versión de diapositiva corta con resaltados
Por qué los juegos en la nube son el futuro
Creo que Cloud Gaming pronto se convertirá en una nueva generación no solo de juegos, sino también de otras áreas de la informática. Los juegos en la nube son el pináculo del modelo cliente / servidor. Este modelo maximiza el control de backend y minimiza el trabajo de frontend al alojar la lógica del juego en un servidor remoto y transmitir imágenes / audio al cliente. El servidor realiza un procesamiento pesado, por lo que el cliente ya no está sujeto a restricciones de hardware.
Google Stadia esencialmente te permite jugar juegos AAA(es decir, juegos de gran éxito de taquilla de alta gama) en una interfaz como YouTube. La misma metodología se puede aplicar a otras aplicaciones pesadas fuera de línea, como el sistema operativo o el diseño gráfico 2D / 3D, etc. para que podamos ejecutarlos de forma estable en dispositivos de baja especificación en diferentes plataformas.
El futuro de esta tecnología: ¿te imaginas si Microsoft Windows 10 se ejecutara en el navegador Chrome?
Los juegos en la nube son un desafío técnico
Los juegos son una de esas áreas raras donde se requiere una respuesta rápida y constante del usuario. Si de vez en cuando encontramos un retraso de 2 segundos al hacer clic en una página, está bien. Las transmisiones de video en vivo tienden a demorarse unos segundos, pero aún ofrecen una buena cantidad de usabilidad. Sin embargo, si el juego se retrasa a menudo 500 ms, es simplemente imposible jugar. Nuestro objetivo es lograr una latencia extremadamente baja para que la brecha entre la entrada y los medios sea lo más pequeña posible. Por lo tanto, el enfoque tradicional de transmisión de video no es aplicable aquí.
Plantilla de juego en la nube común
Proyecto de código abierto CloudRetro
Decidí crear una muestra de prueba de un juego en la nube para probar si todo esto es posible con restricciones de red tan estrictas. Elegí Golang para la prueba de concepto, ya que es mi lenguaje más familiar y muy adecuado para esta implementación por muchas otras razones, como se vio más adelante. Go es simple y evoluciona muy rápidamente; Las tuberías en Go son excelentes para administrar subprocesos múltiples.
El proyecto CloudRetro.io es un servicio de juegos en la nube de código abierto para juegos retro. El objetivo del proyecto es llevar la experiencia de juego más cómoda a los juegos retro tradicionales y agregar multijugador.
Puede obtener más información sobre el proyecto aquí: https://github.com/giongto35/cloud-game .
Funcionalidad CloudRetro
Para mostrar todo el poder de los juegos en la nube, CloudRetro utiliza juegos retro. Esto permite una variedad de experiencias de juego únicas.
- Portabilidad del juego
- Reproducción instantánea al abrir una página; no se necesita descarga e instalación
- Funciona en un navegador móvil, por lo que no se necesita software para ejecutarse
- Las sesiones de juego se pueden compartir en varios dispositivos y almacenar en la nube para el próximo inicio de sesión
- El juego puede transmitirse o puede jugarlo varios usuarios a la vez:
- Crowdplay como TwitchPlayPokemon, solo que más multiplataforma y más en tiempo real
- Juegos sin conexión en línea. Muchos usuarios pueden jugar sin configurar una red. Samurai Shodown ahora puede ser jugado por 2 jugadores en la red CloudRetro
Versión de demostración de un juego multijugador en línea en diferentes dispositivos
Infraestructura
Pila de requisitos y tecnología
, .
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 , , , -. , , , , , , , . . , , .