且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何检测WPF控件何时被重绘?

更新时间:2022-01-17 14:50:26

为了与UI并行呈现,执行此操作的干净方法似乎是呈现到单独的D3D图面中,并在调用Lock()和Unlock()之间将其复制到显示图面(即传递给SetBackBuffer的图面)。因此算法变成:

  1. 复制并显示最后渲染的帧,即
    • Lock()
    • 从渲染复制到显示图面
    • SetBackBuffer(displaySurface)
    • AddDirtyRect()
    • Unlock()
  2. 计划对渲染图面进行新渲染
  3. 等待它完成并确定显示时间
  4. 转到%1

D3DImage文档explicitely states

解锁D3DImage时不要更新Direct3D表面。

这里的痛点是拷贝,这可能很昂贵(即,如果硬件繁忙,则大于2ms)。为了在解锁D3DImage时使用显示图面(避免渲染时潜在的代价高昂的操作),用户将不得不求助于反汇编和反射来挂钩到D3DImage自己的渲染中.