如何判断动画卡顿的原因?

11

我有几个相当简单的动画(移动文本、移动椭圆形等),在全屏运行(1920x1080减去任务栏),WPF性能套件报告了一个良好的帧率,大约在50 FPS左右。脏矩形添加速度约为300个/秒,软件帧数在0到4之间,硬件帧数在3到5之间。视频内存使用量约为80 MB。

WPF Performance screen shot

问题是,动画每隔半秒钟就会出现卡顿。它绝对不流畅 :-(

我的机器是一台新的 Dell XPS 15 笔记本电脑,配备 GeForce GT 435 显卡,拥有2GB内存。- 驱动程序已经更新。(在我的上网本(全屏)上也出现了相同的行为,所以我认为这不是硬件相关的问题。)

如果我将窗口缩小,卡顿就会消失。

卡顿发生在最简单的动画中 - 即使只有几个元素,但添加更多元素肯定会使其更加明显。

如何找出是什么原因导致了这个卡顿?

想一想,我实际上并没有看到任何在全屏下平滑运行的 WPF 动画。这真的可能吗?


也许你重绘的太多了?即使两个帧之间没有改变,像素仍被标记为脏。 - Jonas Kongslund
1
很好的问题!作为一个测试,你是否尝试只保留一个动画控件来查看卡顿是否仍然存在?如果没有,那么你是如何更新所有控件的数据的,也就是说,它们都在同一个线程上,还是你正在生成任务/并行方法,然后当它们完成时在UI线程上更新UI? - denis morozov
1
当我想起来时,我实际上没有看到任何在全屏下平稳运行的WPF动画。啊哈!WPF非常缓慢。你能做的最好的事情就是动画化较不复杂的UI、降低帧率或者等待WTF框架解决所有这些问题;P - Dr. Andrew Burnett-Thompson
你的XPS笔记本电脑有nVidia Optimus设置吗?我在我的XPS 15上使用了这个设置,发现当使用集成显卡运行动画时,效果并不流畅。强制应用程序使用nVidia显卡可以大大提高性能。 - rossisdead
看起来没有解决方案 - https://dev59.com/lk7Sa4cB1Zd3GeqP2VDv :( - Goran
显示剩余3条评论
3个回答

8
你尝试过将动画的“最大帧率”设置得更低吗?
<Storyboard Timeline.DesiredFrameRate="10">
    <!-- ....blah blah blah  -->
</Storyboard>

如果您的动画导致子元素或父元素的大量重新计算,更改DesiredFrameRate将对系统进行的计算数量产生级联影响。 此外,请查看link的“备注”部分。它解释了何时/为什么应该使用它。
如果设置较低的帧率可以解决卡顿问题,则需要考虑简化您的XAML,以限制在每个动画帧中需要重新计算的子对象或父对象的数量(限制每个动画帧/更改对其进行调整的子对象或父对象的数量)。
您可能还想查看“WPF性能套件”。这是一组很棒的工具,可确定您的WPF应用程序中正在发生的情况,查看窗口的哪些部分正在被重绘以及每个XAML元素的CPU使用情况!
希望这有所帮助!

2

Patrick,

我没有答案。我能做的只是提供一些支持。我正在尝试激活一个ItemsControl。其实这个概念很简单。我有一个ListView,在ListView中我有一个GridView。我希望GridView中的项目在底层列表排序时能够平稳地从一行滑动到另一行,以便例如排序后的列表会随着列表中的值的更改而保持排序。

我注意到这一点:对于相当复杂的控件进行动画处理会占用大量CPU。我相信这种顿挫与CPU被耗尽有关(我注意到您在上面的转储中没有提供CPU图表)。将CPU保持在50%左右,动画看起来就会流畅,超过75%,你就会得到这些顿挫。虽然仍在解决问题,但我认为它比我的代码更深入。

Don


0

我曾经遇到过类似的问题,程序会出现一些小卡顿,看起来并不是很严重。后来我有一个直觉,就是在程序运行时关闭了 Google Chrome 浏览器,这样问题就解决了,滚动变得非常流畅...

所以我的建议是,如果你有任何互联网浏览器打开,请检查是否关闭它们可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接