我有一些相当简单的动画(移动文本,移动椭圆等)并全屏运行(1920x1080减去任务栏)WPF Performance Suite在整个动画中报告大约50 FPS的良好帧率。 Dirty Rect Addition大约300 rect / s,SW帧在0到4之间,HW帧在3到5之间。视频内存使用大约80 MB。
问题是动画每隔一秒就会断断续续。它绝对不流畅: - (
我的机器是全新的戴尔笔记本电脑XPS 15,配备GeForce GT 435和2GB内存。 - 司机是最新的。 (同样的行为发生在我的上网本(全屏)上,所以我认为它与硬件无关。)
如果我让窗户变小,口吃就会消失。
口吃最简单的动画 - 即使只有几个元素,但添加更多元素肯定会让它更加引人注目。
如何找出造成这种口吃的原因?
当我想到它时,我实际上还没有看到任何WPF动画在全屏幕上流畅运行。这甚至可能吗?
答案 0 :(得分:4)
您是否尝试为动画设置较低的“最大帧速率”?
<Storyboard Timeline.DesiredFrameRate="10">
<!-- ....blah blah blah -->
</Storyboard>
如果您的动画导致大量重新计算子元素或父元素,则更改 DesiredFrameRate 将对系统进行的计算次数产生级联效果。 另外,请查看此link的“备注”部分。它解释了为什么/什么时候应该使用它。
如果设置较低的帧速率可以修复您的口吃,那么您需要考虑简化XAML以限制动画每一帧所需的重新计算量(限制调整大小的子对象或父对象的数量 - 或以任何方式受到影响 - 通过动画制作的每个帧/更改。
您可能还想查看“WPF Performance Suite”。它是一组很棒的工具,用于确定WPF应用程序的确切内容,查看窗口的哪些部分正在重新绘制,以及何时以及每个XAML元素的CPU使用情况!
希望这有帮助!
答案 1 :(得分:1)
帕特里克,
我没有答案。我所能做的就是提供一些团结。我正在尝试为ItemsControl设置动画。这个概念很简单,真的。我有一个ListView,在ListView中我有一个GridView。我希望GridView中的项目顺利地从一行转到另一行,因为基础列表已经排序,例如,排序列表将保持排序,因为列表中的值会发生变化。
我注意到这一点:中等复杂控件上的动画是CPU占用的。口吃我很确定只是与CPU被最大化有关(我注意到你没有在你的转储上面提供CPU图)。将CPU保持在50%左右,动画显得平滑,高于75%,你会得到这些口吃。 仍在处理这个问题,但我认为它比我的代码更深入。
唐
答案 2 :(得分:0)
我有一个类似的问题,它是口吃,没有什么真正重要的,它只是看起来像我在运行程序时的小口吃。在预感中,我在谷歌浏览器运行时将其关闭并修复它,滚动变得非常流畅......
所以我的建议是,如果您打开任何互联网浏览器,请检查是否关闭它们可以解决问题。