WPF:如何防止使用WriteableBitmap撕裂?

时间:2009-06-26 14:27:43

标签: c# wpf .net-3.5 artifacts tearing

我正在使用WriteableBitmap来显示我自己处理的图像,每秒约20帧。

这个问题(WPF: More efficient way of displaying quickly-changing images?
这个问题(How to display quick-updating images without large memory allocation?
表明最好的方法是使用WriteableBitmap

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

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

< snip />

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

我在后台线程上处理我的图片,然后使用Dispatcher.BeginInvoke()来调用WritePixels(),以确保在UI线程上调用WritePixels()

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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