Wpf动画最佳实践

30

我正在寻找关于WPF动画的最佳实践或指导方针,特别是有关性能注意事项的信息。

1个回答

44

在我提出这个问题后,我在这个领域获得了更多的经验,所以我会自己回答这个问题。我的经验来自于在WPF思维导图应用程序NovaMind上的工作 - 我们最近为我们NovaMind Platinum中的Presenter功能做了很多动画 :-)

MSDN关于优化WPF应用程序性能的部分提供了一些有用的信息,涉及编写WPF应用程序时的一般考虑事项:

http://msdn.microsoft.com/en-us/library/aa970683.aspx

以下是一些与动画相关的特别有用的部分:

  • CompositionTarget.Rendering事件会导致WPF不断进行动画。如果使用此事件,请在每个机会上分离它。

  • 当您使用Brush来设置元素的Fill或Stroke时,最好设置Brush.Opacity值,而不是设置元素的Opacity属性。修改元素的Opacity属性可能会导致WPF创建临时表面。

  • 在某些情况下,您可以更新Transform而不是将其替换为RenderTransform属性的值。这在涉及动画的场景中尤其如此。通过更新现有的Transform,您可以避免启动不必要的布局计算。

以下是我通过试错学到的内容:

  1. 假设你有一些应用了模糊效果(BlurEffect)的元素。将该效果应用到这些元素的容器上比直接应用到元素本身要快得多。尽管该效果是硬件加速的,但 WPF 在处理大量带有效果的小元素时似乎表现不佳。如果你不想使用相同的模糊半径并且无法将它们分组到一个带有效果的容器中,则实际上最快的方法是在软件中将该元素渲染为位图,然后围绕该位图进行动画(如果可能)。当动画对象具有效果(或不透明度)时,性能会迅速下降。
  2. 在刷子上设置不透明度而不是在元素上设置(如前面所述)在动画对象时会产生巨大的性能差异。
  3. 保持视觉元素数量较少。即使采用上述提示,动画大量粒子仍然很困难。在这种情况下,您可能需要使用 WriteableBitmap。

我还听说,通过重写容器中的 OnRender 并使用 drawingContext 直接渲染它们而不是将它们添加到可视树中,可以更快地渲染许多小对象。在我的场景中(渲染约 300 个椭圆几何图形时),实践证明这并没有什么区别,但在某些情况下可能有所帮助。理论听起来很可靠。

最后,我发现 WPF 内置的动画类过于繁琐,使用动画库Artefact Animator的体验更加愉快且成功率更高。真的,试试看吧。(它也适用于 Silverlight)这才是代码动画应该具备的样子。

但并非一切都是美好的。当以更高的分辨率全屏运行时,我仍然发现很难创建真正流畅的动画。关于这个问题如何确定动画为什么会卡顿? - 我会感激任何意见。

祝好,祝好运,如果您有cool的展示,请告诉我 :)


我必须为大量小元素制作动画。如果您有关于“在软件中将元素渲染为位图”的任何链接,我将不胜感激。 - Derf Skren

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