Windows 7 での滑らかなアニメーションの実現 (2)
前回のエントリで英語の記事が見つかったため、改めて英語ベースで調査を掛けてみた。(垂直同期とか滑らかなアニメーションという概念の英語表現が良く分かんなかったので、、、)
- smooth
- fraction
- fluctuation
- animation
- tearing
- monitor refresh
- frame refresh
- monitor vsync (or v-sync)
- composition
得られたまとめサイト的なリスト:
- Accessing and Controlling DWM Frame Data
- デスクトップの裏側 (2)
- いまどきのデスクトップ処理系
- APIs in the Desktop Window Manager
いまのところ妥当な結論として下記のように推測している。
普通のアプリでは1枚のフレームバッファをDWMが保持していて、60fpsのリフレッシュレートにあわせて最新のフレームバッファがレンダリングされる。ところがこれでは、アニメーションなどを行うアプリケーションではDWMの更新タイミングとの同期が取れずに破綻するので、DWMはそういうアプリ(Media Application)用の更新アルゴリズムを選べるようになっている。
このアルゴリズムでは、DWMはアプリに対して1枚ではなく最大8枚までのフレームバッファを用意し、アプリの更新内容はそのフレームバッファに順次キューしていく。そして、画面リフレッシュに合わせて、バッファの中から最適なフレームを選んで描画する。先頭ではなく「最適な」フレームであることがミソで、アプリと画面のリフレッシュレートが異なっていてもDWMが吸収できるようになっている。たとえば、モニタが60hzのリフレッシュレートでアプリが40fpsのフレームレートだと、徐々に互いのタイミングがずれていき、そのうちフレームをスキップしたり、コマ落ちさせたりしなければならなくなる。DWMはこの処理を勝手にやってくれるらしい。
さて、そんなDWMのバッファリングについていろいろ調べてみたが、どうにもまとまって情報がない。引っかかるのはソースコードだけという感じ。動画アプリなんかは割と対応している節があるが、APIの宣言だけって気もするし、良く分からない。特に日本語だと、まともな解説例は見つからなかった。そんなわけで、完全パイオニアモードでAPIの挙動を調べている。
つづく。