Windows 7 での滑らかなアニメーションの実現 (2)

前回のエントリで英語の記事が見つかったため、改めて英語ベースで調査を掛けてみた。(垂直同期とか滑らかなアニメーションという概念の英語表現が良く分かんなかったので、、、)

  • smooth
  • fraction
  • fluctuation
  • animation
  • tearing
  • monitor refresh
  • frame refresh
  • monitor vsync (or v-sync)
  • composition

得られたまとめサイト的なリスト:

いまのところ妥当な結論として下記のように推測している。

普通のアプリでは1枚のフレームバッファをDWMが保持していて、60fpsのリフレッシュレートにあわせて最新のフレームバッファレンダリングされる。ところがこれでは、アニメーションなどを行うアプリケーションではDWMの更新タイミングとの同期が取れずに破綻するので、DWMはそういうアプリ(Media Application)用の更新アルゴリズムを選べるようになっている。

このアルゴリズムでは、DWMはアプリに対して1枚ではなく最大8枚までのフレームバッファを用意し、アプリの更新内容はそのフレームバッファに順次キューしていく。そして、画面リフレッシュに合わせて、バッファの中から最適なフレームを選んで描画する。先頭ではなく「最適な」フレームであることがミソで、アプリと画面のリフレッシュレートが異なっていてもDWMが吸収できるようになっている。たとえば、モニタが60hzのリフレッシュレートでアプリが40fpsのフレームレートだと、徐々に互いのタイミングがずれていき、そのうちフレームをスキップしたり、コマ落ちさせたりしなければならなくなる。DWMはこの処理を勝手にやってくれるらしい。

さて、そんなDWMのバッファリングについていろいろ調べてみたが、どうにもまとまって情報がない。引っかかるのはソースコードだけという感じ。動画アプリなんかは割と対応している節があるが、APIの宣言だけって気もするし、良く分からない。特に日本語だと、まともな解説例は見つからなかった。そんなわけで、完全パイオニアモードでAPIの挙動を調べている。

つづく。