Blog

Steam e Proton num servidor cloud com GPU, em streaming com Sunshine e Moonlight

Instalámos o Steam num servidor Linux sem ecrã com uma Intel UHD 770, corremos um jogo Windows com Proton (umu-launcher) e transmitimo-lo com Sunshine para o Moonlight: 85 a 96 fps em 1080p, 9 ms de processamento no servidor.

Steam e Proton num servidor cloud com GPU, em streaming com Sunshine e Moonlight

A Steam Deck e a nova Steam Machine da Valve correm jogos Windows em Linux com o Proton, a versão do Wine da Valve. O mesmo software funciona num servidor Linux num centro de dados: instale o Steam, deixe o Proton correr os seus jogos Windows na GPU do servidor e jogue em qualquer ecrã com o Sunshine (no servidor) e o Moonlight (do seu lado). Testámos num servidor Linux com GPU Intel UHD 770.

A versão Windows do SuperTuxKart com Proton no servidor Linux, tal como um cliente Moonlight a recebe (5 segundos, estatísticas do Moonlight no canto superior esquerdo).

Resultados em resumo

  • O cliente Steam arranca num servidor sem ecrã: cerca de 3 minutos entre o primeiro arranque e a janela de início de sessão, num ecrã Wayland virtual desenhado pela GPU.
  • O Proton corre o jogo Windows na GPU: 85 a 96 fps em 1080p (V-Sync desligado) no benchmark do SuperTuxKart, perto do Wine (cerca de 95 fps) e do Windows 11 (111 fps) na mesma GPU.
  • O streaming com o Sunshine não abranda o jogo: 83 a 95 fps durante um stream 1080p a 60 fps para o Moonlight, 9,3 ms de processamento no servidor em média, nenhuma imagem perdida.
  • Não podíamos iniciar sessão no Steam para este teste, por isso o Proton foi corrido com o umu-launcher, a ferramenta que corre o Proton da Valve sem o cliente Steam. Com o Steam, inicia sessão com a sua própria conta e ativa o Steam Play.
  • Para jogar, escolha o iGPU Power: com a parte de GPU do iGPU Start, enquanto outros servidores usavam a GPU, o mesmo benchmark desceu para 67 a 84 fps.

Configuração do teste

ElementoValor
ServidorLinux (Debian 13), 4 vCPU (como o iGPU Power), 10 GB de RAM, Intel UHD 770 (GPU partilhada), kernel 7.3, Mesa 25.0
Ecrãsway em modo headless + Xwayland, 1920 × 1080, desenhado pela GPU
Steampacote Debian steam-installer (cliente Steam, contrib/non-free)
Protonumu-launcher 1.4.4 (release do GitHub), que descarregou o UMU-Proton 10.0-4 e o Steam Linux Runtime 3.0
JogoSuperTuxKart 1.5, versão Windows, benchmark integrado (corrida gravada, 38 s), OpenGL, V-Sync desligado
StreamingSunshine 2026.914 no servidor (captura Wayland, H.264 codificado pela GPU com VA-API), Moonlight 6.2 num segundo servidor Linux, 1080p 60 fps
Redecliente e servidor no mesmo centro de dados: pela Internet, junte a latência da sua ligação

Outras máquinas virtuais usaram muito a GPU partilhada durante todo o teste (entre dois terços e 87 % do tempo da GPU quando o nosso servidor estava parado): os valores abaixo são os de uma GPU partilhada ocupada, não de uma GPU vazia.

1. Um ecrã para o Steam num servidor

O Steam precisa de um ecrã e recusa-se a correr como root. Criámos um utilizador normal e lançámos o sway, um compositor Wayland que funciona sem monitor e desenha com a GPU, mais o Xwayland para o Steam e os jogos Windows (o Xvfb desenharia no CPU):

dpkg --add-architecture i386
apt install sway xwayland steam-installer mesa-vulkan-drivers mesa-vulkan-drivers:i386 \
  libgl1-mesa-dri:i386 intel-media-va-driver-non-free
# como utilizador de jogo:
mkdir -p ~/.config/sway
printf 'output HEADLESS-1 resolution 1920x1080\nxwayland enable\n' > ~/.config/sway/config
WLR_BACKENDS=headless WLR_RENDERER=gles2 WLR_LIBINPUT_NO_DEVICES=1 \
  WLR_RENDER_DRM_DEVICE=/dev/dri/renderD128 sway &
DISPLAY=:0 steam &

No primeiro arranque, o Steam descarrega e atualiza o cliente (1,4 GB em ~/.local/share/Steam) e depois mostra a janela de início de sessão, cerca de 3 minutos e 20 segundos após o primeiro arranque.

Janela de início de sessão do Steam no ecrã virtual sway de um servidor cloud Linux
O cliente Steam no ecrã virtual do servidor, à espera do início de sessão (captura feita com grim).

Com a sua própria conta: inicie sessão (da primeira vez, através do Moonlight ou de um ambiente de trabalho remoto), depois em Steam → Definições → Compatibilidade, ative o Steam Play para todos os outros títulos e escolha uma versão do Proton. Os jogos Windows instalam-se e arrancam então como jogos Linux. Para jogar com comando no sofá, arranque o Steam em modo Big Picture (steam -gamepadui), que é também a interface da Steam Machine.

2. Proton sem conta Steam: umu-launcher

Não era possível iniciar sessão no Steam para este teste, por isso usámos o umu-launcher, o lançador que o Lutris e o Heroic usam para correr o Proton fora do Steam. Corre um jogo Windows com o Proton dentro do mesmo contentor Steam Linux Runtime que o Steam usa:

export WINEPREFIX=~/prefixes/stk GAMEID=umu-default
./umu-run supertuxkart.exe --screensize=1920x1080 --fullscreen --benchmark

Na primeira execução, o umu-launcher descarregou o UMU-Proton 10.0-4 (1,4 GB descomprimido) e o Steam Linux Runtime 3.0 “sniper” (800 MB) e criou o prefixo Windows (900 MB), em menos de um minuto com a ligação do servidor. O registo do jogo confirma que o Proton desenha na GPU:

IrrDriver: OpenGL renderer: Mesa Intel(R) UHD Graphics 770 (ADL-S GT1)
IrrDriver: OpenGL version string: 4.6 (Core Profile) Mesa 25.0.7
Versão Windows do SuperTuxKart com Proton num servidor cloud Linux com uma Intel UHD 770
O jogo Windows com Proton no servidor, em 1080p (captura do ecrã virtual).

3. Resultados

V-Sync desligado no jogo (swap-interval-vsync="0" no config.xml do SuperTuxKart): o ecrã do servidor é virtual, e o V-Sync só obriga o jogo a esperar por ele.

SuperTuxKart (versão Windows), 1080p, ProtonTypicalMostly stableSteady
Parte de GPU do iGPU Power, 2 execuções85 a 96 fps70 a 83 fps52 a 69 fps
Parte de GPU do iGPU Power, em streaming para o Moonlight, 2 execuções83 a 95 fps58 a 75 fps44 a 58 fps
Parte de GPU do iGPU Start, 4 execuções67 a 84 fps59 a 71 fps45 a 61 fps
Gráfico de barras: fps do SuperTuxKart em 1080p com Proton por parte de GPU, com streaming, comparado com Wine e Windows 11
Taxa de imagens média do SuperTuxKart por configuração (mais alto é melhor).

Para comparação, na mesma GPU: cerca de 95 fps com o Wine e 111 fps no Windows 11. O Proton é um Wine com os acrescentos da Valve; para um jogo OpenGL como este, a velocidade é a mesma.

O jogo usou em média cerca de 10 % dos 4 vCPU, cerca de 30 % com o Sunshine a capturar e codificar ao mesmo tempo. O servidor inteiro usou 3,2 GB de RAM durante o teste (sway, jogo, Sunshine).

4. Streaming com Sunshine e Moonlight

O Sunshine para Linux captura o ecrã do sway e codifica na GPU. A configuração:

capture = wlr
encoder = vaapi
adapter_name = /dev/dri/renderD128

Precisa do controlador multimédia da Intel (intel-media-va-driver-non-free); sem ele, o Sunshine não encontra nenhum codificador. Com ele:

Creating encoder [h264_vaapi]
vaapi vendor: Intel iHD driver for Intel(R) Gen Graphics - 25.2.3

Emparelhámos um cliente Moonlight instalado num segundo servidor Linux do mesmo centro de dados e anotámos as estatísticas durante o jogo:

Estatística do Moonlight (1080p, H.264, 60 fps)Valor
Imagens recebidas e mostradas59,8 fps
Processamento no servidor (captura + codificação), mín / média / máx4,2 / 9,3 / 14,8 ms
Imagens perdidas (rede ou jitter)0 %
Latência de rede (mesmo centro de dados)1 ms
Tempo de descodificação no cliente0,29 ms
Gráfico de barras: tempos do stream do Moonlight, processamento no servidor mín, média e máx, rede e descodificação
Para onde vai o tempo no stream do Moonlight (mais baixo é melhor).
Cliente Moonlight a mostrar o SuperTuxKart transmitido do servidor Linux, com as estatísticas de desempenho
O que o jogador vê no Moonlight: o jogo a correr com Proton no servidor, e as estatísticas.

Abra a interface web do Sunshine através de um túnel SSH (ssh -L 47990:localhost:47990 utilizador@o-seu-servidor) em vez de a expor na Internet. O Sunshine para Linux já traz uma entrada “Steam Big Picture” que pode escolher no Moonlight. A sua latência total dependerá sobretudo da sua ligação à Internet até ao servidor (Alemanha): uma boa fibra na Europa acrescenta normalmente 10 a 30 ms.

Limites a conhecer

  • Anti-batota: muitos jogos online com anti-batota recusam o Proton ou máquinas virtuais. Consulte o ProtonDB antes de comprar um jogo para isto.
  • É uma GPU integrada: adequada para jogos indie, jogos antigos e jogos 2D/3D da década de 2010, não para os grandes jogos AAA recentes em 1080p.
  • Som: o servidor não tem placa de som. Para ter som no Moonlight, corra o PipeWire ou o PulseAudio na sessão de jogo; não testámos o som aqui.

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.

Que plano?

Recomendamos o iGPU Power (4 vCPU, 14 GB de RAM, o dobro da parte de GPU do iGPU Start). Quando outros servidores usam a GPU, o tempo de GPU de cada um segue a sua parte: no nosso teste, o mesmo benchmark passou de 67 a 84 fps com a parte do Start para 85 a 96 fps com a do Power. O iGPU Start (2 vCPU, 8 GB) continua a chegar para jogos 2D e ferramentas leves.

Quer o servidor pronto a jogar? Peça-o por e-mail ao encomendar (contact@linuxgpu.eu): podemos entregar-lhe o servidor com o Steam, o ecrã virtual e o Sunshine já instalados e configurados. Inicia sessão no Steam com a sua própria conta e instala o Moonlight no seu computador, telemóvel ou box de TV.

Se um jogo não funcionar com o Proton, a opção Windows 11 (10 €, pagos uma única vez) dá-lhe um Windows completo: veja Windows 11 na nuvem com Sunshine e Moonlight.

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