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

Rob*_*Rob 9 c# wpf artifacts .net-3.5 tearing

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

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

该文档WriteableBitmap表明调用WritePixels()UI线程将导致呈现线程重绘图像:

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

<snip />

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

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

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

小智 5

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