Wpf动画最佳实践

Pat*_*lug 27 wpf performance animation

我正在寻找有关WPF动画的最佳实践或指南.特别是有关性能考虑的信息

Pat*_*lug 39

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

有关优化WPF应用程序性能的MSDN部分提供了有关编写WPF应用程序时的一般注意事项的一些有用信息:

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

这里有一些我发现特别有用且与动画有关的部分:

  • CompositionTarget.Rendering事件导致WPF连续动画.如果您使用此活动,请抓住每次机会.

  • 使用"画笔"设置元素的"填充"或"笔触"时,最好设置"Brush.Opacity"值,而不是设置元素的"不透明度"属性.修改元素的Opacity属性可能会导致WPF创建临时曲面.

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

这是我通过反复试验所学到的:

  1. 比如说,你有几个带有效果的元素,比如应用了BlurEffect.这是方式更快的效果应用到这些元素,而不是元素本身的容器.虽然效果是硬件加速,但WPF似乎并不擅长处理一些带效果的小项目. - 如果你不想要相同的模糊半径并且不能将它们分组到应用了效果的容器中,那么将元素渲染到位图(在软件中)然后围绕位图设置动画(如果可能的话)实际上会更快.在动画上对对象产生效果(或不透明度)会迅速杀死性能.
  2. 设置画笔上的不透明度而不是元素(如上所述)在动画对象时会产生巨大的性能差异.
  3. 保持视觉数量下降.即使使用上述提示,也难以使大量粒子动画化.在这种情况下,您可能需要恢复为WriteableBitmap.

我还听说通过在容器中覆盖OnRender然后使用drawingContext渲染它们而不是直接将它们添加到可视树中来渲染许多小对象会更快.在实践中,这对我的场景没有任何影响(当渲染大约300个椭圆几何时),但在某些情况下它可能会有所帮助.这个理论听起来很扎实

最后,我发现使用WPF内置的动画类太麻烦了,并且使用动画库的弱者更加有趣和成功:Artefact Animator.说真的,试一试.(它也适用于Silverlight)它应该是动画(代码中)的样子.

不过,一切都不是彩虹和独角兽.我仍然发现在更高分辨率下运行全屏时无法创建真正流畅的动画.在我的问题中更多关于如何知道为什么动画口吃? - 我将不胜感激.

欢呼,祝你好运,如果你有一些很酷的东西展示,请告诉我:)