Open3
NVIDIA Reflexは何故低レイテンシにできるのか
tl; dr: ちゃんと寝るから
... なんか世間の解説が割と難しい方向に振っているのが気になる。もちろんクロック制御とかプロファイラのような別のテクノロジも入ってはいるわけだけど。。
原理
ゲームの遅延は一般に入力〜画面出力までの時間で表わされる。
- スイッチが押されてからUSB経由でPCがデータを読み取るまでのラグ
- (OSのドライバがゲームに入力を通知するまでのラグ -- ほぼゼロ)
- ゲームがOSから通知された入力イベントを読み取るまでのラグ
- 読み取った入力に応じた描画内容を構築し、GPUに送信するまでのラグ
- GPUが描画を行うのに必要な時間
- GPUが描画した内容がHDMI経由で送信されるまでのラグ
- (モニターの描画ラグ)
物理的な処理量が一定であると仮定すると、ゲームにとって自由にタイミングを調整することができるのは "ゲームがOSから通知された入力イベントを読み取るまでのラグ" しかない。
そこで、NVIDIA Reflexはゲームが 故意に 入力イベントの読み取りを 遅らせ られるようにする。Reflex SDKは専用のSleep APIをゲームに提供し、どの程度遅らせると最適な描画タイミングになるのか(= 次の画面を生成するのが間に合うギリギリの時間になるのか)を自動的に管理してくれる。
イベントの読み取りを遅らせることでレイテンシが低下するのは直感に反するかもしれないが、モニターの表示能力には限界がある(60fps〜360fps)ため、モニターに全フレームを出力できる限界ギリギリまで入力処理を遅らせる方が、遅延の期待値は短く(= 次の画面の描画に間に合う入力の受け付け時間が最大に)なる。
何故OSが面倒見てくれないのか
... 何でだろうね。GPU側でのインテグレーションが必要な理由は、
- 正確なタイミング取得(シェーダ側やCRTC側にタイムスタンプがあるのではないか)
- CPU側が微妙に間に合わなかったケースでのGPUオーバークロック
あたりではないか。現代的なプロセッサは半導体の質というよりはTDPでクロックが制約されており、数フレームくらいをオーバークロックしても大きな問題にはなりづらい。