Blog

Jogos retro na nuvem: RetroArch num servidor com GPU, transmitido com Sunshine e Moonlight

Corremos o RetroArch num servidor Linux sem ecrã com Intel UHD 770 e transmitimo-lo com o Sunshine para o Moonlight: mais de 1.800 fps em emulação de Game Boy, cerca de 255 fps com o shader CRT crt-royale em 1080p, 5 a 7 ms de processamento no servidor.

Jogos retro na nuvem: RetroArch num servidor com GPU, transmitido com Sunshine e Moonlight

A sua coleção de jogos retro num só lugar, jogável a partir do seu portátil, do seu telemóvel ou da sua televisão, com os mesmos jogos guardados em todo o lado: é isso que um pequeno servidor na nuvem com GPU lhe dá. Instalámos o RetroArch num servidor Linux com uma Intel UHD 770 e sem monitor, e transmitimo-lo com o Sunshine (no servidor) para o Moonlight (do lado do jogador). A GPU faz dois trabalhos: desenha a imagem, incluindo os shaders CRT que dão aos jogos antigos o aspeto que tinham numa televisão de tubo, e codifica o fluxo de vídeo.

Tobu Tobu Girl (homebrew gratuito para Game Boy) no RetroArch com o shader crt-royale, tal como recebido pelo cliente Moonlight (5 segundos, estatísticas de desempenho do Moonlight no canto superior esquerdo).

Use os seus próprios jogos, obtidos legalmente. Para este teste usámos apenas jogos homebrew gratuitos, descarregados das páginas oficiais dos seus autores: Tobu Tobu Girl (Game Boy, da Tangram Games, lançado gratuitamente com o código-fonte) e µCity (Game Boy Color, código aberto). Muitos autores publicam assim jogos novos para consolas antigas, e também pode copiar os seus próprios cartuchos e discos com um dumper.

Resultados em resumo

  • A emulação não é o problema: com o V-Sync desligado, o RetroArch correu um jogo de Game Boy a 1.863 fps e um de Game Boy Color a 1.807 fps em 1080p, cerca de 30 vezes a velocidade da consola.
  • É nos shaders CRT que a GPU conta: com o crt-royale, um dos shaders CRT mais pesados, o RetroArch ainda desenhava cerca de 255 fps em 1080p, quatro vezes o necessário.
  • Transmitir custa pouco: H.264 1080p 60 fps codificado pela GPU, 4,6 a 6,5 ms de processamento no servidor em média durante o jogo (com ou sem shader), nenhuma imagem perdida, e apenas 13 a 17% de um núcleo de CPU para o Sunshine.
  • O iGPU Start chega para consolas de 8 e 16 bits; escolha o iGPU Power se também joga sistemas mais pesados ou quer mais margem quando outros servidores usam a GPU.

Configuração do teste

ElementoValor
ServidorDebian 13, Linux 7.3, Intel UHD 770 (GPU partilhada), 4 vCPU, 8 GB de RAM, sem monitor
EmuladorRetroArch 1.20.0 (pacotes Debian), núcleos Gambatte (Game Boy) e mGBA (Game Boy Color)
Shaderscoleção glsl-shaders da libretro (crt-royale, crt-lottes), controlador de vídeo OpenGL
Ecrãsway headless (Wayland) em 1920×1080, desenhado pela GPU
StreamingSunshine 2026.914 no servidor, Moonlight 6.2 num cliente Linux, H.264 1080p 60 fps, descodificação por hardware
Redecliente e servidor no mesmo centro de dados: pela Internet, some a latência da sua ligação

1. Um ecrã para um servidor que não tem nenhum

Um servidor na nuvem não tem monitor, por isso damos-lhe um virtual. Usámos o sway, um pequeno ambiente de trabalho Wayland, em modo «headless»: cria um ecrã de 1920×1080 em memória e desenha-o com a GPU Intel. O RetroArch corre nele em ecrã inteiro, e o Sunshine captura-o diretamente (capture = wlr) e codifica-o na GPU (encoder = vaapi):

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

O Sunshine encontra então os codificadores por hardware (h264_vaapi, hevc_vaapi). O streaming em AV1 não está disponível nesta GPU: use H.264 ou HEVC no Moonlight. Evite o Xvfb, o «ecrã virtual» habitual para X11: desenha tudo com o CPU, e a GPU não seria usada para os shaders.

2. A que velocidade corre a emulação?

Para medir o que o servidor consegue fazer, desligámos o V-Sync e a sincronização de áudio, e pedimos ao RetroArch que corresse um número fixo de imagens o mais depressa possível, em ecrã inteiro em 1080p. Cronometrámos 600 e 3.600 imagens e dividimos a diferença, para que o tempo de arranque (carregamento, compilação dos shaders) não conte.

RetroArch, 1080p, V-Sync desligadoSem shadercrt-royalecrt-lottes
Game Boy, Tobu Tobu Girl (Gambatte)1.863 fps257 fps80 a 116 fps
Game Boy Color, µCity (mGBA)1.807 fps253 fpsnão medido
Gráfico de barras, escala logarítmica: fotogramas por segundo do RetroArch em 1080p com V-Sync desligado, por núcleo e shader
RetroArch em 1080p, V-Sync desligado (escala logarítmica): cerca de 1.800 fps sem shader, cerca de 255 fps com crt-royale, 80 a 116 fps com crt-lottes. A linha tracejada marca os 60 fps de que um jogo precisa.

A emulação em si quase não custa nada: estas consolas são minúsculas para um processador moderno. O shader CRT é trabalho para a GPU: redesenha cada píxel do ecrã 1080p com as linhas de varrimento, a máscara de sombra e o brilho de uma televisão de tubo. Mesmo com o crt-royale, o servidor fica muito acima dos 60 fps necessários. As duas passagens do crt-lottes deram resultados diferentes (80 e 116 fps): a GPU é partilhada, e outros servidores de teste estavam a usá-la nesse momento.

O V-Sync desligado serve apenas para medir. Para jogar, configure o RetroArch para seguir a taxa própria do jogo («Sync to Exact Content Framerate», vrr_runloop_enable = "true"): o jogo corre então à velocidade da consola (59,73 Hz numa Game Boy), e o Moonlight mostra-o de forma fluida no seu ecrã.

Tobu Tobu Girl com o shader CRT crt-royale, transmitido do servidor na nuvem para o Moonlight
Com o crt-royale: linhas de varrimento e brilho do fósforo, desenhados pela GPU do servidor, depois codificados e enviados para o Moonlight.

3. Transmitir com o Moonlight: quanto custa

Lançámos cada jogo a partir do Moonlight (cada um é uma «aplicação» do Sunshine, ver abaixo), jogámos e anotámos as estatísticas de desempenho do Moonlight e a utilização de CPU do servidor:

Moonlight, 1080p 60 fps H.264Jogo, sem shaderJogo, crt-royaleMenu do RetroArch
Processamento no servidor (captura + codificação), média4,6 a 6,5 ms5,8 a 6,4 ms12,2 ms
Processamento no servidor, mín / máx4,3 / 7,1 ms4,2 / 11,7 ms4,5 / 21,5 ms
Imagens perdidas pela rede ou por jitter0%0%0%
Tempo de descodificação no cliente0,20 a 0,23 ms0,21 a 0,24 ms0,29 ms
CPU do Sunshine (parte de um núcleo)14%17%não medido
CPU do RetroArch (parte de um núcleo)4%6%não medido
Gráfico de barras: tempo de processamento por fotograma no servidor durante o streaming, sem shader, com crt-royale e no menu do RetroArch
Processamento por fotograma no servidor (captura e codificação) segundo o Moonlight: bem abaixo dos 16,7 ms de um fotograma a 60 fps em todos os casos.

O fluxo usava 15 Mbit/s, o valor por omissão do Sunshine em 1080p. O codificador é uma parte da GPU distinta da que desenha os shaders: é por isso que o shader CRT não abranda o fluxo. O menu do RetroArch, com o seu fundo animado, demora um pouco mais a capturar do que um jogo de Game Boy. A sua latência total vai depender sobretudo da sua ligação à Internet até ao servidor (na Alemanha): uma boa ligação de fibra na Europa acrescenta normalmente 10 a 30 ms.

O menu do RetroArch transmitido com o Moonlight a partir de um servidor Linux com GPU sem ecrã
O menu principal do RetroArch no Moonlight, em 1080p e 60 fps. Tudo se controla com o comando ou o teclado do jogador.

4. Uma aplicação do Sunshine por jogo

O Sunshine lança um programa quando o Moonlight pede uma «aplicação». Criámos uma para o menu do RetroArch e uma por jogo, para que um jogo possa ser lançado diretamente a partir do 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 contém as poucas definições do RetroArch que importam para jogar através do 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" impede o RetroArch de entrar em pausa quando julga ter perdido o foco, e config_save_on_exit = "false" evita que um teste ou uma alteração no menu substitua as suas definições. O Sunshine cria um comando, um teclado e um rato virtuais no servidor para o jogador do Moonlight, por isso o seu próprio comando funciona como se estivesse ligado ao servidor. Se preferir uma biblioteca de jogos ao estilo de uma consola, com capas, pode acrescentar o ES-DE (EmulationStation Desktop Edition) como outra aplicação do Sunshine por cima do RetroArch; não o incluímos neste teste.

Tobu Tobu Girl sem shader, ampliado para 1080p com escala inteira, no Moonlight
Sem shader: a imagem da Game Boy ampliada com escala inteira (píxeis nítidos), à taxa própria da consola (59,73 fps).
Ecrã de título de Tobu Tobu Girl iniciado diretamente a partir do Moonlight, com as estatísticas de desempenho
Iniciado diretamente a partir da lista de aplicações do Moonlight: o ecrã de título do jogo, em 1080p e 60 fps.

5. iGPU Start ou iGPU Power?

Para consolas de 8 e 16 bits, o iGPU Start (2 vCPU, 8 GB de RAM, 14,99 € s/ IVA por mês) chega: o RetroArch e o Sunshine juntos usavam cerca de um quarto de um núcleo no nosso teste. O iGPU Power (4 vCPU, 14 GB de RAM, o dobro da quota de GPU do Start, 29,99 € s/ IVA por mês) é a melhor escolha se usa shaders CRT pesados, joga sistemas mais exigentes, ou quer que o fluxo se mantenha estável quando outros servidores usam a GPU ao mesmo tempo.

6. Configurar num servidor Linux GPU

Quer o servidor pronto a jogar? Peça-o por e-mail ao encomendar (contact@linuxgpu.eu): podemos entregar-lhe o servidor com tudo o que se segue já instalado e configurado (ecrã virtual, RetroArch, shaders, Sunshine). Só tem de instalar o Moonlight no seu computador, telemóvel ou box de TV, emparelhá-lo e acrescentar os seus próprios jogos.

Para fazer por si:

  1. Instale o RetroArch e os núcleos: apt install retroarch libretro-gambatte libretro-mgba libretro-nestopia, e os shaders: git clone https://github.com/libretro/glsl-shaders.
  2. Inicie uma sessão sway headless na GPU (WLR_BACKENDS=headless WLR_RENDER_DRM_DEVICE=/dev/dri/renderD128 sway) com uma saída de 1920×1080.
  3. Instale o Sunshine (pacote Debian 13 das releases oficiais no GitHub), com a configuração acima, e acrescente uma aplicação por jogo.
  4. Abra a interface web do Sunshine através de um túnel SSH (ssh -L 47990:localhost:47990 you@your-server), crie a conta do Sunshine e emparelhe o Moonlight (Windows, macOS, Linux, Android, iOS, boxes de TV).
  5. Copie os seus jogos para o servidor (scp) e jogue.

O seu servidor é acessível por IPv6 por omissão. Se a sua ligação não tiver IPv6, acrescente a opção de IPv4 dedicado, ou ligue-se através do Tailscale sem abrir nenhuma porta: veja jogar no seu servidor na nuvem a partir de qualquer lugar com o Moonlight e o Tailscale.

Para jogos de PC, leia Windows 11 na nuvem com Sunshine e Moonlight e correr jogos Windows num servidor Linux GPU com o Wine.

Sistemas prontos para jogar logo à partida. Os sistemas que instalamos por predefinição já estão otimizados para isso: Debian 13 com um kernel recente (7.3), os drivers de GPU da Intel e o Mesa (OpenGL, Vulkan, codificação de vídeo VA-API), e o Windows 11 (opção) com o driver gráfico da Intel e o Ambiente de Trabalho Remoto renderizado na GPU. Nada de procurar drivers: instale o seu jogo e o Sunshine, e jogue.

Experimentar

Ver os planos: o iGPU Start custa 14,99 € e o iGPU Power 29,99 € s/ IVA por mês.