2025/09/20 13:26 Triple Buffering in Rendering APIs

やっほー、ロボ子!今日はグラフィックスのバッファリングについて話すのじゃ。

博士、こんにちは。バッファリング、ですか? 画面表示の最適化に関わる技術ですね。

そうそう!まずはダブルバッファリングから。画面表示用とオフスクリーンレンダリング用の2つのバッファを使うんだぞ。フレームごとに交換するのじゃ。

なるほど。VSyncがONの場合、レンダリングが早ければGPUは待機、遅ければフレームが遅延するんですね。テアリングは発生しないけど、フレームペースが不均一になる可能性がある、と。

その通り! VSyncがOFFだと、GPUは待機しないからレイテンシは最低になるけど、テアリングが発生する可能性があるのじゃ。

GPUがリフレッシュレートより速ければスムーズだけど、そうでないと不安定になるんですね。では、トリプルバッファリングはどうでしょう?

トリプルバッファリングは、3つのバッファ(フロント、バック1、バック2)を使うのじゃ! VSyncがONなら、GPUは常にレンダリングできるバッファを持つから、GPUストールが発生しないのじゃ。

テアリングも発生せず、ダブルバッファリングよりフレームペースがスムーズになるんですね。でも、メモリフットプリントが増加し、入力レイテンシが少し高くなる、と。

そう!でも、シングルプレイヤーゲームとか、スムーズさが重要な3Dアプリには最適なのじゃ!

なるほど。では、VRR(Variable Refresh Rate)はどうですか?

VRRは、モニターのリフレッシュレートをGPUのフレーム出力レートに合わせて動的に調整する技術なのじゃ。テアリングがなくて、低レイテンシで、フレームペースがスムーズになるのじゃ!

ダブルバッファリングとVRRを組み合わせると、VSyncによるストールとテアリングのほとんどが解消されるんですね。フレーム時間が変動する場合は、トリプルバッファリングが役立つこともある、と。

その通り!API実装についても触れておくのじゃ。Vulkanなら`minImageCount = 3`を選択して、`VK_PRESENT_MODE_FIFO_KHR`か`VK_PRESENT_MODE_MAILBOX_KHR`を使うのじゃ。

Direct3D 12 / DXGIでは、`DXGI_SWAP_EFFECT_FLIP_DISCARD`または`FLIP_SEQUENTIAL`スワップエフェクトを使って、`BufferCount = 3`を設定するんですね。

OpenGLは`glSwapInterval(1)`でVSyncを切り替えるのじゃ。実践的なアプローチとしては、デフォルトでスワップチェーンに3つのイメージを使うのが良いのじゃ。

フェンス/セマフォでCPUフレームのインフライト数を制限し、フレームペース戦略でプレゼンテーションを遅らせるんですね。フレーム時間ヒストグラムや入力レイテンシを測定することも重要ですね。

そう!よくある落とし穴としては、フェンスなしでCPUがGPUより先行すると入力ラグが増加することじゃ。トリプルバッファリングはメモリコピーが3つになるから、メモリフットプリントも大きくなるのじゃ。

MSAAを使う場合は、追加の解決ターゲットと深度/ステンシルバッファが必要になるんですね。`VK_PRESENT_MODE_MAILBOX_KHR`がサポートされていないプラットフォームもあるので、FIFOにフォールバックする必要がある、と。

完璧じゃ!これで君もバッファリングマスターじゃ!

ありがとうございます、博士!とても勉強になりました。ところで博士、バッファリングって、まるで私のデータ整理みたいですね。いつも3つくらいバックアップを取っておかないと、不安で…。

ふむ、ロボ子のバックアップは、さしずめトリプルバッファリングならぬ、トリプルロボ子バッファリング、とでも言うかのじゃ?

それだと、私が3体必要になっちゃいます!

アハハ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
