# Gaming Optimierungen

## System

AMD Ryzen 9 7950X3D, AMD Radeon RX 7900 (Navi 31), 62 GB RAM, NixOS mit `linuxPackages_zen`.
Alle deklarativen Änderungen liegen in `/etc/nixos/configuration.nix` (Repo `nix-config`).

## Kernel und Scheduler

```nix
boot.kernelPackages = pkgs.linuxPackages_zen;

services.scx = {
  enable = true;
  scheduler = "scx_lavd";
};
```

`linux-zen` bringt Gaming-orientierte Patches gegenüber dem Standard-Kernel mit. `scx_lavd` ist
ein sched_ext Scheduler, der die asymmetrische Cache-Topologie des 7950X3D (zwei CCDs, eines mit
V-Cache) berücksichtigt und Threads entsprechend platziert.

## Arbeitsspeicher

```nix
zramSwap = {
  enable = true;
  algorithm = "zstd";
  memoryPercent = 50;
};

boot.kernel.sysctl."vm.swappiness" = 120;
```

zram mit zstd-Kompression verhindert, dass bei RAM-Druck auf die langsamere Festplatte
ausgelagert wird. `swappiness = 120` (Standard: 60) lässt den Kernel eher ins schnelle zram
auslagern statt Page-Cache zu verdrängen.

## Storage

```nix
services.udev.extraRules = ''
  ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
'';
```

Ersetzt den Standard-Scheduler `kyber` durch `none` für alle NVMe-Geräte. NVMe-Queues regeln
Reihenfolge und Latenz selbst besser, als es ein Software-Scheduler könnte.

## GPU

```nix
hardware.amdgpu.overdrive = {
  enable = true;
  ppfeaturemask = "0xffffffff";
};

programs.corectrl.enable = true;

programs.gamemode = {
  enable = true;
  settings = {
    gpu = {
      apply_gpu_optimisations = "accept-responsibility";
      gpu_device = 1;
      amd_performance_level = "high";
    };
  };
};
```

`ppfeaturemask` entsperrt die Overclocking-/Undervolt-Funktionen der amdgpu, die dann über
`corectrl` (GUI) genutzt werden können. GameMode setzt den Performance-Level automatisch auf
`high`, sobald eine Spielsession läuft (vorher: `auto`). `gpu_device = 1` entspricht
`/sys/class/drm/card1`, der einzigen GPU in diesem System.

## Gaming-Tools und Runtime

```nix
programs.steam = {
  enable = true;
  remotePlay.openFirewall = true;
  dedicatedServer.openFirewall = true;
};

programs.gamescope = {
  enable = true;
  capSysNice = true;
};
```

Dazu `mangohud` in `environment.systemPackages` für Performance-Overlay/Monitoring, sowie
GE-Proton als Compatibility-Tool (`GE-Proton11-3` in `compatibilitytools.d`, manuell über
ProtonPlus verwaltet statt über Nix).

## Übersicht nach Impact

| Änderung | Bereich | Impact | Begründung |
|---|---|---|---|
| `scx_lavd` Scheduler | CPU | Hoch | Cache-Topologie-bewusstes Scheduling auf dem X3D, wirkt direkt auf Frame-Times |
| `linux-zen` Kernel | Kernel | Mittel | Gaming-orientierte Patches, niedrigere Latenz als Standard-Kernel |
| GameMode GPU-Boost (`amd_performance_level=high`) | GPU | Mittel | Weniger Stutter/Mikroruckler bei plötzlichen Lastspitzen, kaum Effekt auf Average-FPS |
| GE-Proton | Compatibility | Mittel | Bessere Spielekompatibilität, teils bessere Performance als Standard-Proton |
| `ppfeaturemask` Overclocking-Unlock | GPU | Mittel (Enabler) | Ermöglicht OC/Undervolt über corectrl, ohne eigene Kurven kein direkter Effekt |
| zram (zstd) | Memory | Mittel | Verhindert Swap-Stalls auf Platte bei RAM-Druck |
| Gamescope (`capSysNice`) | Display | Mittel | Compositor-Bypass, Wirkung abhängig davon ob pro Spiel genutzt |
| corectrl | GPU | Kein direkter Effekt | Reines Steuer-Tool, Wirkung hängt von manuell gesetzten Profilen ab |
| NVMe I/O-Scheduler `none` | Storage | Gering | Betrifft nur Ladezeiten/Asset-Streaming, nicht das Rendering |
| Swappiness 120 | Memory | Gering | Nur bei RAM-Druck relevant, bei 62 GB selten der Fall |
| MangoHud | Monitoring | Kein Performance-Effekt | Reines Anzeige-/Messwerkzeug |
| Steam RemotePlay/DedicatedServer Firewall | Netzwerk | Kein Performance-Effekt | Feature-Enabler ohne Performance-Wirkung |