バックグラウンド
スクリーンキャスト プログラムは、多くの場合、最小限のパフォーマンスで画面イベントのキャプチャを優先します。インパクト。 GDI は画面キャプチャの方法として広く知られているため、潜在的な効率向上を考慮して他のアプローチも検討する価値があります。この記事の目的は、最速の方法を調査し、その実装についての洞察を提供することです。
GDI の代替方法
Windows Media API と DirectX は、改善された代替画面キャプチャ オプションを提供します。パフォーマンス。 Windows Media API は DirectShow を活用し、カスタム キャプチャ フィルターの作成を可能にします。 DirectX は Direct3D を利用し、低レベルのグラフィックス操作へのアクセスを提供します。
ハードウェア アクセラレーションとパフォーマンス
ハードウェア アクセラレーションを無効にすると、キャプチャ パフォーマンスが大幅に向上します。これは、ハードウェア アクセラレーションによりレンダリング タスクが専用ハードウェアにオフロードされ、遅延が発生する可能性があるためです。ハードウェア アクセラレーションをバイパスすることで、キャプチャ プロセスが CPU 上で直接実行され、遅延が軽減されます。
カスタム キャプチャ ドライバ
Camtasia などのプログラムは、高速化を実現するためにカスタマイズされたキャプチャ ドライバを採用しています。画面キャプチャ。これらのドライバーは下位レベルで動作し、グラフィックス API 呼び出しをインターセプトし、システム RAM からフレームを直接読み取ります。これにより、低速のビデオ RAM 読み取り操作がバイパスされ、効率が向上します。
バック バッファーとフロント バッファーのキャプチャ
FRAPS は、基礎となるグラフィックス API をフックし、そこから読み取ることで画面をキャプチャします。バックバッファ。バック バッファには最終的にレンダリングされたフレームが保存され、フロント バッファよりも高速にアクセスできます。この手法により、全画面取得の必要性がなくなり、パフォーマンスがさらに最適化されます。
Direct3D 画面キャプチャのコード サンプル
次のコード スニペットは、Direct3D を使用した画面キャプチャを示しています。子:
void dump_buffer() { IDirect3DSurface9* pRenderTarget=NULL; IDirect3DSurface9* pDestTarget=NULL; const char file[] = "Pickture.bmp"; // sanity checks. if (Device == NULL) return; // get the render target surface. HRESULT hr = Device->GetRenderTarget(0, &pRenderTarget); // create a destination surface. hr = Device->CreateOffscreenPlainSurface(DisplayMde.Width, DisplayMde.Height, DisplayMde.Format, D3DPOOL_SYSTEMMEM, &pDestTarget, NULL); //copy the render target to the destination surface. hr = Device->GetRenderTargetData(pRenderTarget, pDestTarget); // save its contents to a bitmap file. hr = D3DXSaveSurfaceToFile(file, D3DXIFF_BMP, pDestTarget, NULL, NULL); // clean up. pRenderTarget->Release(); pDestTarget->Release(); }
以上がWindows でスクリーン キャプチャを最適化する最速の方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。