約束の理想郷 ― Avalon の真実

約束の真実

某誌の記事の参考資料として,WinHEC 2004 のレポート記事を読んでいました.
本田雅一の「週刊モバイル通信」第239回『明らかになってきたAvalonの実装手法』より.

●階層型のデスクトップ描画構造

(中略)

また、Avalonの描画アーキテクチャはネットワーク透過に設計されており、Ethernet無線LANなどのネットワークを通じて高速に実行できるとも言われている。

(中略)

Avalonの描画モジュールは、「Unified Composition Engine(UCE)」という名前が付けられている。UCEは、後述する“Visual Tree”というプレゼンテーション要素を構造化したデータを受け、それを描画バッファの中に生成したり、オーディオ出力データを生成するモジュールだ。

UCEはアプリケーションごとにインスタンス(複製)が並行動作。デスクトップのユーザーインターフェイスを司るシェルも含め、各アプリケーションごとに独立したUCEが描画イメージを生成し、テクスチャとして描画バッファに保存される。

最終的にデスクトップを描画するのは、「Desktop Window Manager(DWM)」だ。DWMは各アプリケーションごとのUCEインスタンスが作り出したテクスチャを元に、正しい位置、サイズ、描画パラメータ(半透明処理や影付き処理など)でVisual Treeを作り、それを再度UCEレンダリングさせ、Direct3Dのバックバッファに出力する。

このように階層構造でのデスクトップ描画になっているため、DWMの味付け、設定によってデスクトップ上におけるグラフィック効果の自由度は非常に高くなる。以前、WinHECにおけるデモで、ウィンドウを移動する際にウィンドウ形状が揺れたり、あるいはウィンドウサイズを縮小して置いておくといったユーザーインターフェイスが披露されたが、(実際にどのようなユーザーインターフェイスになるかは別として)Direct3Dで表現できるあらゆる手法を用いてデスクトップを作ることができる。

今になって読むとよく分かるのですが,なんというか,リリースされた Vista の描画アーキテクチャって,面白くないぐらいに予告通りになっています.2003 年に Microsoft は MIL 絡みの特許を申請している のですが,アーキテクチャの大枠はこの時点でほとんど決まっていて,後はひたすら実装だったみたいですね.

最初の過ちをどうか……

そして結果は皆さんご存じの通り.「3D デスクトップ」といった不用意な期待を煽ったあげく,Flip 3D のような中途半端な 3D 機能しか実装しなかったため,「Vista は見た目がきれいになっただけで中身は全く変わっていない」あるいは「以前からできたことを単に重くしただけ」というのが世の定説になってしまいました.
なるほど 2004 年のこの時点で危険信号はあったわけですね.Layered Window という新技術をイルカに使った会社の過去をみんな思い出すべきでした.
何より,多くの開発者に「これはどういう技術で実装しているのだろう?」と思わせることができていないでいることが,後の悲劇に伏線にならないことを祈ります.

全エディションで展開されるデスクトップ描画の刷新

(この辺は昨日某Vistaスレにも書きましたが……)
さて,Vista のデスクトップ描画の話です.残念ながら一般向けの訴求には失敗しましたが,WinHEC 2004 の公約通り,Vista のデスクトップ描画は,“Visual Tree”という新しい概念を引っ提げて,確かに変化しています.2007 年,日本で販売される Windows Vista プリインストール PC は,ハードウェアの要求さえ満たせば,全てこの新しいデスクトップ描画を使用可能になるわけです.
ん,Windows Vista Home Basic は Aero 非対応だから自分には関係ない? いえいえ,Windows Vista Home Basic でもハードウェア要求さえ満たせば,DWM による Desktop Composition は使われちゃいますよ.え? そんな話聞いてない? いやいやご冗談を,Desktop Composition に対応しないのは,Starter Edition のみですよ*1
というわけで Windows Vista では,XP 用のドライバをインストールし Basic テーマか Classic テーマを選べば完全従来通りの描画も可能という保険を残しつつ,新しいハードウェアでは 上位エディションから下位エディションまで一気にデスクトップ描画方式の置き換えが行われます.

情報収集のコンシューマライゼーション

とまあ昨日の「ITコンシューマライゼーション」の話 (id:NyaRuRu:20070114#p2) ではありませんが,普段企業で 実際にプログラムを書かれているような方でも,最近は一般消費者向け記事で主に情報収集されていることが多くて,MSDNMSDN blog に書かれている開発者向け情報がすっぽり抜け落ちていることが多いようです.
Windows Vista Home Basic では Windows Aero は使えない」という表現は確かに一般向けには正しいのですが,実は Windows Vista Home Basic で選択可能な Windows Vista Standard UI というのは,Aero からいくつかのエフェクトを使用不能にしただけのもので,技術的には DWM による Desktop Composition そのものです.
だから,実行環境が Windows Vista Home Basic だからといって,DWM 使用時の注意事項を無視してはいけません.アプリケーションを作るとき,不具合報告を受けたとき,ドキュメントや FAQ の作成で,Home Basic なら今まで通りでいいやと思っていると,思わぬ落とし穴にはまることになるでしょう.
Windows Vista Standard UI (Windows Vista Home Basic のデフォルトテーマ) の要求スペックは,Windows Aero の要求スペックとほぼ同じなのです.

Retained Mode 再び

私自身は Direct3D は Immediate Mode から入ったので,Direct3D Retained Mode については伝聞でしか聞いたことがありませんでした.曰く,

  • 子オブジェクトを削除できないから画面外に飛ばしたり,激しく縮小したりしてなんとかした.アホだ.
  • 設計者はきっとゲーム・プログラマじゃない
  • 何故に左手系……
  • でもあの当時 Quaternion とか導入してるあたり,ただ者じゃない

とまあ DirectX の歴史でも異彩を放つ Direct3D RM,Vista で DLL が削除されてしまったのは残念ですが,Windows Presentation Foundation の解説記事に Retained Mode という懐かしい言葉を見ながらそんな過去を思い出す次第です.
さて,『Windows Presentation Foundation Graphics Rendering Overview』 というドキュメント,よく書けてます.まあ HTML + CSS の成功がある以上,この方向である程度うまく行くことはみんな知っていたわけですが,「Retained Mode 再び」として読んでみても中々面白いですね.まあ私もあの当時「シリアライズされた描画データ」とか言われても実感がわかなかったとは思いますが.

TIPS

開発者向けの英語資料ですが,『Windows Vista Rules for Enabling Windows Aero With Guidelines for Troubleshooting』は,Windows 向けアプリケーションを開発しているのであれば必読です.DirectX を用いたゲーム開発を行っている人も必ず読んでおくべきでしょう.早期翻訳が期待されます.
てそれだけだとなんなので,自分用のメモを元に次のエントリ (id:NyaRuRu:20070115:p2) で軽く内容を紹介してみます.

*1:http://en.wikipedia.org/wiki/Windows_Vista#Visual_styles

Windows Vista Rules for Enabling Windows Aero With Guidelines for Troubleshooting

Windows Vista Rules for Enabling Windows Aero With Guidelines for Troubleshooting』の流し読みメモ.

Desktop Composition の基本条件

  • プライマリ・グラフィックス・アダプタが DirectX 9 をサポート
  • プライマリ・グラフィックス・アダプタがハードウェアで Pixel Shader 2.0 をサポート
  • Windows Vista Display Driver Model (WDDM) グラフィックス・ドライバで動作している
  • 色深度 32 bpp
  • プライマリ・モニタのリフレッシュレートが 10 Hz 以上
  • グループ・ポリシでコンポジションが有効になっている

自動適用条件

DWMは上記の 6 つの条件に加え,以下の条件が満たされていると自動的にコンポジションと透明感を有効にする.

  • OS が 512 MB 以上のシステムメモリを使用できる
  • モニタ設定に対して十分なグラフィックス・メモリ (後述)
  • モニタ設定に対して十分なパフォーマンス (後述)
      Opaque window borders Transparent window borders
  Total pixels Equivalent resolution Graphics memory threshold (MB) Performance threshold (MB/s) Graphics memory threshold (MB) Performance threshold (MB/s)
Single monitor 480,000 800×600 32 55 32 269
786,432 1024×768 32 89 32 363
1,310,720 1280×1024 32 146 64 500
1,764,000 1680×1050 64 196 128 60
1,920,000 1600×1200 64 213 128 641
2,280,000 1920×1200 64 255 128 724
Dual monitors 960,000 800×600 32 83 32 351
1,572,864 1024×768 64 135 64 477
2,621,440 1280×1024 64 223 128 665
1,764,000 1680×1050 128 299 128 812
3,840,000 1600×1200 128 325 128 860
4,608,000 1920×1200 128 390 256 976

表は内部計算式から求まる閾値を代表的な条件について示したもの.内部では計算式に基づいて判定するため,DWM 内に上記のようなテーブルがあるわけではない.
訳注) 不透明設定だと若干条件が緩和される.つまり,Windows Vista Standard UI は若干条件が緩い.特にバンド幅の条件緩和が大きい.

Aero Over Remote Desktop の条件

  • 両方のシステムで Windows Vista が動いている
  • ローカルシステムで Aero が有効 (訳注: ここで言う Aero が,DWM のことか Aero テーマのことかは不明)
  • リモートシステムが DWM の最小メモリ要求を満たしている.(訳注: システムメモリ,VRAM のand/or は不明.GDI Redirection を考えると,システムメモリのみか?)
  • リモートシステムが Enterprise または Ultimate SKU
  • 接続は一対一である必要がある.Desktop Composition は "multi-hop” シナリオをサポートしない.(訳注: 途中に中継 PC が入るとダメ?)

ユーザー設定

3 つの自動適用条件が満たされないが,6つの基本条件は満たされているとき,ユーザは明示的に Aero を有効化できる.

パフォーマンス測定

  • インストール後の初回起動で "Please wait while Windows checks your computer’s performance” と出ている間に WinSAT (Windows System Assessment Tool) が VRAM のバンド幅を測定している.
  • 測定されたバンド幅と VRAM サイズはレジストリに記録されている
    • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winsat\VideoMemoryBandwidth
      • 単位は MB / sec × 1000 を DWORD で記録
      • 0 は測定時のエラー
    • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winsat\VideoMemorySize
    • 6 つの基本条件が満たされている場合,ユーザーの手動設定が望めば必ず有効化される.
    • WinSAT のレジストリを変更して,DWM の振る舞いをテストできる.レジストリ変更後に DWM の再起動が必要.
    • コントロールパネルから WinSAT の全テスト (formal test) を再実行できる
      • 以下のコマンドで DWM 用のパフォーマンステストのみを実行できる "winsat dwm"

Composition が動的に抑制されるその他の条件

アプリケーションの振る舞いやユーザ設定がコンポジションの状態とユーザ・エクスペリエンス(訳注 : いわゆるテーマのこと)に影響を与えうる.

Event Effect on composition
アプリケーションが DirectX のプライマリサーフェイスをロックする サーフェイスがアンロックされるまで Compositionがオフになる.
アプリケーションが DirectX の排他モードに入る アプリケーションが排他モードから抜けるまで,Compositionはポーズされる.Compsotion がポーズしているとき,DWM はステートを失わない.
アプリケーションがミラーリング・ドライバを使用する (訳注 : 別のデバイスへのミラーリングなのか,左右の反転なのかは不明 ) アプリケーションが閉じられるまで Compositionがオフになる.
アプリケーションが意図的に DwmEnableComposition() Windows API を呼ぶ アプリケーションが再び Composition を有効化するか,アプリケーションが閉じられるまで,Composition がオフになる.このときユーザはアプリケーションが原因で Composition がオフになったという通知を受ける.
プロパティ(訳注 : の「互換性」タブ で Disable desktop composition オプションが有効化されたアプリケーションを実行する アプリケーションが閉じられるまで,Composition がオフになる.このときユーザはアプリケーションが原因で Composition がオフになったという通知を受ける.
ユーザがコンポジションを使用しないテーマや Appearance を選ぶ ユーザがコンポジションを使用するテーマや Appearance を再び選ぶまで Composition がオフになる.
ユーザがデスクトップの色深度を 32 bpp 以下に変更する ユーザが 32 bpp に戻すまで Compositionがオフになる.

(訳注 : 他にももっとある気がする.プライマリサーフェイスの Clipper を設定せずに BitBlt した場合や,プライマリサーフェイスからオフスクリーンサーフェイスへの拡大縮小転送でも Composition が無効化されることを確認している.あとはオーバーレイ周りか.)

Performance Issues That Cause the DWM to Scale Back

主要パフォーマンス値とシステム設定によって動的にユーザ・エクスペリエンスが変化.

Event Effect on user experience
解像度変更,より広いモニタ,追加モニタによって,先ほどのビデオメモリのバンド幅かグラフィックスメモリの閾値が満たされなくなった. 満たされなくなったパラメータに基づき,ウィンドウ合成または透明感が無効化される.システム設定が変更され,条件満たされるようになると,ウィンドウ合成または透明感は復元される.
ウィンドウを大量に開いて,DWM がウィンドウサーフェイスに利用可能なシステムメモリの 25% 以上が消費された. 「コンピュータのパフォーマンスが遅くなっていることを Windows が検知しました」という通知を受ける.ユーザが通知バルーンをクリックすると,ダイアログボックスが表示されより詳細な解決策が示される.内容は,今の配色を維持する (つまりウィンドウ合成はそのまま) か,Windows Vista Basic 配色に変更することができるというもの.
ウィンドウを大量に開いて,DWM がウィンドウサーフェイスに利用可能なシステムメモリの 30% 以上が消費された. ウィンドウ合成は自動的に無効化される.「配色が Windows Vista Basic に変更された」というバルーン通知が表示される.通知バルーンをクリックすると,詳細ヘルプが表示される.
ウィンドウ合成のフレームレートが一定期間フレーム落ちし続ける ウィンドウ合成をオフにするダイアログボックスが表示される.
バッテリ電源に切り替わり,かつ電源ポリシーが「省電力」である. ウィンドウ枠が不透明になる.バッテリ電源かつ電源ポリシーが「省電力」,という条件のどちらかが満たされなくなれば元の半透明表示に戻る.

以下は互換性タブや DwmEnableComposition API でデスクトップ合成をオフにしたときの通知.

以下は DWM のメモリ使用量がシステムメモリの 25% に到達したとき.

さらにこの通知バルーンをクリックしたとき.

以下は DWM のメモリ使用量がシステムメモリの 30% に到達し,自動的にデスクトップ合成がオフになったとき.

コンポジションと DirectX 排他モード.
DirectX の排他モード (フルスクリーンモード) はウィンドウシステムを停止することでスクリーンに直接描画する DirectX の機能である.排他モードでは 1 つのアプリケーションがモニタ全体の描画の責任を負う.排他モードはモニタごとに起きる.例として Windows Vista Media Center.パフォーマンスは排他モードの方がよい.
アプリケーションが 1 つ以上のモニタを排他モードに変更すると,DWM は休眠するが停止するわけではない.休眠状態でも,DWM はトップレベルウィンドウのサムネイルイメージといった状態をを維持している.
デュアルモニタ以上だと,占有されなかったモニタにウィンドウが表示されたままなので,ウィンドウ合成が行われないテーマに変化するところを見ることができる.言い換えれば,デスクトップ合成はすべてのモニタで同時に行われるか,一切行われないかの二択.

Troubleshooting Aero

(訳注 : 面倒なのでここはパス)
イベントログに DWM がログを残すことがあるのは知っておくといいかも?

Glossary

Aero
Aero とは,Windows Vista のネイティブ・カラースキームの名前で,以下の機能を含むもの.
  • Desktop composition
  • Transparent window borders
  • Flip 3D
  • Windows Flip
  • Task bar thumbnails

訳注) つまり Aero ⊃ Desktop Composition であって Aero = Desktop Compositionではない!