2009-11-23 108 views

回答

34

自从我提出这个问题后,我在这个领域获得了更多的经验后,我会自己回答。我的经验来自于WPF思维导图应用NovaMind工作 - 我们在NovaMind铂金做了很多动画最近我们Presenter feature :-)

的MSDN节上优化WPF应用程序性能有大约一般考虑一些有用的信息写入时WPF应用程序:

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

这里有一些位,我发现非常有用和相关的动画:

  • CompositionTarget.Rendering事件会导致WPF持续动画。如果你使用这个事件,请在每个机会上分离它。

  • 当您使用画笔设置元素的填充或笔画时,最好设置Brush.Opacity值而不是设置元素的“不透明度”属性。修改元素的不透明度属性可以使WPF创建一个临时表面。

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

下面是我通过不断摸索掌握:

  1. 说,你有几个要素与影响,如BlurEffect应用。这是方式更快地将效果应用于这些元素的容器,而不是元素本身。尽管效果是硬件加速的,但WPF似乎并不善于处理一些带有效果的小项目。 - 如果不需要相同的模糊半径,并且无法将它们组合到应用了效果的容器中,则将元素呈现为位图(以软件形式)然后为位图制作动画(如果可能) 。对物体产生影响(或不透明度)可快速杀死动画时的表现。
  2. 设置画笔上的不透明度而不是元素(如上所述)在动画对象时会产生巨大的性能差异。
  3. 保持视觉效果的数量减少。即使使用上述技巧,动画化大量粒子也很困难。在这种情况下,您可能需要恢复为WriteableBitmap。

我也听说通过在容器中重写OnRender来呈现许多小对象,然后使用drawingContext呈现它们,而不是直接将它们添加到可视化树中,这样会更快。实际上,在我的场景中(在渲染大约300个椭圆几何时)没有任何区别,但在某些场景中可能会有所帮助。这个理论听起来很可靠

最后,我发现WPF中内置的动画类过于繁琐,并且使用动画库的劣势获得更多乐趣和成功:Artefact Animator。真的,试试看吧。(它也可用于Silverlight)这是什么动画(在代码中)应该是这样的。

虽然不是彩虹和独角兽。在高分辨率下运行全屏时,我仍然发现无法创建真正流畅的动画。更多关于我的问题How to know why an animation stutters? - 我将不胜感激任何输入。

欢呼,祝你好运,如果你有什么酷炫的东西,让我知道:)