Niedrige Latenz beim Streaming, wenn das Spiel die GPU auslastet
Ein Spiel bei 100 % GPU lässt den Stream warten. Punktfunk fordert unter Windows und Linux standardmäßig Echtzeit-Priorität auf der GPU an. Wo, und was es kostet.
Auf einem leeren Desktop wirkt jeder Streaming-Host schnell. Entscheidend ist ein forderndes Spiel, das die GPU bei 100 % hält. Dann kann der Stream auf einen Bruchteil der Bildrate des Spiels fallen, während der Encoder der GPU stillsteht.
Der Encoder ist nicht der Flaschenhals
NVENC, AMF und Quick Sync sind eigene Blöcke auf der GPU und stehen meist still. Warten muss die Arbeit, die sie füttert: das Bild abholen, die Farben umrechnen, es in den Encoder kopieren. Diese Arbeit stellt sich im selben GPU-Scheduler hinter dem Spiel an. Mit gesenkter Priorität lieferte ein ausgelasteter NVIDIA-Host etwa 25 von 60 fps eines Spiels und meldete 70 ms Encode-Latenz, während NVENC kaum arbeitete (PR #488).
Echtzeit-Priorität auf jeder Ebene
Punktfunk fordert standardmäßig die höchste GPU-Priorität an, die es bekommt:
- Windows: Der Host-Prozess und der Prozess des Display-Treibers, in dem der Encoder läuft, bekommen beide die GPU-Scheduling-Klasse
REALTIME(D3DKMTSetProcessSchedulingPriorityClass). - Linux: Hardware-Encoder nutzen die Video-Engine der GPU und brauchen keine GPU-Priorität. PyroWave encodiert auf denselben Shader-Kernen wie das Spiel und läuft deshalb in
punktfunk-encode-workerauf einer Echtzeit-Vulkan-Queue. Das brauchtCAP_SYS_NICE, das jedes Linux-Paket dem Worker gibt und nie dem Host. Auf einer RTX 5070 Ti unter GRID 2 sank PyroWaves Encode-p99 von 6,4 auf 4,4 ms.
Auf beiden laufen Capture- und Encode-Threads außerdem mit erhöhter CPU-Priorität.
Priorität nimmt dem Spiel GPU-Zeit weg; sie schafft keine neue. Das Spiel gibt etwas Bildrate ab, damit der Stream seine behält.
Das neueste Bild gewinnt
Unter Windows gibt der Treiber Bilder über einen Pool aus drei Plätzen an den Encoder. Der Encoder hält höchstens zwei; hängt er hinterher, wird das älteste wartende Bild überschrieben. Der Encoder beginnt immer mit dem neuesten Bild, und Windows wartet nie auf den Stream.
Herunterdrehen
Friert NVENC ein, während hardwarebeschleunigte GPU-Planung an und der VRAM fast voll ist, setz PUNKTFUNK_GPU_PRIORITY_CLASS=high. Unter Linux hilft PYROWAVE_QUEUE_PRIORITY=off, wenn der Desktop beim Streamen ruckelt.
Alle Stellschrauben stehen unter Configuration. Wie der Encoder in den Treiber kam: dieser Beitrag.