2009-11-23 212 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? - 我將不勝感激任何輸入。

歡呼,祝你好運,如果你有什麼酷炫的東西,讓我知道:)