はじめに

排他フルスクリーンの方がボーダレスより遅延が少ないことは何となく知っているけど、仕組みは曖昧だったのでまとめてみた。
※Windows環境限定の話でマトメマス!!

結論としては、各ウィンドウの合成処理がスキップされるかららしい。
そして今は、ボーダーレスでも同じことができる場合がある。ということでまとめました。

ウィンドウが描画されるまで

まず、ウィンドウは画面に直接描かれるわけではない。
各ウィンドウに用意された VRAM 上の専用の描画先バッファ(リダイレクションサーフェス(redirection surface))に描画され、その後 1 枚のデスクトップ画像に合成されてから表示される。

これらを担うのが DWM(Desktop Window Manager) である!
Windows Vista以降はこの仕組みで描画されている。

詳細には…

  1. ゲームが GPU に描画コマンドを発行し、GPU がバックバッファに描く
  2. ゲームが Present を呼び、完成したバッファを DWM に渡す
  3. DWM が合成コマンドを発行し、GPU が全ウィンドウを1枚に合成する
  4. GPUがリフレッシュのタイミングで読み出すバッファを合成結果に切り替え、モニターへ出力する

合成はゲームのフレームレートではなく、モニターのリフレッシュレートに合わせて行われる点に注意

つまり、ゲームの描画のあとに「DWM の合成」というもう 1 回の GPU 処理と、それを待つ時間が挟まる。  

排他フルスクリーンが速い理由

ウィンドウ描画はDWMを用いる一方、フルスクリーンではアプリが画面を完全に掌握する。
即ち、他のウィンドウと合成する必要がないので、表示ハードウェアはゲームのバッファを直接読み出せる。
合成の工程とその待ちがなくなる分、低遅延になる。

テスト

この仕組みのメリットはあくまでも遅延が減ることであって、FPS が大きく上がるわけではない。
(GPU 上の合成処理がなくなる分、まったく効果がないとも言い切れないけど…)

また、合成を飛ばすだけなら別に排他フルスクリーンじゃなくても出来るよね?ってことで次の節に入る。

ちなみに… フルスクリーンからデスクトップに戻るときって何で重いのか?

排他フルスクリーンの出入りが重いのは、主にこの2つの作業が走るから。

排他フルスクリーンでは、ゲームが Windows を通じてモニターの表示モード(解像度やリフレッシュレート)を切り替えられる。
(例: 4K モニターを 1920 × 1080 で動かす)
表示モードが変わるとモニターは映像信号を受け直す必要があるので、入るときと戻るときのたびに、画面が一瞬暗くなる。

全画面とウィンドウでは、画面の大きさや表示のされ方が変わる。そのためゲームは出入りのたびに、今のバッファへの参照をいったん手放してから、描画用のバッファを確保し直し、描画先の設定も作り直す。

ボーダーレスはどちらも起きないので速い。

ボーダレスウィンドウでも合成処理をスキップできる

Direct3D 11/12をサポートしたアプリであれば、ウィンドウでも条件次第でDWMの合成を完全に飛ばすことが出来る。
最近のゲームはほぼこれに対応してるということ。

合成を飛ばす最適化は DirectFlip と呼ばれ、次の3パターンがある。

  1. バッファが画面サイズと一致し、クライアント領域が画面を覆う
  2. クライアント領域が画面を覆い、バッファが画面に対してハードウェア依存の拡大率の範囲内
    → 例: 4K(3840 × 2160)のモニターでボーダーレスフルスクリーンにしてるけど、ゲームは 1920 × 1080 で描いてる。
  3. MPO 対応ハードウェアで、DWM がゲーム専用の層を確保できる。画面を覆っていなくてよく、バッファがウィンドウと近い大きさ(引き伸ばせる範囲)

MPO(Multiplane Overlay)= GPU の表示ハードウェアが、複数の「層」を重ねながら画面に出す機能のこと。

DirectFlip が成立すると DWM は休止し、ゲームのフレームは排他フルスクリーンと同じ効率で画面に送られる。
この状態を Independent Flip と呼ぶ。

それでも差が出るケース

• 他のコンテンツが上に重なる
→ 通知やオーバーレイが上に来ると、DWM は合成モードに戻るか、上のコンテンツをゲームのバッファに描き足す(逆合成)か、MPO で Independent Flip を維持する。
どれが選ばれるかの具体的なルールは公開されていない。

• ハードウェアが対応していない
→ MPO や拡大縮小の対応範囲はハードウェア依存である

• flip モデルを使っていない
→ 旧来の blt モデルのままだと、毎フレームのコピーが入り、直接表示されることはない。


  
以上。
DirectFlipが起きる条件は環境次第だけど、最近はボーダレスでも遅延少ないケースがあるよーということでした。

ボーダレスと排他フルスクリーンでティアリングへの影響の違いとかも気になりますね。気が向いたら書きます。

参考文献