怎么知道动画为什么口吃?

Pat*_*lug 9 wpf performance animation

我有一些相当简单的动画(移动文本,移动椭圆等)并在全屏幕(1920x1080减去任务栏)中运行WPF Performance Suite在整个动画中报告大约50 FPS的良好帧率.Dirty Rect Addition大约300 rect/s,SW帧在0到4之间,HW帧在3到5之间.视频内存使用大约是80 MB.

WPF Performance屏幕截图

问题是动画每隔一秒就会断断续续.绝对不流畅:-(

我的机器是全新戴尔笔记本电脑XPS 15,配备GeForce GT 435和2GB内存. - 司机是最新的.(同样的行为也出现在我的上网本(全屏)中,所以我不认为它与硬件有关.)

如果我让窗户变小,口吃就会消失.

口吃最简单的动画 - 即使只有几个元素,但添加更多元素肯定会使它更明显.

我怎样才能找出导致这种口吃的原因?

当我想到它时,我实际上还没有看到任何WPF动画在全屏幕上流畅运行.这甚至可能吗?

JFT*_*TxJ 6

您是否尝试过为动画设置较低的“最大帧速率”?

<Storyboard Timeline.DesiredFrameRate="10">
    <!-- ....blah blah blah  -->
</Storyboard>
Run Code Online (Sandbox Code Playgroud)

如果您的动画导致大量重新计算子元素或父元素,则更改DesiredFrameRate将对系统进行的计算数量产生级联影响。另外,请查看此链接的“备注”部分。它说明了为什么/何时应使用它。

如果设置较低的帧速率可以解决问题,那么您需要考虑简化XAML,以限制动画每一帧所需的重新计算量(限制子对象或父对象调整大小或以任何方式受到影响的子对象或父对象的数量)动画制作的帧/更改。

您可能还需要签出“ WPF Performance Suite ”。它是一套很棒的工具,可用来确定WPF应用程序中到底发生了什么,查看窗口的哪些部分正在重新绘制以及何时重新绘制以及每个XAML元素的CPU使用率!

希望这可以帮助!


Qua*_*kly 2

帕特里克,

我没有答案。我所能做的就是提供一些团结。我正在尝试为 ItemsControl 制作动画。这个概念确实非常简单。我有一个 ListView,在 ListView 中我有一个 GridView。我希望 GridView 中的项目能够在底层列表排序时顺利地从一行转到另一行,这样,例如,排序列表将在列表中的值发生变化时保持排序。

我注意到这一点:中等复杂控件上的动画非常消耗 CPU。我非常确定这种卡顿与 CPU 被最大化有关(我注意到您没有在上面的转储中提供 CPU 图表)。将 CPU 保持在 50% 左右,动画就会显得流畅,高于 75% 就会出现卡顿现象。仍在解决这个问题,但我认为它比我的代码更深入。

大学教师