WPF:如何防止使用WriteableBitmap撕裂?
我正在使用WriteableBitmap
显示我自己处理的图像,每秒约20帧。
这个问题( WPF:显示快速变化图像的更有效方式? )
这个问题( 如何在没有大内存分配的情况下显示快速更新的图像? )
表明最好的方法是使用WriteableBitmap
。
WriteableBitmap
的文档表明在UI线程上调用WritePixels()
会导致渲染线程重绘图像:
MSDN文档:
UI线程将内容写入后台缓冲区。 渲染线程从前端缓冲区读取内容并将其复制到video内存。 使用更改的矩形区域跟踪对后缓冲区的更改。
当更新发送到呈现线程时,呈现线程将更改的矩形从后缓冲区复制到前台缓冲区。 渲染系统控制此交换以避免死锁和重绘伪像,例如“撕裂”。
我在后台线程上处理我的图像,然后使用Dispatcher.BeginInvoke()
来调用WritePixels()
,以确保在UI线程上调用WritePixels()
。
我发现使用WriteableBitmap
仍然会发生撕裂,而在我正在处理的应用程序中,它看起来很糟糕(它是一个医学成像应用程序)。 有什么我可以做的吗?
WriteableBitmap中有很多工作要避免撕裂,但在某些系统配置中这是不可避免的。 这主要发生在关闭Aero(DWM)的Windows XP或Vista上。
当您调用WritePixels()时,您可能会覆盖您的位图。 使用Dispatcher.Invoke()而不是BeginInvoke()可能会有所帮助。
我知道这是一个旧线程,但我们有完全相同的问题,在我们的情况下,它是由使用Dispatcher.BeginInvoke调用我们的更新显示方法引起的 – 我们更改为Dispatcher.Invoke它立即清除。