首页 / C# / c# – 如何检测何时重绘WPF控件?
c# – 如何检测何时重绘WPF控件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何检测何时重绘WPF控件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1672字,纯文字阅读大概需要3分钟。
内容图文
![c# – 如何检测何时重绘WPF控件?](/upload/InfoBanner/zyjiaocheng/770/111bd761858c4a0e8d402ace80a6c184.jpg)
我正在使用D3DImage显示一系列帧,这些帧一个接一个地呈现在同一个Direct3D Surface中.我现在的逻辑是这样的:
>显示最后渲染的帧(ieD3DImage.Lock()/ AddDirtyRect()/ Unlock())
>开始渲染下一帧
>等待下一帧准备就绪,是时候显示它了
>显示上次渲染的帧
> ……
这种方法的问题在于,当我们在D3DImage上调用Unlock()时,图像实际上没有被复制,它只被安排在下一个WPF渲染上复制.因此,在WPF有机会显示之前,我们可能会在Direct3D表面上渲染一个新帧.最终结果是我们在显示器上看到错过的帧.
现在我正在尝试使用单独的Direct3D纹理进行渲染,并在显示之前执行复制到“显示纹理”,这样可以提供更好的结果,但会产生大量的开销.最好能够知道D3DImage何时完成刷新并立即开始渲染下一帧.这有可能,如果是这样的话怎么样?或者你有一个更好的想法?
谢谢.
解决方法:
当WPF要渲染时调用CompositionTarget.Rendering event,所以当你应该执行Lock()和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;
}
}
更新以解决评论
你确定有竞争条件吗? This page表示在调用Unlock()时会复制后台缓冲区.
如果确实存在竞争条件,那么在渲染代码周围放置锁定/解锁怎么样? This page表示Lock()将阻止,直到副本完成.
内容总结
以上是互联网集市为您收集整理的c# – 如何检测何时重绘WPF控件?全部内容,希望文章能够帮你解决c# – 如何检测何时重绘WPF控件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。