Blog

Retro gaming en la nube: RetroArch en un servidor con GPU, transmitido con Sunshine y Moonlight

Ejecutamos RetroArch en un servidor Linux sin pantalla con Intel UHD 770 y lo transmitimos con Sunshine a Moonlight: más de 1.800 fps en emulación de Game Boy, unos 255 fps con el shader CRT crt-royale a 1080p, de 5 a 7 ms de procesamiento en el servidor.

Retro gaming en la nube: RetroArch en un servidor con GPU, transmitido con Sunshine y Moonlight

Tu colección de juegos retro en un solo lugar, jugable desde tu portátil, tu móvil o tu televisor, con las mismas partidas guardadas en todas partes: eso es lo que ofrece un pequeño servidor en la nube con GPU. Instalamos RetroArch en un servidor Linux con una Intel UHD 770 y sin monitor, y lo transmitimos con Sunshine (en el servidor) a Moonlight (en el lado del jugador). La GPU hace dos trabajos: dibuja la imagen, incluidos los shaders CRT que dan a los juegos antiguos el aspecto que tenían en un televisor de tubo, y codifica el flujo de vídeo.

Tobu Tobu Girl (homebrew gratuito de Game Boy) en RetroArch con el shader crt-royale, tal como lo recibe el cliente Moonlight (5 segundos, estadísticas de rendimiento de Moonlight arriba a la izquierda).

Usa tus propios juegos, obtenidos legalmente. Para esta prueba solo usamos juegos homebrew gratuitos, descargados de las páginas oficiales de sus autores: Tobu Tobu Girl (Game Boy, de Tangram Games, publicado gratis con su código fuente) y µCity (Game Boy Color, de código abierto). Muchos autores publican así juegos nuevos para consolas antiguas, y también puedes copiar tus propios cartuchos y discos con un dumper.

Resultados de un vistazo

  • La emulación no es el problema: con la V-Sync desactivada, RetroArch ejecutó un juego de Game Boy a 1.863 fps y uno de Game Boy Color a 1.807 fps a 1080p, unas 30 veces la velocidad de la consola.
  • La GPU importa para los shaders CRT: con crt-royale, uno de los shaders CRT más pesados, RetroArch seguía dibujando unos 255 fps a 1080p, cuatro veces lo necesario.
  • Transmitir cuesta poco: H.264 1080p 60 fps codificado por la GPU, de 4,6 a 6,5 ms de procesamiento en el servidor de media durante el juego (con o sin shader), ningún fotograma perdido, y solo entre el 13 y el 17 % de un núcleo de CPU para Sunshine.
  • iGPU Start basta para consolas de 8 y 16 bits; elige iGPU Power si también juegas a sistemas más pesados o quieres más margen cuando otros servidores usan la GPU.

Configuración de la prueba

ElementoValor
ServidorDebian 13, Linux 7.3, Intel UHD 770 (GPU compartida), 4 vCPU, 8 GB de RAM, sin monitor
EmuladorRetroArch 1.20.0 (paquetes de Debian), núcleos Gambatte (Game Boy) y mGBA (Game Boy Color)
Shaderscolección glsl-shaders de libretro (crt-royale, crt-lottes), controlador de vídeo OpenGL
Pantallasway headless (Wayland) a 1920×1080, dibujada por la GPU
StreamingSunshine 2026.914 en el servidor, Moonlight 6.2 en un cliente Linux, H.264 1080p 60 fps, decodificación por hardware
Redcliente y servidor en el mismo centro de datos: por Internet, suma la latencia de tu conexión

1. Una pantalla para un servidor que no tiene

Un servidor en la nube no tiene monitor, así que le damos uno virtual. Usamos sway, un pequeño escritorio Wayland, en modo «headless»: crea una pantalla de 1920×1080 en memoria y la dibuja con la GPU Intel. RetroArch se ejecuta en ella a pantalla completa, y Sunshine la captura directamente (capture = wlr) y la codifica en la GPU (encoder = vaapi):

# ~/.config/sunshine/sunshine.conf
capture = wlr
encoder = vaapi
adapter_name = /dev/dri/renderD128

Sunshine encuentra entonces los codificadores por hardware (h264_vaapi, hevc_vaapi). El streaming en AV1 no está disponible en esta GPU: usa H.264 o HEVC en Moonlight. Evita Xvfb, la «pantalla virtual» habitual para X11: lo dibuja todo con la CPU, y la GPU no se usaría para los shaders.

2. ¿A qué velocidad va la emulación?

Para medir lo que puede hacer el servidor, desactivamos la V-Sync y la sincronización de audio, y pedimos a RetroArch que ejecutara un número fijo de fotogramas lo más rápido posible, a pantalla completa a 1080p. Cronometramos 600 y 3.600 fotogramas y dividimos la diferencia, para que el tiempo de arranque (carga, compilación de shaders) no cuente.

RetroArch, 1080p, V-Sync desactivadaSin shadercrt-royalecrt-lottes
Game Boy, Tobu Tobu Girl (Gambatte)1.863 fps257 fpsde 80 a 116 fps
Game Boy Color, µCity (mGBA)1.807 fps253 fpsno medido
Gráfico de barras, escala logarítmica: fotogramas por segundo de RetroArch en 1080p con V-Sync desactivado, por núcleo y shader
RetroArch en 1080p, V-Sync desactivado (escala logarítmica): unos 1.800 fps sin shader, unos 255 fps con crt-royale, de 80 a 116 fps con crt-lottes. La línea discontinua marca los 60 fps que necesita un juego.

La emulación en sí casi no cuesta nada: estas consolas son diminutas para un procesador moderno. El shader CRT es trabajo de la GPU: redibuja cada píxel de la pantalla 1080p con las líneas de barrido, la máscara de sombra y el brillo de un televisor de tubo. Incluso con crt-royale, el servidor se mantiene muy por encima de los 60 fps necesarios. Las dos pasadas de crt-lottes dieron resultados distintos (80 y 116 fps): la GPU es compartida, y otros servidores de prueba la estaban usando en ese momento.

La V-Sync desactivada es solo para medir. Para jugar, configura RetroArch para que siga la tasa propia del juego («Sync to Exact Content Framerate», vrr_runloop_enable = "true"): el juego va entonces a la velocidad de la consola (59,73 Hz en una Game Boy), y Moonlight lo muestra con fluidez en tu pantalla.

Tobu Tobu Girl con el shader CRT crt-royale, transmitido desde el servidor en la nube a Moonlight
Con crt-royale: líneas de barrido y brillo del fósforo, dibujados por la GPU del servidor, y después codificados y enviados a Moonlight.

3. Transmitir con Moonlight: lo que cuesta

Lanzamos cada juego desde Moonlight (cada uno es una «aplicación» de Sunshine, ver más abajo), jugamos y anotamos las estadísticas de rendimiento de Moonlight y el uso de CPU del servidor:

Moonlight, 1080p 60 fps H.264Juego, sin shaderJuego, crt-royaleMenú de RetroArch
Procesamiento en el servidor (captura + codificación), mediade 4,6 a 6,5 msde 5,8 a 6,4 ms12,2 ms
Procesamiento en el servidor, mín / máx4,3 / 7,1 ms4,2 / 11,7 ms4,5 / 21,5 ms
Fotogramas perdidos por la red o por jitter0 %0 %0 %
Tiempo de decodificación en el clientede 0,20 a 0,23 msde 0,21 a 0,24 ms0,29 ms
CPU de Sunshine (parte de un núcleo)14 %17 %no medido
CPU de RetroArch (parte de un núcleo)4 %6 %no medido
Gráfico de barras: tiempo de procesamiento por fotograma en el servidor durante el streaming, sin shader, con crt-royale y en el menú de RetroArch
Procesamiento por fotograma en el servidor (captura y codificación) según Moonlight: muy por debajo de los 16,7 ms de un fotograma a 60 fps en todos los casos.

El flujo usaba 15 Mbit/s, el valor por defecto de Sunshine a 1080p. El codificador es una parte de la GPU distinta de la que dibuja los shaders: por eso el shader CRT no ralentiza el flujo. El menú de RetroArch, con su fondo animado, tarda un poco más en capturarse que un juego de Game Boy. Tu latencia total dependerá sobre todo de tu conexión a Internet hasta el servidor (en Alemania): una buena conexión de fibra en Europa suele añadir de 10 a 30 ms.

El menú de RetroArch transmitido con Moonlight desde un servidor Linux con GPU sin pantalla
El menú principal de RetroArch en Moonlight, a 1080p y 60 fps. Todo se controla con el mando o el teclado del jugador.

4. Una aplicación de Sunshine por juego

Sunshine lanza un programa cuando Moonlight pide una «aplicación». Creamos una para el menú de RetroArch y una por juego, para poder lanzar un juego directamente desde Moonlight (~/.config/sunshine/apps.json):

{
  "name": "Tobu Tobu Girl (CRT)",
  "cmd": "retroarch --appendconfig=/root/play.cfg --set-shader /root/glsl-shaders/crt/crt-royale.glslp -L /usr/lib/x86_64-linux-gnu/libretro/gambatte_libretro.so /root/roms/tobu.gb",
  "auto-detach": "true",
  "wait-all": "true"
}

play.cfg contiene los pocos ajustes de RetroArch que importan para jugar a través de Sunshine:

video_driver = "gl"
video_fullscreen = "true"
video_vsync = "false"
vrr_runloop_enable = "true"
video_scale_integer = "true"
video_shader_enable = "true"
pause_nonactive = "false"
audio_driver = "pulse"
config_save_on_exit = "false"

pause_nonactive = "false" impide que RetroArch se ponga en pausa cuando cree haber perdido el foco, y config_save_on_exit = "false" evita que una prueba o un cambio en el menú sobrescriba tus ajustes. Sunshine crea un mando, un teclado y un ratón virtuales en el servidor para el jugador de Moonlight, así que tu propio mando funciona como si estuviera conectado al servidor. Si prefieres una biblioteca de juegos al estilo de una consola, con carátulas, puedes añadir ES-DE (EmulationStation Desktop Edition) como otra aplicación de Sunshine por encima de RetroArch; no lo incluimos en esta prueba.

Tobu Tobu Girl sin shader, ampliado a 1080p con escalado entero, en Moonlight
Sin shader: la imagen de la Game Boy ampliada con escalado entero (píxeles nítidos), a la tasa propia de la consola (59,73 fps).
Pantalla de título de Tobu Tobu Girl lanzada directamente desde Moonlight, con las estadísticas de rendimiento
Lanzado directamente desde la lista de aplicaciones de Moonlight: la pantalla de título del juego, en 1080p y 60 fps.

5. ¿iGPU Start o iGPU Power?

Para consolas de 8 y 16 bits, iGPU Start (2 vCPU, 8 GB de RAM, 14,99 € al mes sin IVA) es suficiente: RetroArch y Sunshine juntos usaban alrededor de un cuarto de núcleo en nuestra prueba. iGPU Power (4 vCPU, 14 GB de RAM, el doble de cuota de GPU que Start, 29,99 € al mes sin IVA) es la mejor opción si usas shaders CRT pesados, juegas a sistemas más exigentes o quieres que el flujo se mantenga estable cuando otros servidores usan la GPU al mismo tiempo.

6. Ponerlo en marcha en un servidor Linux GPU

¿Lo quieres listo para jugar? Pídelo por correo al hacer el pedido (contact@linuxgpu.eu): podemos entregarte el servidor con todo lo siguiente ya instalado y configurado (pantalla virtual, RetroArch, shaders, Sunshine). Solo tienes que instalar Moonlight en tu ordenador, móvil o TV box, emparejarlo y añadir tus propios juegos.

Para hacerlo tú mismo:

  1. Instala RetroArch y los núcleos: apt install retroarch libretro-gambatte libretro-mgba libretro-nestopia, y los shaders: git clone https://github.com/libretro/glsl-shaders.
  2. Inicia una sesión de sway headless en la GPU (WLR_BACKENDS=headless WLR_RENDER_DRM_DEVICE=/dev/dri/renderD128 sway) con una salida de 1920×1080.
  3. Instala Sunshine (paquete para Debian 13 de sus releases oficiales en GitHub), con la configuración de arriba, y añade una aplicación por juego.
  4. Abre la interfaz web de Sunshine a través de un túnel SSH (ssh -L 47990:localhost:47990 you@your-server), crea la cuenta de Sunshine y empareja Moonlight (Windows, macOS, Linux, Android, iOS, cajas de TV).
  5. Copia tus juegos al servidor (scp) y juega.

Tu servidor es accesible por IPv6 por defecto. Si tu conexión no tiene IPv6, añade la opción de IPv4 dedicada, o conéctate a través de Tailscale sin abrir ningún puerto: consulta jugar en tu servidor en la nube desde cualquier lugar con Moonlight y Tailscale.

Para juegos de PC, lee Windows 11 en la nube con Sunshine y Moonlight y ejecutar juegos de Windows en un servidor Linux GPU con Wine.

Sistemas listos para jugar desde el primer momento. Los sistemas que instalamos por defecto ya están optimizados para ello: Debian 13 con un kernel reciente (7.3), los drivers de GPU de Intel y Mesa (OpenGL, Vulkan, codificación de vídeo VA-API), y Windows 11 (opción) con el driver gráfico de Intel y el Escritorio remoto renderizado en la GPU. Sin buscar drivers: instala tu juego y Sunshine, y a jugar.

Pruébalo

Ver los planes: iGPU Start cuesta 14,99 € e iGPU Power 29,99 € al mes sin IVA.