Blog

Le retrogaming dans le cloud : RetroArch sur un serveur GPU, streamé avec Sunshine et Moonlight

Nous avons fait tourner RetroArch sur un serveur Linux sans écran avec Intel UHD 770, streamé avec Sunshine vers Moonlight : plus de 1 800 fps en émulation Game Boy, environ 255 fps avec le shader CRT crt-royale en 1080p, 5 à 7 ms de traitement côté serveur.

Le retrogaming dans le cloud : RetroArch sur un serveur GPU, streamé avec Sunshine et Moonlight

Votre collection de jeux rétro au même endroit, jouable depuis votre ordinateur portable, votre téléphone ou votre télévision, avec les mêmes sauvegardes partout : c’est ce que permet un petit serveur cloud avec GPU. Nous avons installé RetroArch sur un serveur Linux équipé d’un Intel UHD 770 et sans écran, et l’avons streamé avec Sunshine (sur le serveur) vers Moonlight (côté joueur). Le GPU fait deux choses : il dessine l’image, y compris les shaders CRT qui redonnent aux vieux jeux l’aspect qu’ils avaient sur une télévision à tube, et il encode le flux vidéo.

Tobu Tobu Girl (homebrew Game Boy gratuit) dans RetroArch avec le shader crt-royale, tel que reçu par le client Moonlight (5 secondes, statistiques de performance de Moonlight en haut à gauche).

Utilisez vos propres jeux, obtenus légalement. Pour ce test, nous n’avons utilisé que des jeux homebrew gratuits, téléchargés depuis les pages officielles de leurs auteurs : Tobu Tobu Girl (Game Boy, de Tangram Games, publié gratuitement avec son code source) et µCity (Game Boy Color, open source). Beaucoup d’auteurs publient ainsi de nouveaux jeux pour d’anciennes consoles, et vous pouvez aussi copier vos propres cartouches et disques avec un dumper.

Les résultats en bref

  • L’émulation n’est pas le problème : V-Sync désactivée, RetroArch faisait tourner un jeu Game Boy à 1 863 fps et un jeu Game Boy Color à 1 807 fps en 1080p, soit environ 30 fois la vitesse de la console.
  • C’est pour les shaders CRT que le GPU compte : avec crt-royale, l’un des shaders CRT les plus lourds, RetroArch dessinait encore environ 255 fps en 1080p, quatre fois ce qu’il faut.
  • Le streaming coûte peu : H.264 1080p 60 fps encodé par le GPU, 4,6 à 6,5 ms de traitement sur le serveur en moyenne pendant le jeu (avec ou sans shader), aucune image perdue, et seulement 13 à 17 % d’un cœur CPU pour Sunshine.
  • iGPU Start suffit pour les consoles 8 et 16 bits ; choisissez iGPU Power si vous jouez aussi à des systèmes plus lourds ou si vous voulez plus de marge quand d’autres serveurs utilisent le GPU.

Configuration du test

ÉlémentValeur
ServeurDebian 13, Linux 7.3, Intel UHD 770 (GPU partagé), 4 vCPU, 8 Go de RAM, sans écran
ÉmulateurRetroArch 1.20.0 (paquets Debian), cœurs Gambatte (Game Boy) et mGBA (Game Boy Color)
Shaderscollection libretro glsl-shaders (crt-royale, crt-lottes), pilote vidéo OpenGL
Écransway headless (Wayland) en 1920×1080, dessiné par le GPU
StreamingSunshine 2026.914 sur le serveur, Moonlight 6.2 sur un client Linux, H.264 1080p 60 fps, décodage matériel
Réseauclient et serveur dans le même datacenter : sur Internet, ajoutez la latence de votre connexion

1. Un écran pour un serveur qui n’en a pas

Un serveur cloud n’a pas d’écran, nous lui en donnons donc un virtuel. Nous avons utilisé sway, un petit bureau Wayland, en mode « headless » : il crée un écran 1920×1080 en mémoire et le dessine avec le GPU Intel. RetroArch y tourne en plein écran, et Sunshine le capture directement (capture = wlr) et l’encode sur le GPU (encoder = vaapi) :

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

Sunshine trouve alors les encodeurs matériels (h264_vaapi, hevc_vaapi). Le streaming en AV1 n’est pas disponible sur ce GPU : utilisez H.264 ou HEVC dans Moonlight. Évitez Xvfb, l’« écran virtuel » habituel pour X11 : il dessine tout avec le CPU, et le GPU ne serait pas utilisé pour les shaders.

2. Quelle vitesse d’émulation ?

Pour mesurer ce que le serveur peut faire, nous avons désactivé la V-Sync et la synchronisation audio, et demandé à RetroArch de faire tourner un nombre fixe d’images aussi vite que possible, en plein écran en 1080p. Nous avons chronométré 600 et 3 600 images et divisé la différence, pour que le temps de démarrage (chargement, compilation des shaders) ne compte pas.

RetroArch, 1080p, V-Sync désactivéeSans shadercrt-royalecrt-lottes
Game Boy, Tobu Tobu Girl (Gambatte)1 863 fps257 fps80 à 116 fps
Game Boy Color, µCity (mGBA)1 807 fps253 fpsnon mesuré
Graphique en barres, échelle logarithmique : images par seconde de RetroArch en 1080p, V-Sync désactivée, par cœur et par shader
RetroArch en 1080p, V-Sync désactivée (échelle logarithmique) : environ 1 800 fps sans shader, environ 255 fps avec crt-royale, 80 à 116 fps avec crt-lottes. Le pointillé marque les 60 fps dont un jeu a besoin.

L’émulation elle-même ne coûte presque rien : ces consoles sont minuscules pour un processeur moderne. Le shader CRT est un travail pour le GPU : il redessine chaque pixel de l’écran 1080p avec les lignes de balayage, le masque et la lueur d’une télévision à tube. Même avec crt-royale, le serveur reste très au-dessus des 60 fps nécessaires. Les deux passages de crt-lottes ont donné des résultats différents (80 et 116 fps) : le GPU est partagé, et d’autres serveurs de test l’utilisaient à ce moment-là.

La V-Sync désactivée ne sert qu’à mesurer. Pour jouer, réglez RetroArch pour suivre la fréquence propre au jeu (« Sync to Exact Content Framerate », vrr_runloop_enable = "true") : le jeu tourne alors à la vitesse de la console (59,73 Hz pour une Game Boy), et Moonlight l’affiche de façon fluide sur votre écran.

Tobu Tobu Girl avec le shader CRT crt-royale, streamé depuis le serveur cloud vers Moonlight
Avec crt-royale : lignes de balayage et lueur des luminophores, dessinées par le GPU du serveur, puis encodées et envoyées à Moonlight.

3. Le streaming avec Moonlight : ce qu’il coûte

Nous avons lancé chaque jeu depuis Moonlight (chacun est une « application » Sunshine, voir plus bas), joué, et relevé les statistiques de performance de Moonlight et l’utilisation CPU du serveur :

Moonlight, 1080p 60 fps H.264Jeu, sans shaderJeu, crt-royaleMenu RetroArch
Traitement côté serveur (capture + encodage), moyenne4,6 à 6,5 ms5,8 à 6,4 ms12,2 ms
Traitement côté serveur, min / max4,3 / 7,1 ms4,2 / 11,7 ms4,5 / 21,5 ms
Images perdues par le réseau ou la gigue0 %0 %0 %
Temps de décodage sur le client0,20 à 0,23 ms0,21 à 0,24 ms0,29 ms
CPU de Sunshine (part d’un cœur)14 %17 %non mesuré
CPU de RetroArch (part d’un cœur)4 %6 %non mesuré
Graphique en barres : temps de traitement par image côté serveur pendant le streaming, sans shader, avec crt-royale et dans le menu RetroArch
Traitement côté serveur par image (capture et encodage) d'après Moonlight : bien en dessous des 16,7 ms d'une image à 60 fps dans tous les cas.

Le flux utilisait 15 Mbit/s, la valeur par défaut de Sunshine en 1080p. L’encodeur est une partie du GPU distincte de celle qui dessine les shaders : c’est pour cela que le shader CRT ne ralentit pas le flux. Le menu de RetroArch, avec son fond animé, prend un peu plus de temps à capturer qu’un jeu Game Boy. Votre latence totale dépendra surtout de votre connexion Internet jusqu’au serveur (en Allemagne) : une bonne connexion fibre en Europe ajoute en général 10 à 30 ms.

Le menu de RetroArch streamé avec Moonlight depuis un serveur Linux GPU sans écran
Le menu principal de RetroArch dans Moonlight, en 1080p et 60 fps. Tout se pilote à la manette ou au clavier du joueur.

4. Une application Sunshine par jeu

Sunshine lance un programme quand Moonlight demande une « application ». Nous en avons créé une pour le menu de RetroArch et une par jeu, pour qu’un jeu puisse être lancé directement depuis 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 contient les quelques réglages de RetroArch qui comptent pour jouer à travers 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" empêche RetroArch de se mettre en pause quand il croit avoir perdu le focus, et config_save_on_exit = "false" évite qu’un test ou un changement dans le menu écrase vos réglages. Sunshine crée une manette, un clavier et une souris virtuels sur le serveur pour le joueur de Moonlight : votre propre manette fonctionne comme si elle était branchée sur le serveur. Si vous préférez une ludothèque façon console avec jaquettes, ES-DE (EmulationStation Desktop Edition) peut être ajouté comme une autre application Sunshine par-dessus RetroArch ; nous ne l’avons pas inclus dans ce test.

Tobu Tobu Girl sans shader, agrandi en 1080p avec mise à l'échelle entière, dans Moonlight
Sans shader : l'image de la Game Boy agrandie avec une mise à l'échelle entière (pixels nets), à la fréquence propre de la console (59,73 fps).
Écran titre de Tobu Tobu Girl lancé directement depuis Moonlight, avec les statistiques de performance
Lancé directement depuis la liste d'applications de Moonlight : l'écran titre du jeu, en 1080p et 60 fps.

5. iGPU Start ou iGPU Power ?

Pour les consoles 8 et 16 bits, iGPU Start (2 vCPU, 8 Go de RAM, 14,99 € HT par mois) suffit : RetroArch et Sunshine ensemble utilisaient environ un quart d’un cœur dans notre test. iGPU Power (4 vCPU, 14 Go de RAM, deux fois la part GPU de Start, 29,99 € HT par mois) est le meilleur choix si vous utilisez des shaders CRT lourds, jouez à des systèmes plus exigeants, ou voulez que le flux reste stable quand d’autres serveurs utilisent le GPU en même temps.

6. La mise en place sur un serveur Linux GPU

Envie d’un serveur prêt à jouer ? Demandez-le par e-mail à la commande (contact@linuxgpu.eu) : nous pouvons vous livrer le serveur avec tout ce qui suit déjà installé et réglé (écran virtuel, RetroArch, shaders, Sunshine). Il ne vous reste qu’à installer Moonlight sur votre ordinateur, téléphone ou box TV, à l’appairer et à ajouter vos propres jeux.

Pour le faire vous-même :

  1. Installez RetroArch et les cœurs : apt install retroarch libretro-gambatte libretro-mgba libretro-nestopia, puis les shaders : git clone https://github.com/libretro/glsl-shaders.
  2. Lancez une session sway headless sur le GPU (WLR_BACKENDS=headless WLR_RENDER_DRM_DEVICE=/dev/dri/renderD128 sway) avec une sortie 1920×1080.
  3. Installez Sunshine (paquet Debian 13 depuis ses releases GitHub officielles), avec la configuration ci-dessus, et ajoutez une application par jeu.
  4. Ouvrez l’interface web de Sunshine par un tunnel SSH (ssh -L 47990:localhost:47990 you@your-server), créez le compte Sunshine et appairez Moonlight (Windows, macOS, Linux, Android, iOS, box TV).
  5. Copiez vos jeux sur le serveur (scp), et jouez.

Votre serveur est joignable en IPv6 par défaut. Si votre connexion n’a pas d’IPv6, ajoutez l’option IPv4 dédiée, ou connectez-vous via Tailscale sans ouvrir de port : voir jouer sur votre serveur cloud depuis n’importe où avec Moonlight et Tailscale.

Pour les jeux PC, lisez Windows 11 dans le cloud avec Sunshine et Moonlight et faire tourner des jeux Windows sur un serveur Linux GPU avec Wine.

Des systèmes prêts pour le jeu dès l’installation. Les systèmes que nous installons par défaut sont déjà optimisés pour cela : Debian 13 avec un noyau récent (7.3), les pilotes GPU Intel et Mesa (OpenGL, Vulkan, encodage vidéo VA-API), et Windows 11 (option) avec le pilote graphique Intel et le Bureau à distance rendu sur le GPU. Aucun pilote à chercher : installez votre jeu et Sunshine, et jouez.

Essayer

Voir les offres : iGPU Start coûte 14,99 € et iGPU Power 29,99 € HT par mois.