Steam-Optimize : Le wrapper ultime pour le gaming sous Linux

Steam-Optimize : Le wrapper ultime pour le gaming sous Linux

Jouer sur Linux en 2026 est devenu une expérience fluide, mais pour tirer le maximum de performance de son matériel, quelques réglages manuels restent souvent nécessaires. Entre les variables d’environnement pour Proton, la gestion du compositeur Wayland et les tweaks spécifiques à chaque jeu, la configuration Steam peut vite devenir illisible.

Pour résoudre cela, j’utilise un script wrapper nommé steam-optimize. Voici comment il fonctionne et pourquoi il change la donne.

Qu’est-ce que steam-optimize ?

C’est un script Bash qui agit comme un intermédiaire entre Steam et votre jeu. Au lieu de lancer le jeu directement, Steam appelle steam-optimize, qui prépare tout l’environnement (système, affichage, périphériques) avant de passer la main au moteur de jeu.

🆕 Mises à jour récentes

Le script a évolué pour offrir un contrôle plus fin sur l’affichage et la stabilité :

  • Détection du rafraîchissement (Hz) : Interrogation dynamique d’Hyprland pour configurer automatiquement le taux de rafraîchissement virtuel de Gamescope (-r <Hz>), évitant le bridage par défaut à 60 FPS.
  • Ciblage de moniteur intelligent : Possibilité de spécifier le moniteur de sortie via un sélecteur (--monitor focused, workspace:N ou nom du connecteur).
  • Pinning Gamescope : Support de l’option --prefer-output pour forcer le jeu sur un écran spécifique.
  • Flexibilité Wayland : Gestion optionnelle de Steam Input lors du passage en mode Wayland natif.
  • Nouveaux profils : Ajout du support optimisé pour Forza Horizon 6.

Les Optimisations Globales & Détection GPU

Dès son lancement, le script applique une série de réglages système pour garantir une stabilité et des performances maximales. Il détecte automatiquement le GPU actif (AMD ou NVIDIA) en vérifiant les modules de noyau chargés et applique les optimisations correspondantes :

Ajustements Communs

  • Ulimit : Augmentation du nombre de fichiers ouverts à 1048576.
  • Variables globales :
    • PROTON_ENABLE_WAYLAND=1 : Support Wayland natif.
    • PROTON_NO_WM_DECORATION=1 : Désactivation des décorations de fenêtre.
    • PROTON_USE_NTSYNC=1 : Synchronisation ultra-rapide.
    • PROTON_XESS_UPGRADE=1 : Activation de l’upgrade XeSS.
    • vblank_mode=0 : Désactivation du VSync pour Mesa.

Optimisations AMD (RADV)

  • Variables spécifiques RADV :
    • AMD_VULKAN_ICD=RADV : Forçage du pilote RADV.
    • ENABLE_LAYER_MESA_ANTI_LAG=1 : Couche anti-lag de Mesa.
    • MESA_SHADER_CACHE_MAX_SIZE=20G : Cache de shaders massif.
    • __GL_SHADER_DISK_CACHE_SKIP_CLEANUP=1 : Désactivation du nettoyage du cache.
    • PROTON_FSR4_RDNA3_UPGRADE=1 & PROTON_FSR4_UPGRADE=1 : Support FSR 4.
    • RADV_PERFTEST=nggc,gpl : Tweaks avancés et stables (le Ray Tracing et le décodage vidéo instables ont été désactivés pour éviter les régressions).
    • VKD3D_CONFIG=dxr : Activation du Ray Tracing.

Optimisations NVIDIA

  • Variables spécifiques NVIDIA :
    • __GLX_VENDOR_LIBRARY_NAME=nvidia : Forçage du pilote propriétaire.
    • __NV_PRIME_RENDER_OFFLOAD=1 & __VK_LAYER_NV_optimus=NVIDIA_only : Optimisation pour GPU hybrides (laptops).
    • __GL_SHADER_DISK_CACHE=1 & __GL_SHADER_DISK_CACHE_SKIP_CLEANUP=1 : Gestion du cache OpenGL.
    • __GL_THREADED_OPTIMIZATIONS=1 : Optimisations threadées OpenGL.
    • PROTON_ENABLE_NVAPI=1 : Support NVAPI (DLSS / Reflex).
    • PROTON_HIDE_NVIDIA_GPU=0 : Exposition du GPU pour NVAPI.
    • __GL_SYNC_TO_VBLANK=0 : Désactivation du VSync OpenGL.

Intégration Hyprland : Le mode “Gaming” automatique

L’un des plus grands avantages de ce script est sa symbiose avec le gestionnaire de fenêtres Hyprland.

Pendant qu’un jeu tourne, il est inutile (et coûteux en GPU) de garder des animations fluides ou du flou sur le bureau. Le script cible automatiquement la session active d’Hyprland et s’occupe de tout :

  1. Désactivation des effets : Il coupe les animations, les ombres, le flou, les arrondis des fenêtres et force l’opacité à 1.0 (active et inactive) pour éviter tout composite inutile en tâche de fond.
  2. Focus Performance : Il passe le démon de notifications en mode “Ne pas déranger” (makoctl mode -s dnd).
  3. Hibernation : Il suspend hypridle.service pour éviter que votre écran ne s’éteigne en pleine cinématique ou lors d’une phase de jeu calme à la manette.

Une fois le jeu quitté, un trap Bash intercepte la sortie (même en cas de crash) pour restaurer instantanément votre configuration d’origine, relancer hypridle et repasser Mako en mode normal.

Fonctionnalités Avancées & Tweaks Ciblés

Le script ne se contente pas de régler des variables globales ; il s’adapte dynamiquement à chaque jeu grâce à l’AppID fourni par Steam.

Gamescope intelligent et universel

Le script encapsule automatiquement tous les jeux dans Gamescope s’ils ne le sont pas déjà. Mieux encore, il interroge l’API d’Hyprland (hyprctl monitors -j) via jq pour cibler le bon écran selon un sélecteur intelligent (par défaut sur le moniteur hébergeant l’espace de travail workspace:1, ou via --monitor focused ou un connecteur nommé précis comme DP-1). Il récupère instantanément la résolution active de cet écran pour configurer automatiquement les paramètres de mise à l’échelle de Gamescope (-W -H -w -h) et extrait le taux de rafraîchissement actuel (Hz) pour le forcer dans le display virtuel (-r <Hz>). Si le compositeur supporte le pinning de sortie (--prefer-output), il ajoute l’option -O pour forcer l’affichage sur ce moniteur précis. Si Hyprland ou jq n’est pas disponible, il se replie élégamment sur des paramètres par défaut.

Ajustement des périphériques (DPI)

Pour les FPS compétitifs comme Grand Theft Auto V ou Arc Raiders, le script ajuste à la volée la sensibilité de la souris via razer-cli à 800 DPI au lancement, puis la restaure automatiquement à sa valeur par défaut (1600 DPI) à la fermeture.

Overrides spécifiques par jeu

Le script contient une base de données de tweaks pour vos jeux préférés :

  • GTA V & GTA V Enhanced : Activation du runtime BattlEye (PROTON_BATTLEYE_RUNTIME et ses paramètres secondaires de copie et d’exécution legacy), désactivation complète de Steam Input et forçage de la souris à 800 DPI au lancement.
  • Last Epoch : Restriction des optimisations RADV à nggc,gpl pour contourner un bug de rendu spécifique, et activation de Proton Wayland natif.
  • DOOM : Repli vers XWayland (car il ne supporte pas Proton Wayland natif), activation du multi-threading OpenGL (mesa_glthread=true), lancement avec Gamescope et injection d’arguments de lancement (+com_skipIntroVideo 1 +set m_smooth 0).
  • Forza Horizon 6 : Forçage du backend SDL vers X11 (SDL_VIDEODRIVER=x11), configuration de VKD3D_CONFIG=no_upload_hvv,single_queue, activation de PROTON_SET_GAME_DRIVE=1, et surcharge des DLLs Wine (winmm, steam_api64, version) pour garantir un fonctionnement et des performances optimaux.
  • Satisfactory, World of Warships, Arc Raiders, Metro Exodus, Unreal Tournament : Configuration personnalisée de l’intégration Wayland et de Steam Input (comme la conservation de Steam Input pour World of Warships via l’argument dédié --keep-steaminput).

Suivi et statistiques de session

Au lancement, le script enregistre l’heure de départ ($EPOCHSECONDS). À la fermeture, il calcule le temps de jeu écoulé et l’enregistre proprement dans les logs système sous la forme HH:MM:SS.

Le Script steam-optimize

Le code source complet est disponible et maintenu sur GitLab : 🔗 Voir le script steam-optimize sur GitLab

Extrait : Gestion intelligente de Gamescope

Voici comment le script détermine désormais la résolution et le moniteur cible en interrogeant Hyprland :

get_gamescope_args() {
    local -a ARGS=(-f --force-grab-cursor)
    # ... (validation Hyprland, jq et récupération des moniteurs)
    local RES_W="" RES_H="" MON_NAME="" MON_REFRESH=""
    local JQ_FILTER=""

    case "${MONITOR_SELECTOR}" in
        focused)     JQ_FILTER='.[] | select(.focused == true)' ;;
        workspace:*) JQ_FILTER=".[] | select(.activeWorkspace.id == ${MONITOR_SELECTOR#workspace:})" ;;
        *)           JQ_FILTER=".[] | select(.name == \"${MONITOR_SELECTOR}\")" ;;
    esac

    # Extraction des dimensions, du nom du connecteur (ex: DP-1) et de la fréquence de rafraîchissement arrondie
    IFS=$'\t' read -r RES_W RES_H MON_NAME MON_REFRESH < <(
        jq -r "${JQ_FILTER} | [.width, .height, .name, (.refreshRate | round)] | @tsv" <<< "${MONITORS}" 2>/dev/null || true
    )

    # Configuration de la résolution
    if [[ -n "${RES_W}" && "${RES_W}" != "null" ]]; then
        ARGS=(-W "${RES_W}" -H "${RES_H}" -w "${RES_W}" -h "${RES_H}" "${ARGS[@]}")
    fi

    # Pinning de la fréquence de rafraîchissement virtuelle de Gamescope
    if [[ -n "${MON_REFRESH}" && "${MON_REFRESH}" != "null" && "${MON_REFRESH}" != "0" ]]; then
        ARGS+=(-r "${MON_REFRESH}")
    fi

    # Pinning du moniteur via -O
    [[ -n "${MON_NAME}" && "${MON_NAME}" != "null" && "${GAMESCOPE_SUPPORTS_OUTPUT}" == true ]] && ARGS+=(-O "${MON_NAME}")

    echo "${ARGS[*]}"
}

Pour l’installer, placez le script dans votre PATH (par exemple ~/.dotfiles/bin/steam-optimize) et assurez-vous qu’il est exécutable.

Comment le configurer dans Steam

L’installation est extrêmement simple. Une fois le script présent dans votre PATH (par exemple dans ~/.local/bin/ ou ~/.dotfiles/bin/), il suffit de modifier les options de lancement de vos jeux.

  1. Faites un clic droit sur votre jeu dans Steam.
  2. Allez dans Propriétés > Général.
  3. Dans la section Options de lancement, ajoutez la ligne suivante :
steam-optimize %command%

C’est tout ! Steam remplacera %command% par la commande de lancement du jeu, que notre script interceptera pour y appliquer ses optimisations.

Conclusion

Le script steam-optimize transforme chaque lancement de jeu en une opération propre et optimisée. Plus besoin de se demander si on a activé le GameMode ou si les effets du bureau ralentissent nos FPS : le script s’en occupe pour vous, vous laissant vous concentrer sur l’essentiel : le jeu.

[!TIP] Vous pouvez consulter les logs de vos lancements en temps réel avec la commande : journalctl -t steam-optimize -f

Retrouvez le script complet ici : steam-optimize

Sources

Catégories : Linux 

Suggestions de lecture :