WPF 动画存在撕裂和闪烁
我在 WPF 动画中遇到撕裂和闪烁问题。我有一个玩具应用程序可以演示这些问题。该应用程序在屏幕上呈现方块动画。方块的边缘出现撕裂现象,整个动画感觉不平滑。
Perforator 显示 >60fps、~10mb 视频内存、0 IRT。
我已经在两台新的高端计算机上尝试过此操作,并且都显示相同的糟糕动画(> 1gb vram、四核等)。
I'm having trouble with tearing and flickering in WPF animations. I have a toy app that demonstrates the problems. The app animates squares across the screen. The edges of the squares show tearing and the animation as a whole does not feel smooth.
Perforator shows >60fps, ~10mb video memory, 0 IRTs.
I have tried this on two new high end computers and both show the same poor animation (>1gb vram, quad core etc).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您绝对确定您的代码正在运行硬件加速吗?请查看此列表:http://blogs.msdn.com/b/jgoldb/archive/2010/06/22/software-rendering-usage-in-wpf.aspx。
如果是这样 - 考虑到您拥有超酷的硬件 - 您可以尝试在 CPU 而不是 GPU 上运行它。您可以通过将 RenderMode 设置为 SoftwareOnly 来强制执行此操作(上面链接的列表中的第 6 项)
Are you absolutely sure your Code is running hardware accelerated? Please look into this list : http://blogs.msdn.com/b/jgoldb/archive/2010/06/22/software-rendering-usage-in-wpf.aspx.
If so - given that ubercool hardware you got - you could try running it on CPU instead of GPU. You can enforce that by setting the RenderMode to SoftwareOnly (Item 6 in the list linked to above)
我向 WPF 团队提出了这个问题,总而言之,他们说他们认为动画平滑度存在一些可以改进的问题。
他们还补充道:
的动画,对我来说看起来更流畅。特别感谢 Dwayne Need 提供此信息。
I raised this question with WPF team and in summary they said that they believe that there are some glitches with animation smoothness that could be improved.
They also added:
They also demonstrated a purely declarative version of the animations, and it appeared smoother to me. Special thanks to Dwayne Need for this information.
造成撕裂的原因是创建了许多必须由 UI 线程拥有的对象,并且所有这些调用以及将它们添加到 UI 容器都将通过主线程。
我什至尝试制作线程驱动版本而不是计时器,但这并没有改变任何内容,因为所有 FrameWorkElement 对象都必须使用 Dispatcher.Invoke 创建。
Storyboard 和 beginStoryboard + EventTrigger 的创建都必须在 Ui 线程上完成。这就是阻碍流畅性的原因。
不幸的是,这种设计无法实现无闪烁操作:/
The reason why this has tearing is that a lot of object that must be UI thread owned are created and all those calls plus adding them to UI container is going through the main thread.
I even tried to make a Thread driven version instead of Timers, but that did not change anything since all FrameWorkElement objects must be created with Dispatcher.Invoke.
The creation of storyboards and beginStoryboard + EventTrigger all must be done on the Ui thread. This is what is blocking the fluency.
Unfortunately with this design there is no way of achieving flickerfree operation :/