代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  9
  • Rob  · 技术社区  · 15 年前

    我用的是一个 WriteableBitmap 为了显示图像,我以每秒20帧的速度处理自己。

    这个问题( WPF: More efficient way of displaying quickly-changing images? )
    这个问题呢( How to display quick-updating images without large memory allocation? )
    指出执行此操作的最佳方法是使用 .

    可写位图 表示调用 WritePixels() 在UI线程上,将导致渲染线程重新绘制图像:


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

    <剪断/>

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

    我在背景线程上处理图像,然后使用 Dispatcher.BeginInvoke() WritePixels() ,以确保 WritePixels() 在UI线程上调用。

    可写位图 ,在我正在开发的应用程序中,它看起来很糟糕(它是一个医学成像应用程序)。有什么我能做的吗?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Jeremiah Morrill Jeremiah Morrill    15 年前

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

        2
  •  1
  •   Ray    15 年前

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

        3
  •  0
  •   Peter Jarrett    7 年前

    我知道这是一个旧线程,但我们有完全相同的问题,在我们的情况下,这是由使用Dispatcher.BeginInvoke调用更新显示方法引起的-我们更改为Dispatcher.Invoke的那一刻立即清除了该问题。