9

我正在使用 aWriteableBitmap以每秒 20 帧左右的速度显示我自己处理的图像。

这个问题(WPF:更有效的显示快速变化的图像的方法?
和这个问题(如何在没有大量内存分配的情况下显示快速更新的图像?
表明最好的方法是使用WriteableBitmap.

的文档WriteableBitmap表明WritePixels()在 UI 线程上调用将导致渲染线程重绘图像:

MSDN 文档:
UI 线程将内容写入后台缓冲区。渲染线程从前端缓冲区读取内容并将其复制到显存。通过更改的矩形区域跟踪对后台缓冲区的更改。

< 剪辑 />

当更新发送到渲染线程时,渲染线程将更改的矩形从后缓冲区复制到前缓冲区。渲染系统控制这种交换以避免死锁和重绘工件,例如“撕裂”。

我在后台线程上处理我的图像,然后使用Dispatcher.BeginInvoke()to call WritePixels(),以确保WritePixels()在 UI 线程上调用它。

我发现撕裂仍然会发生WriteableBitmap,并且在我正在处理的应用程序中,它看起来很糟糕(它是一个医学成像应用程序)。有什么我可以做的吗?

4

3 回答 3

5

为了避免撕裂,WriteableBitmap 做了很多工作,但在某些系统配置上,这是不可避免的。这主要发生在关闭了 Aero (DWM) 的 Windows XP 或 Vista 上。

于 2009-06-29T22:39:10.593 回答
1

当您调用 WritePixels() 时,您可能正在覆盖您的位图。使用 Dispatcher.Invoke() 而不是 BeginInvoke() 可能会有所帮助。

于 2009-06-26T19:21:15.597 回答
0

我知道这是一个旧线程,但我们遇到了完全相同的问题,在我们的例子中,它是由使用 Dispatcher.BeginInvoke 调用我们的更新显示方法引起的——当我们更改为 Dispatcher.Invoke 时,它​​立即清除了。

于 2017-02-28T17:15:21.693 回答