Blog

Retrogaming in de cloud: RetroArch op een GPU-server, gestreamd met Sunshine en Moonlight

We draaiden RetroArch op een Linux-server zonder scherm met Intel UHD 770 en streamden het met Sunshine naar Moonlight: meer dan 1.800 fps bij Game Boy-emulatie, ongeveer 255 fps met de CRT-shader crt-royale op 1080p, 5 tot 7 ms verwerking op de server.

Retrogaming in de cloud: RetroArch op een GPU-server, gestreamd met Sunshine en Moonlight

Je verzameling retrogames op één plek, speelbaar vanaf je laptop, je telefoon of je tv, met overal dezelfde savegames: dat geeft een kleine cloudserver met GPU je. We installeerden RetroArch op een Linux-server met een Intel UHD 770 en zonder monitor, en streamden het met Sunshine (op de server) naar Moonlight (aan de kant van de speler). De GPU doet twee dingen: hij tekent het beeld, inclusief de CRT-shaders die oude games laten lijken zoals ze er op een beeldbuis-tv uitzagen, en hij codeert de videostream.

Tobu Tobu Girl (gratis Game Boy-homebrew) in RetroArch met de shader crt-royale, zoals ontvangen door de Moonlight-client (5 seconden, prestatie-overlay van Moonlight linksboven).

Gebruik je eigen, legaal verkregen games. Voor deze test gebruikten we alleen gratis homebrew-games, gedownload van de officiële pagina’s van hun makers: Tobu Tobu Girl (Game Boy, van Tangram Games, gratis uitgebracht met de broncode) en µCity (Game Boy Color, open source). Veel makers brengen op deze manier nieuwe games uit voor oude consoles, en je kunt ook je eigen cartridges en discs kopiëren met een dumper.

De resultaten in het kort

  • Emulatie is het probleem niet: met V-Sync uit draaide RetroArch een Game Boy-game op 1.863 fps en een Game Boy Color-game op 1.807 fps op 1080p, ongeveer 30 keer de snelheid van de console.
  • Bij CRT-shaders doet de GPU ertoe: met crt-royale, een van de zwaarste CRT-shaders, tekende RetroArch op 1080p nog ongeveer 255 fps, vier keer wat nodig is.
  • Streamen kost weinig: 1080p 60 fps H.264 gecodeerd door de GPU, gemiddeld 4,6 tot 6,5 ms verwerking op de server tijdens het spelen (met of zonder shader), geen enkel frame verloren, en maar 13 tot 17% van één CPU-kern voor Sunshine.
  • iGPU Start is genoeg voor 8- en 16-bitconsoles; kies iGPU Power als je ook zwaardere systemen speelt of meer marge wilt als andere servers de GPU gebruiken.

Testopstelling

OnderdeelWaarde
ServerDebian 13, Linux 7.3, Intel UHD 770 (gedeelde GPU), 4 vCPU, 8 GB RAM, geen monitor
EmulatorRetroArch 1.20.0 (Debian-pakketten), cores Gambatte (Game Boy) en mGBA (Game Boy Color)
Shaderslibretro-collectie glsl-shaders (crt-royale, crt-lottes), OpenGL-videodriver
Schermheadless sway (Wayland) op 1920×1080, getekend door de GPU
StreamingSunshine 2026.914 op de server, Moonlight 6.2 op een Linux-client, H.264 1080p 60 fps, hardwaredecodering
Netwerkclient en server in hetzelfde datacenter: via internet komt de latentie van je verbinding erbij

1. Een scherm voor een server die er geen heeft

Een cloudserver heeft geen monitor, dus geven we hem een virtuele. We gebruikten sway, een kleine Wayland-desktop, in “headless”-modus: die maakt een scherm van 1920×1080 in het geheugen en tekent het met de Intel-GPU. RetroArch draait er schermvullend op, en Sunshine neemt het direct op (capture = wlr) en codeert het op de GPU (encoder = vaapi):

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

Sunshine vindt dan de hardware-encoders (h264_vaapi, hevc_vaapi). Streamen in AV1 is niet beschikbaar op deze GPU: gebruik H.264 of HEVC in Moonlight. Vermijd Xvfb, het gebruikelijke “virtuele scherm” voor X11: dat tekent alles met de CPU, en de GPU zou niet voor de shaders worden gebruikt.

2. Hoe snel is de emulatie?

Om te meten wat de server kan, zetten we V-Sync uit en ook de audiosynchronisatie, en lieten we RetroArch een vast aantal frames zo snel mogelijk draaien, schermvullend op 1080p. We klokten 600 en 3.600 frames en deelden het verschil, zodat de opstarttijd (laden, shaders compileren) niet meetelt.

RetroArch, 1080p, V-Sync uitZonder shadercrt-royalecrt-lottes
Game Boy, Tobu Tobu Girl (Gambatte)1.863 fps257 fps80 tot 116 fps
Game Boy Color, µCity (mGBA)1.807 fps253 fpsniet gemeten
Staafdiagram, logaritmische schaal: frames per seconde van RetroArch in 1080p met V-Sync uit, per core en shader
RetroArch in 1080p, V-Sync uit (logaritmische schaal): ongeveer 1.800 fps zonder shader, ongeveer 255 fps met crt-royale, 80 tot 116 fps met crt-lottes. De stippellijn geeft de 60 fps aan die een game nodig heeft.

De emulatie zelf kost bijna niets: deze consoles zijn piepklein voor een moderne processor. De CRT-shader is werk voor de GPU: die tekent elke pixel van het 1080p-scherm opnieuw, met de scanlines, het schaduwmasker en de gloed van een beeldbuis-tv. Zelfs met crt-royale blijft de server ruim boven de benodigde 60 fps. De twee runs met crt-lottes gaven verschillende resultaten (80 en 116 fps): de GPU is gedeeld, en andere testservers gebruikten hem op dat moment.

V-Sync uit is alleen om te meten. Om te spelen stel je RetroArch zo in dat het de eigen framerate van de game volgt (“Sync to Exact Content Framerate”, vrr_runloop_enable = "true"): de game draait dan op de snelheid van de console (59,73 Hz bij een Game Boy), en Moonlight toont hem vloeiend op je scherm.

Tobu Tobu Girl met de CRT-shader crt-royale, gestreamd van de cloudserver naar Moonlight
Met crt-royale: scanlines en fosforgloed, getekend door de GPU van de server, daarna gecodeerd en naar Moonlight gestuurd.

3. Streamen met Moonlight: wat het kost

We startten elke game vanuit Moonlight (elke game is een Sunshine-”applicatie”, zie hieronder), speelden, en noteerden de prestatie-overlay van Moonlight en het CPU-gebruik van de server:

Moonlight, 1080p 60 fps H.264Game, zonder shaderGame, crt-royaleRetroArch-menu
Verwerking op de server (opname + codering), gemiddeld4,6 tot 6,5 ms5,8 tot 6,4 ms12,2 ms
Verwerking op de server, min / max4,3 / 7,1 ms4,2 / 11,7 ms4,5 / 21,5 ms
Frames verloren door het netwerk of door jitter0%0%0%
Decodeertijd op de client0,20 tot 0,23 ms0,21 tot 0,24 ms0,29 ms
CPU van Sunshine (aandeel van één kern)14%17%niet gemeten
CPU van RetroArch (aandeel van één kern)4%6%niet gemeten
Staafdiagram: verwerkingstijd per frame op de server tijdens het streamen, zonder shader, met crt-royale en in het RetroArch-menu
Verwerking per frame op de server (opname en codering) volgens Moonlight: in alle gevallen ruim onder de 16,7 ms van één frame bij 60 fps.

De stream gebruikte 15 Mbit/s, de standaardwaarde van Sunshine voor 1080p. De encoder is een ander deel van de GPU dan het deel dat de shaders tekent: daarom vertraagt de CRT-shader de stream niet. Het menu van RetroArch, met zijn geanimeerde achtergrond, kost iets meer tijd om op te nemen dan een Game Boy-game. Je totale latentie hangt vooral af van je internetverbinding met de server (in Duitsland): een goede glasvezelverbinding in Europa voegt doorgaans 10 tot 30 ms toe.

Het RetroArch-menu, gestreamd met Moonlight vanaf een Linux GPU-server zonder scherm
Het hoofdmenu van RetroArch in Moonlight, op 1080p en 60 fps. Alles wordt bediend met de gamepad of het toetsenbord van de speler.

4. Eén Sunshine-applicatie per game

Sunshine start een programma als Moonlight om een “applicatie” vraagt. We maakten er één voor het menu van RetroArch en één per game, zodat een game direct vanuit Moonlight te starten is (~/.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 bevat de paar RetroArch-instellingen die ertoe doen om via Sunshine te spelen:

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" voorkomt dat RetroArch pauzeert als het denkt de focus kwijt te zijn, en config_save_on_exit = "false" voorkomt dat een test of een wijziging in het menu je instellingen overschrijft. Sunshine maakt op de server een virtuele gamepad, toetsenbord en muis aan voor de speler in Moonlight, zodat je eigen gamepad werkt alsof hij op de server is aangesloten. Liever een gamebibliotheek zoals op een console, met hoesafbeeldingen? Dan kun je ES-DE (EmulationStation Desktop Edition) toevoegen als extra Sunshine-applicatie bovenop RetroArch; in deze test hebben we het niet gebruikt.

Tobu Tobu Girl zonder shader, met gehele schaling vergroot tot 1080p, in Moonlight
Zonder shader: het Game Boy-beeld vergroot met gehele schaling (scherpe pixels), op de eigen framerate van de console (59,73 fps).
Titelscherm van Tobu Tobu Girl, direct gestart vanuit Moonlight, met prestatiestatistieken
Direct gestart vanuit de app-lijst van Moonlight: het titelscherm van de game, in 1080p en 60 fps.

5. iGPU Start of iGPU Power?

Voor 8- en 16-bitconsoles is iGPU Start (2 vCPU, 8 GB RAM, € 14,99 per maand excl. btw) genoeg: RetroArch en Sunshine samen gebruikten in onze test ongeveer een kwart van één kern. iGPU Power (4 vCPU, 14 GB RAM, twee keer het GPU-aandeel van Start, € 29,99 per maand excl. btw) is de betere keuze als je zware CRT-shaders gebruikt, veeleisendere systemen speelt, of wilt dat de stream stabiel blijft als andere servers de GPU tegelijk gebruiken.

6. Zo zet je het op een Linux GPU-server

Liever meteen spelen? Vraag het per e-mail bij je bestelling (contact@linuxgpu.eu): we kunnen de server leveren met alles hieronder al geïnstalleerd en ingesteld (virtueel scherm, RetroArch, shaders, Sunshine). Jij installeert alleen nog Moonlight op je computer, telefoon of tv-box, koppelt het en voegt je eigen games toe.

Zelf doen:

  1. Installeer RetroArch en de cores: apt install retroarch libretro-gambatte libretro-mgba libretro-nestopia, en de shaders: git clone https://github.com/libretro/glsl-shaders.
  2. Start een headless sway-sessie op de GPU (WLR_BACKENDS=headless WLR_RENDER_DRM_DEVICE=/dev/dri/renderD128 sway) met een uitvoer van 1920×1080.
  3. Installeer Sunshine (Debian 13-pakket uit de officiële GitHub-releases), met de configuratie hierboven, en voeg één applicatie per game toe.
  4. Open de webinterface van Sunshine via een SSH-tunnel (ssh -L 47990:localhost:47990 you@your-server), maak het Sunshine-account aan en koppel Moonlight (Windows, macOS, Linux, Android, iOS, tv-boxen).
  5. Kopieer je games naar de server (scp), en speel.

Je server is standaard bereikbaar via IPv6. Heeft je verbinding geen IPv6, voeg dan de optie dedicated IPv4 toe, of maak verbinding via Tailscale zonder een poort te openen: zie overal op je cloudserver spelen met Moonlight en Tailscale.

Voor pc-games, lees Windows 11 in de cloud met Sunshine en Moonlight en Windows-games draaien op een Linux GPU-server met Wine.

Systemen die direct klaar zijn om te gamen. De systemen die we standaard installeren zijn hier al op ingericht: Debian 13 met een recente kernel (7.3), de Intel-GPU-drivers en Mesa (OpenGL, Vulkan, VA-API-videocodering), en Windows 11 (optie) met de grafische driver van Intel en Extern bureaublad dat op de GPU rendert. Geen drivers zoeken: installeer je game en Sunshine, en speel.

Probeer het

Bekijk de abonnementen: iGPU Start kost € 14,99 en iGPU Power € 29,99 per maand excl. btw.