WPF动画卡顿问题

9

WPF Windows-XP SP3

我在使用简单的WPF动画时遇到了问题。

我在XamlPad和WPF项目中使用以下Xaml代码:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Border Name="MyBorder" BorderThickness="10" BorderBrush="Blue" CornerRadius="10" Background="DarkRed" >
       <Rectangle Name="MyRectangle" Margin="10" StrokeDashArray="2.0,1.0" StrokeThickness="10" RadiusX="10" RadiusY="10" Stroke="Black" StrokeDashOffset="0">
           <Rectangle.Triggers>
               <EventTrigger RoutedEvent="Rectangle.Loaded">
                   <BeginStoryboard>
                       <Storyboard>
                           <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="StrokeDashOffset" From="0.0" To="3.0" Duration="0:0:1" RepeatBehavior="Forever" Timeline.DesiredFrameRate="30" />
                       </Storyboard>
                   </BeginStoryboard>
               </EventTrigger>
           </Rectangle.Triggers>
       </Rectangle>
    </Border>
</Page>

它的效果是使边框围绕矩形进行动画。在机器重新启动后,此动画流畅而美观。但是,我倾向于一直开着我的电脑,经过一段时间(我不知道多长时间),动画开始卡顿并变得不流畅。
我认为可能是内存或资源问题,但在关闭所有其他应用程序和任何看起来不必要的服务后,卡顿仍然持续。但是,在系统重新启动之后,动画又变得流畅了!
我在WPF应用程序或XamlPad中遇到了相同的症状。在应用程序的情况下,无论我是在调试器中运行还是直接运行可执行文件,似乎都没有任何区别。
我应用了此链接中的补丁:http://support.microsoft.com/kb/981741,我认为它已经解决了这个问题,但似乎并没有。
我看到一些帖子可能表明使用透明度可能会影响动画,但是正如您所看到的,我的xaml没有使用透明度。
有人能给我一些建议,如何确定问题是什么?是否有任何WPF诊断工具可以帮助?
更新:我检查了我的视频驱动程序,它们是最新版本。(nVidia GeForce 8400 GS)

1
你需要系统重启吗(即重新启动程序无法解决问题)?这看起来像是驱动程序(DirectX)的问题。 - H H
4
感谢你的认可,Chris Dunaway,因为你经过很多努力后提出了这个问题,所以我给你点赞。 - Amsakanna
FYI:我将其复制粘贴到一个新项目中并运行了几个小时。没有问题。Vista/32 - H H
我找不到我读过的链接,但基本上它说:WPF动画在Windows XP上可能会很糟糕。这与硬件加速的处理方式(或未处理)有关吗? - Stewbob
到目前为止,我已经在Windows7 x64和Windows XP SP3上运行了一个小时...还没有出现问题。我正在XP系统上运行perfmon以防万一,以查看如果它变慢时资源利用情况如何。 - Dave
显示剩余2条评论
4个回答

2
在运行动画一天后,我并没有看到任何严重的问题,尽管内存使用量略有增加。
我最终在XP SP3上使用kaxaml运行了您的示例,并使用perfmon进行了一些简单的性能检查。
如果您以前没有使用过perfmon,请从开始菜单中运行-perfmon。它可能已经列出了几个计数器,但是如果您不想监视这些值,则可以单击每个计数器并将其删除。我认为在您的情况下,CPU利用率不是问题,但是您可以保留它以防万一。
右键单击任何位置,然后选择“添加计数器”,然后在“性能对象”下选择“.NET CLR内存”。在右侧,选择感兴趣的可执行文件(在我的情况下,它是“Kaxaml”)。在左侧选择“所有堆中的字节数”。我还会将采样速率更改为较大的值,例如300秒,以便您可以更好地了解您正在经历的减速时间段的变化速率。
这可能无法帮助您找到减速,但这是一个合理的第一步。也许您还应该下载ANTS 5分析器的试用版,以查看是否捕获到任何奇怪的东西。

谢谢Dave。我觉得问题不仅仅是时间的原因,而是多种因素的综合作用。我接受这个答案是因为它提供了检查性能的技巧。 - Chris Dunaway

1

我已经让动画运行了超过30个小时,它没有变慢或卡顿,但我正在运行Win 7。我也让它在XP虚拟机中运行了几个小时,它也很好地运行。

我的最佳猜测:视频驱动程序

理由:视频驱动程序是系统中最复杂的驱动程序,与计算机的整体性能有很大关系。虽然动画调度计时器可能会落后,但除非您使用了大量CPU,否则不太可能出现这种情况。

建议:

  • 检查驱动程序更新
  • 尝试不同的显卡(如果可能)
  • 打开PerfMon并获取每个WPF和DirectX计数器,并随时间监视

0

我认为使用WPF会遇到一些呈现效果不太好的机器。我在我的笔记本电脑上尝试过,效果很好。


0
你有任何网络浏览器打开吗?我曾在运行动画时遇到类似的问题,它很卡...并不是非常严重,但是很明显和让人烦恼,就像每隔半秒钟或更长时间一次出现微小的卡顿...

出于直觉,我关闭了正在运行的 Google Chrome 浏览器,结果完全解决了卡顿问题。如果你在运行时打开了任何Web浏览器,请尝试关闭它们并查看是否有所帮助,这对我很有效。


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