Aero有効時におけるデスクトップキャプチャについて

 Windows Vistaから導入されたデスクトップコンポジション(代表的な機能であるAeroが有名なため以下Aeroとします)ですが、アマレココ等のデスクトップキャプチャソフトとの相性が悪く、基本的にデスクトップキャプチャソフトの多くはAeroを無効にして使うようになっています(アマレココの設定でAero有効なまま使うこともできる)。
 しかし、Windows7になったからか、それとも最近のPCの性能の御蔭か今ではAeroが有効なままでも著しくパフォーマンスが低下することは無く、それなりのパフォーマンスでデスクトップキャプチャできるようです。今回私が調査した結果を書きます。なお、以下のドキュメントは私がとったデータから推測したもので完全に憶測です。事実と異なる可能性がある点にご注意下さい。


■Windows7におけるAero有効時のデスクトップキャプチャの特性
(1) 取得する画像サイズの大小にかかわらず2フレーム分待たされる。
 例えばモニターのリフレッシュレートが60Hz(昨今の大抵の液晶モニターが60Hzです)の場合どんなに頑張っても秒間30コマまでしかキャプチャすることができません。キャプチャ範囲が320x240と小さくても、最大30fpsだし、1920x1080と大きくても最大30fpsが限界となります。ちなみに120Hzモニターであればキャプチャfpsの限界は60fpsとなります。リフレッシュレートの半分がキャプチャfpsの限界と考えればわかりやすいかと思います。

(2) 複数のアプリケーションがデスクトップキャプチャをする場合、協調的な動作となる。
 例えば60Hzモニターの場合にアマレココを2つ同時に起動すると、それぞれ30fpsに設定しても個々のアマレココの動作は15fpsが限界となります。2つのアプリケーションの合計が30fpsを超えることはありません。
同様に3つのアマレココを同時に起動するとそれぞれ10fps前後での動作となります。
このようにAero有効時は他のアプリケーションの影響を受けてしまいますので、もし、キャプチャfpsが30で安定しない場合は他のアプリケーションがデスクトップにアクセスしていないか確認するといいでしょう(どうやってかくにんする?)。

(3) APIによる違い
 基本的にはデスクトップのハンドルからデバイスコンテキストを取得して、そこからBitBlt()関数で画像をキャプチャします。
これはアマレココも今回のアマレコTVのデスクトップキャプチャ機能も同じです。
 昨今では2D画像を扱うためのAPIが多々マイクロソフトから提供されており、その中にデスクトップ画像を取得できるものもあります。BitBlt()なんて古臭いので新しいAPIを一通り試してみましたが、いずれも期待外れに終わり、おそらく新しいAPIにしろBitBlt()にしろデスクトップから画像を取得する処理はOSにより一元管理されていて、その部分がネックなので改善の見込みはありませんでした。


■Windows8では・・・
 この状況を打開すると思われるのがWindows8で導入されたDesktop Duplication APIです。

 しかし、サンプルプログラムを作ってみましたが残念ながらWindows7では利用できませんでした。Windows8も持っていないので具体的にどのような動作になるのか確認も取れていません。将来的にはこれがWindows7で使えるようになってデスクトップキャプチャのこの閉塞感を打破してくれることを期待します。


■そして「ウィンドウ・キャプチャ」
 結局アマレココから何も変わらないじゃんってことになりますが、ひとつ進展したのが「ウインドウ・キャプチャ」機能です。
ウインドウキャプチャはAeroが有効な場合にのみ利用可能で、指定したウインドウの画像のみをキャプチャします。指定したウインドウは他のウインドウの下に隠れていても隠れた部分を含めキャプチャすることができます。
一番の特徴は画像をデスクトップからキャプチャするのではなく、指定したアプリケーションのオフスクリーンメモリーからキャプチャすることでパフォーマンスを向上させることができることです(30fpsに制限されない)。

■「ウインドウ・キャプチャ」の概要
 Aero有効時は各アプリケーションの画像を管理するためのオフスクリーンメモリーをOSが用意するらしく、デスクトップコンポジションはそのオフスクリーンの画像を元にDirectXの機能を使って半透明や拡大・縮小、3D変換といった処理を施し最終的にデスクトップ用の画像として合成(レンダリング)します。
 デスクトップ・キャプチャはレンダリングされた後の画像をキャプチャするのに対し、ウインドウ・キャプチャはレンダリングの元となるオフスクリーンをキャプチャする点が異なります。

 そして、その違いはパフォーマンスに大きく影響し、デスクトップ・キャプチャはレンダリングが終わるのを待つ必要があるのに対し、オフスクリーンキャプチャ(ウインドウ・キャプチャ)では基本的に待たされません(アプリケーション自体が画像を更新している間は待たされると思う)。なのでAeroが有効でもサクサク動き、高fpsで録画することが可能となります。

 弱点は、レンダリングされる前の不完全な画像なので、DirectXなどの処理が反映されないことです。キャプション部などのAeroガラスであったり、DirectXを使ったゲーム、EVRなどを使って表示している動画などもキャプチャできません。


■「Aero有効時にデスクトップキャプチャのパフォーマンスが低下する」について
(1) BitBlt()などのデスクトップキャプチャ処理がアプリケーションで実行されると、OSはキャプチャ処理を奪い取る。
(AeroはDirectXのフルスクリーンモードで動作するためBitBlt()などでは正常にキャプチャできない、アマレココがフルスクリーンのゲームを正常にキャプチャできないのと同じ。その対策としてOSが特別にキャプチャ処理を代行してくれるものと思われる)

(2) OSのキャプチャ処理はデスクトップコンポジションに対しデスクトップ画像をキャプチャ用に欲しいとリクエストを出す。

(3) デスクトップコンポジションはリクエストがあると表示用とキャプチャ用の2つのデスクトップ画像をレンダリングする。
しかし、いまレンダリング中の処理には新しいリクエストは間に合わないので反映されない。
キャプチャ用の画像がレンダリングされるのは最短で次のフレームとなる。
(これが今のフレームと次のフレームの2フレーム分待たされる原因と思われる)

(4) 次のフレームがレンダリングされ、リクエストに応じキャプチャ用の画像がOSのキャプチャ処理へ渡される。

(5) OSのキャプチャ処理はデスクトップコンポジションから取得した画像をBitBlt()などを実行したアプリケーションへ送る。

 ポイントはOSのリクエストが次のレンダリングでないと反映されないことと、OSのキャプチャ処理がシングルタスクで窓口が一つしかなく、複数のアプリケーションがBitBlt()を使うと行列ができてしまう点です。
行列ができる状況でも合理的にリクエストを発行することは無く、リクエスト→1フレーム以上待つ→レンダリング結果取得→ひととおり終わってから次のリクエストのサイクルをマイペースでこなすためパフォーマンスが低下してしまいます。

Aero時のデスクトップキャプチャ概念図
関連記事


コメントの投稿

 
 
あまラボへようこそ
このブログでは自作ソフトの最新情報やtips、PC動画に関する話題を掲載していきます。各記事へは下にあるカテゴリからアクセスして下さい。

ファイルのダウンロードはホームページの方でお願い致します。

質問・要望・不具合報告はこちら
アマレコTV
アマミキ!
アマレココ
アマレコ・ライト
ファンタジーリモート
AMVコーデック



ホームページ
カテゴリ
最新コメント
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
最新記事
最新トラックバック
ブログ内タグ

アマレコTV ビデオキャプチャ AMVコーデック アマレココ アマミキ! コーデック SC500 動画配信 ファンタジーリモート アマレコライト プラグイン AMV4 SC512 ライブ機能 デスクトップキャプチャ AVX2 FAQ リモートソフト 質問コーナー ニコニコ動画 DirectShow HDキャプチャ 組み換え 4K レゴ 遅延 可変再生速度 解説動画 LEGO XL2420T ベンチマーク Intensity AMV2MT 120Hz 倍速液晶 GV-USB2 アマステ 液晶モニター PS4 Pro デインターレース 32ZP2 Shadow VideoKeeper2 31024 RDT233WX-Z ffmpeg GV-USB AVX Play Alternate designs 31006 RGBキャプチャ RYZEN SD-USB2CAP4 XCAPTURE-1 DirectShowFilter キャプチャーツール Livetube シンクライアント イベント AtomでHDキャプチャ プレビュー 擬似NTSCキャプチャ IntensityPro SD-USB2CUP4 額縁遅延 MPC ハイパースレッディングテクノロジー HT インストール OBS QSV NVEnc 31021 フィギュア Kabelake SSE MonsterX3A XCapture-1 オーバーレイ 音ズレ 録画 HDMI HDCP 32ZP32 SKnet REGZA 液晶テレビ 倍速駆動 リプレイ機能 モノステ ZP3 倍速補完処理 MP3 Haswell 電源オプション LameACM 音遅延 ゲームスムーズモード MonsterXU3.0R DC-HD1 

ブログ内検索
月別アーカイブ
アマレココに関するリンク
お世話になっているソフトのリンク
RSSリンクの表示
管理画面
  • 管理画面