Windows7のフルスクリーン事情

遅くなりましたが、先日ようやくWindows7を入れました。
シリアルナンバーが通らないという症状で困ってしまいましたがなんとか入りました。(インストール時にハードウェア接続構成から暗号鍵を生成するようで、1回目の再起動後にUSB接続構成がちょっとでも変わるとシリアルが通らないみたいです)
Vistaは使っているのでインターフェイスの迷いもなく、大きなドライバーの問題もなく普通に出来ちゃいました。
さてVLCで動画でも再生してみようと思ったら・・・うーん色々とVistaと仕様が違うようです。
(※サンプル環境は最後に表記してあります。nVidiaしか確認できていないので、AMD(ATI)やIntelでは違うかも知れません)


動画再生のフルスクリーンにも数種類の方法が有りまして、オーバーレイ、DirectDraw.Blt、D3Device.Presentなんかがあります。
画面解像度を変更するモードもありますが、それは今回はパスしますね。拡大・縮小法のみとします。
デコーダに関する部分は、圧縮されたデータをRGBなりYUVなりに変換するまでがお仕事なので、今回は関係有りません。


・オーバーレイ
Vistaでなくなったーとかささやかれていたオーバーレイですが、Windows7で完全にGDIに吸収されたような挙動を見せています。
実際にどうチェックしたかというと、ウインドウをグリグリ動かして、内部の動画部分がちゃんと滑らかにウインドウに吸着して動くかどうか、といった手抜き法ではあるんですが、ちゃんと連動して誤差無く動いているので、最終段階でちゃんと吸収されたのでしょう。素晴らしい!
さて、それの弊害からか、拡大(縮小含む)時の補間が利かなくなりました。
DVDプレイヤーや地デジなんかではこの方法が多用されているでしょうから、Vistaでうごいたからへーきだもん!とはいかないようです。
DirectShowやVMRもこの機能を使っているのでおそらく…。


・DirectDraw.Blt
Vistaまでは割と安全な拡大方法として、Flashやフリーのソフトなんかで使用されています。
この方法も、補間が利かなくなりました。
Intelなどは「ウインドウモードのみ補間が利く」と言った限定条件もありましたが、Vistaまでの現行マシーンのほとんどが使用できたこともあっただけに割と残念。


・D3Device.Present
Direct3Dを使うとこの命令のお世話になります。
内部処理はWindowModeだとほぼまんまDirectDraw.Blt相当に置き換わってると思います(DX9までだと)。
やっぱり補間が利きません。
DirectX10ぐらいからは拡大表示用のチェーンが追加されてるとかどうとか(でも補間パラメータあったかなぁ?)。


という感じで、9割ぐらい全滅で困ってしまいました。
残るは、Direct3Dのポリゴン機能を使って本格的(?)にやる方法ぐらいしか無いのですが、そこまでやってるものは現在はほぼありませんし。
(その方法も結局、バックバッファをディスプレイサイズ分確保する必要があったり、互換性を考えると・・・。現状、安全にフロントバッファにコスト無しで補間して拡大表示できる手段があればいいのですが)
VLCで補間出来たのは「OpenGL表示」なんですが、30FPSの動画でCPUを2.4GHzx4の50%食ってました。要するに4.8GHz相当ですね…。きっとCPU処理してるのかも。


サンプル数は「Windows7 32Bit/64Bit GTX250/260」の2サンプルなので、もしドライバレベルでの話であるならばnVidia以外だと大丈夫だったり、今後改善されていく可能性が高いでしょう。
なんとな〜くな予想では、
nV「Windows7版のドライバも作ったよ」
MS「Windows7じゃぁ違うところの設定を使うよ!」
nV「まじで!」
ぐらいの簡単なミスでいつの間にか直ってたりしそうな気もするので、もうちょっと経過を見届けたいと思います。