9

を使用して、WriteableBitmap毎秒約 20 フレームで処理する画像を表示しています。

この質問 ( WPF: 急速に変化する画像を表示するより効率的な方法? )
とこの質問 (大きなメモリを割り当てずに迅速に更新する画像を表示する方法は? )
は、これを行う最善の方法はWriteableBitmap.

のドキュメントは、UI スレッドWriteableBitmapで呼び出すWritePixels()と、レンダリング スレッドが画像を再描画すること を示しています。

MSDN ドキュメント:
UI スレッドはコンテンツをバック バッファーに書き込みます。レンダリング スレッドは、フロント バッファーからコンテンツを読み取り、それをビデオ メモリにコピーします。バック バッファーへの変更は、変更された四角形領域で追跡されます。

<中略/>

更新がレンダリング スレッドに送信されると、レンダリング スレッドは、変更された四角形をバック バッファーからフロント バッファーにコピーします。レンダリング システムは、この交換を制御して、デッドロックを回避し、「テアリング」などのアーティファクトを再描画します。

バックグラウンド スレッドで画像を処理してから、Dispatcher.BeginInvoke()を呼び出して、が UI スレッドでWritePixels()確実に呼び出されるようにします。WritePixels()

でティアリングがまだ発生していることWriteableBitmapがわかりました。私が取り組んでいるアプリケーションでは、ひどく見えます(医療画像アプリケーション)。何か私にできることはありますか?

4

3 に答える 3

5

テアリングを回避するために WriteableBitmap に多くの作業が行われましたが、一部のシステム構成ではこれは避けられません。これは主に、Aero (DWM) がオフになっている Windows XP または Vista で発生します。

于 2009-06-29T22:39:10.593 に答える
1

WritePixels()を呼び出しているときに、ビットマップを上書きしている可能性があります。BeginInvoke()ではなくDispatcher.Invoke()を使用すると役立つ場合があります。

于 2009-06-26T19:21:15.597 に答える
0

これが古いスレッドであることは知っていますが、まったく同じ問題がありました。私たちの場合、Dispatcher.BeginInvoke を使用して更新表示メソッドを呼び出したことが原因でした。Dispatcher.Invoke に変更した瞬間に、すぐに解決しました。

于 2017-02-28T17:15:21.693 に答える