0

アルファブレンドでカスタムシェイプのウィンドウを描画できるスキニングエンジンを作りたいです。つまり、レイヤードウィンドウ(UpdateLayeredWindow)を使用します。典型的なウィンドウには、その背景の中に、10×10からたとえば300×150ピクセルの範囲の他の数十のビットマップが含まれます。最悪の場合、これらの要素のほとんどは30fpsまでのスムーズなアニメーションになります。すべてがアルファブレンドされ、これにはDirect2Dを使用します(はい、古いバージョンのWindowsではサポートされていません)。一般的に、Winampの最新のスキンエンジンが最も近い例です。

これらすべてを考慮し、最新のPCのパフォーマンスを考慮に入れると、ウィンドウ全体を1フレームごとに再描画できますか、それともある種のクリップ長方形に制限する必要がありますか?

4

2 に答える 2

1

D2Dでは、WM_PaintメッセージHonnesltyを使用してレンダリングし、IAnimationインターフェイスを使用して、D2DとWindowsに再描画の頻度を心配させる必要がありましたが、winampはadobe airで実行され、d2dを使用したレイヤードウィンドウでは問題が発生します。(Kindaは、DXGIレンダーターゲットを使用する必要があると考えていますが、ウィンドウがレイヤー化されている場合、アルファチャネルを更新できるように、ペイント呼び出しの終了にDCを返す必要があります)

于 2011-05-30T11:04:25.433 に答える
0

私はこれについていくらかの経験があります。

Windows XPをサポートする必要がある場合は、UpdateLayeredWindowを使用することがこの問題を解決するために利用できる唯一の選択肢です。この呼び出しのドキュメントには、呼び出されるたびにビットマップ全体が画面にコピーされると記載されており、このボトルネックが実際の制限要因としてベンチマークに現れました。ウィンドウが300x300の場合、数ピクセルだけを注意深く変更したとしても、更新のたびにその価格を支払います。実際のメリットがないためにレンダリング側を過度に最適化するのは非常に簡単なので、単純なものを実装し、測定してから、最適化する必要があるかどうかを判断します。

Windows XPのサポートを終了できる場合は、UpdateLayeredWindowを完全に回避し、DwmExtendFrameIntoClientAreaを使用してレイヤードウィンドウと同じ効果を作成できます。記述するコードが少なくなり、UpdateLayeredWindowのボトルネックが回避され、D2Dの操作が簡単になります。

于 2011-05-30T16:45:31.283 に答える