代码之家  ›  专栏  ›  技术社区  ›  Patrick Klug

WPF动画最佳实践[关闭]

  •  26
  • Patrick Klug  · 技术社区  · 15 年前

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

    1 回复  |  直到 12 年前
        1
  •  36
  •   Community Dunja Lalic    7 年前

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

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

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

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

    • compositionTarget.rendering事件导致WPF连续动画。如果您使用此事件,请在每个机会将其分离。

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

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

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

    1. 比如说,你有几个应用了blurefect效果的元素。它是 方式 更快地将效果应用于这些元素的容器,而不是元素本身。尽管效果是硬件加速的,但是WPF似乎不擅长处理一些有效果的小项目。-如果不希望使用相同的模糊半径,并且无法在应用效果的容器中对其进行分组,则将元素呈现为位图(在软件中)并在周围设置位图动画(如果可能的话)实际上会更快。对对象产生效果(或不透明度)会在动画制作时快速降低性能。
    2. 设置画笔上的不透明度而不是元素(如上所述)会在设置对象动画时产生巨大的性能差异。
    3. 减少视觉效果的数量。设置大量粒子的动画是困难的,即使有上面的提示。在这种情况下,您可能需要恢复为可写位图。

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

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

    不过,并不是所有的彩虹和独角兽。我仍然发现在高分辨率全屏运行时,无法创建真正流畅的动画。我想问的更多 How to know why an animation stutters? -我很感激你对我的意见。

    干杯,祝你好运,如果你有什么好东西要展示,请告诉我:)