1

私は自分のプロジェクトで BitBlt を多用しています。多数のスレッドを作成し、各スレッドで BitBlt によって画面をキャプチャします。次の問題を除いて、今のところ期待どおりに機能します。

この問題は、ユーザーが実行中のプログラムをクリックしたとき、またはたとえばタスクバーで既に開いているエクスプローラーをクリックしたときに発生します。タスクバーで実行中のプログラムをクリックすると、最小化されるか、画面に表示されます。私が話している問題は、ちょうどこの移行で発生します。その瞬間、割り込みのようなもので、すべてのスレッドが画面のキャプチャを一瞬停止し、その後キャプチャを続けます。ボリュームコントロールウィンドウで物を上下に移動すると、同じことが起こります。なぜこれが起こっているのか、どうすればこれを防ぐことができるのかを教えてください。

ありがとう。

ジェイ

4

1 に答える 1

0

スケジュールの問題である可能性があります。アプリをアクティブ化すると、その優先度が一時的にわずかに向上します(UIで応答しているように見えるようにするため)。このブーストは、アニメーションと同じくらい長く続き、画面キャプチャスレッドを一時的に横取りする可能性があります。

デスクトップマネージャーがシリアライズしている可能性もあり、アニメーションが終了するまでビットビットが単に停止します。Aeroをオフにしても、デスクトップウィンドウマネージャーは合成モードのままである可​​能性があります。これは、HansPassantがコメントで説明した効果があります。

画面から動画を作ろうとすると、GDIに頼るのは無理だと思います。デスクトップウィンドウマネージャーについて読むことを強くお勧めします。たとえば、この警告は、あなたがやろうとしていることに直接当てはまります。

ディスプレイDCからの読み取りまたはディスプレイDCへの書き込みは避けてください。DWMでサポートされていますが、パフォーマンスが低下するため、お勧めしません。

GDIを使用して画面を読み取ろうとすると、DWMは実行を停止し、デスクトップの新しいコピーをビデオメモリにレンダリングし、ビデオメモリからシステムメモリにデータをコピーする必要があります。DWMがこれらを進行中のアニメーションよりも優先度の低いリクエストとして扱う可能性があるため、BitBltに応答するまでに、アニメーションは終了します。

この質問は、スクリーンキャプチャフィルターを備えたDirectShowが進むべき道かもしれないことを示唆しています。

于 2013-01-31T17:30:44.977 に答える