1

デスクトップ コンポジションが有効になっている場合でも、ダブル バッファリングは必要ですか?

Microsoft のアプリケーション互換性ガイド:

グラフィカル デバイス インターフェイス (GDI)

Windows Vista および Windows Server 2008 より前は、ウィンドウ ハンドル (HWND) が画面に直接描画されていました。これには一定の利点がありましたが、Windows がトップレベル ウィンドウを表示および管理する方法は制限されていました。Windows Vista および Windows Server 2008 では、すべての最上位ウィンドウがオフスクリーン ビットマップ (WS_EX_LAYERED と同様) にレンダリングされ、デスクトップ ウィンドウ マネージャーが画像を組み合わせてデスクトップを描画します。

すべてのレンダリングがオフスクリーン ビットマップに対して行われるようになりました。

ウィンドウはオフスクリーン ビットマップにレンダリングされます

これは正しいです?

私が尋ねる理由は、標準のペイント サイクル中にまだちらつきが見られるためです。

  • WM_ERASEBKGND
  • WM_PAINT

デスクトップ コンポジションが有効になっている場合:

代替テキスト

私はへの呼び出しの間にそれを想定していたでしょう

   BeginPaint(hWnd, paintStructure);
   ...
   EndPaint(hWnd, paintStructure);

すべての描画がバック バッファーで行われることを確認します。

ウィンドウはオフスクリーン ビットマップにレンダリングされます

一方、フロント バッファは影響を受けません。

4

3 に答える 3

1

オフスクリーン ビットマップにペイントすると、アプリケーションが再描画されるのを待たずに、DWM が好きなようにウィンドウを合成できるようになります (たとえば、XP でウィンドウを別のウィンドウの上に移動する場合のように)。

これは、そのオフスクリーン サーフェスへの描画が自動的にちらつきを減らすという意味ではありません。ウィンドウを消去してから再描画し、両方のアクションの間に DWM が画面を再描画すると (毎秒約 60 回)、もちろんちらつきが発生します。

アプリケーションの再描画が十分に速くない場合の「白いウィンドウ」の問題を解決し、ウィンドウのオーバーラップによる再描画も減らします。しかし、ちらつきに対しては役に立ちません。DWM は、ペイント操作がまだ完了していないこと、およびコンテンツを再度描画するまでウィンドウの古いイメージを表示したいことを知る方法がありません。

于 2009-12-03T15:22:00.197 に答える
1

これは正しいです?

そうです (これにより、現在隠れているウィンドウの一部をサムネイルで表示することができます)。

DWM による画面のレンダリングは、ダブル バッファリングされます。ただし、消去とペイントの間にバッファを取得すると...目に見えるアーティファクトとして表示されます。したがって、ダブルバッファリングが必要です。ダブル バッファリングは、各ウィンドウが描画されるオフスクリーン バッファではなく、デスクトップで発生します (つまり、次のデスクトップ ビューを完全に描画してから反転します)。

于 2009-12-03T15:25:24.190 に答える