CompositionTarget.Rendering 事件在 WPF 将要渲染时被调用,所以此时您应该执行Lock()
and Unlock()
. 之后Unlock()
,您可以开始下一个渲染。
您还应该检查,RenderingTime
因为该事件可能每帧触发多次。尝试这样的事情:
private void HandleWpfCompositionTargetRendering(object sender, EventArgs e)
{
RenderingEventArgs rea = e as RenderingEventArgs;
// It's possible for Rendering to call back twice in the same frame
// so only render when we haven't already rendered in this frame.
if (this.lastRenderTime == rea.RenderingTime)
return;
if (this.renderIsFinished)
{
// Lock();
// SetBackBuffer(...);
// AddDirtyRect(...);
// Unlock();
this.renderIsFinished = false;
// Fire event to start new render
// the event needs to set this.renderIsFinished = true when the render is done
// Remember last render time
this.lastRenderTime = rea.RenderingTime;
}
}
更新以解决评论
你确定有比赛条件吗?这个页面说当你调用时后台缓冲区被复制Unlock()
。
如果真的存在竞争条件,那么在渲染代码周围放置 Lock/Unlock 怎么样?该页面表示Lock()
将阻止直到复制完成。