【问题标题】:WPF Choppy AnimationWPF 断断续续的动画
【发布时间】:2011-02-27 12:31:59
【问题描述】:

WPF Windows-XP SP3

我遇到了一个简单的 WPF 动画问题。

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

<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 诊断工具可以提供帮助?

更新:我检查了我的视频驱动程序,它们是最新版本。 (英伟达 GeForce 8400 GS)

【问题讨论】:

  • 您是否需要重新启动系统(即重新启动 prog 没有帮助)?这看起来像是驱动程序 (DirectX) 问题。
  • @Chris Dunaway:+1 表示经过大量努力后提出的问题。
  • 仅供参考:我将其复制粘贴到一个新项目中并让它运行几个小时。没问题。 Vista/32
  • 我找不到我阅读它的链接,但它基本上说:WPF动画可能在Windows XP上很烂。关于如何处理(或不处理)硬件加速?
  • 到目前为止,我已经在 Windows7 x64 和 Windows XP SP3 上运行了一个小时...目前还没有问题。我正在运行 perfmon 以防万一在 XP 系统上查看资源利用率如果确实变慢了。

标签: wpf performance animation windows-xp-sp3


【解决方案1】:

我认为使用 WPF 您会遇到渲染效果不佳的机器。我在我的笔记本电脑上试过了,没问题。

【讨论】:

    【解决方案2】:

    在运行您的动画一天多一点后,我没有看到任何非常糟糕的事情发生,尽管内存使用量有所增加。

    我最终做的是在 kaxaml 中在 XP SP3 上运行您的示例,然后使用 perfmon 进行了一些穷人的性能检查。

    如果您以前没有使用过 perfmon,只需从开始菜单执行 Run -> perfmon。它可能会在列表中提供一些计数器,但如果您不想监视这些值,可以单击每个计数器并删除它们。我认为您的 CPU 利用率不是问题,但您可以保留它以防万一。

    右键单击任意位置并选择“添加计数器”,然后在“性能对象”下选择“.NET CLR 内存”。在右侧,选择感兴趣的可执行文件(在我的例子中,它是“Kaxaml”)。在左侧,选择“# Bytes in all Heaps”。我还将采样率更改为更大的值,例如 300 秒,这样您就可以更好地了解您遇到减速的时间段内的变化率。

    这可能无法帮助您找到减速,但这是合理的第一步。也许您还应该下载 ANTS 5 profiler 的试用版,看看它是否捕捉到任何奇怪的东西。

    【讨论】:

    • 谢谢戴夫。我不认为只是时间导致了问题。我认为这一定是多种因素的结合。由于检查性能的提示,我接受了这个答案。
    【解决方案3】:

    我已经让动画运行了 30 多个小时,它没有变慢或变得不稳定,但我运行的是 Win 7。我让它在 XP VM 中运行了几个小时,它运行良好.

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

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

    建议:

    • 检查驱动程序更新
    • 尝试不同的视频卡(如果可能)
    • 打开 PerfMon 并获取所有可能的 WPF 和 DirectX 计数器并随着时间的推移进行监控

    【讨论】:

      【解决方案4】:

      您是否打开了任何互联网浏览器?我在运行的动画中遇到了类似的问题,它断断续续......没什么可怕的,它只是引人注目和烦人,就像它每半秒左右就会出现微小的口吃......

      凭直觉,我关闭了我打开的谷歌浏览器,口吃完全解决了。如果您在运行时打开了任何网络浏览器,请尝试将其关闭,看看是否有帮助,它对我有用。

      【讨论】: