2017-04-27 98 views
2

在這裏處理的情況:具有非常低的動畫幀速率

我有一個系列的主要成分列表框很多意見。列表框,其中一些內含大量數據,一些非常少。 目前,我有一個附加行爲,基本上只是檢測何時將新內容加載到容器中以查看這些視圖(a ContentPresenter)並觸發一個簡單的XAML故事板,該容器將容器向左或向右偏移200px ,並且將不透明度降低到0%(在0ms),然後超過100ms,將不透明度恢復到100%,並將偏移量減小到0px,從而產生「滑入視圖」效果。現在

,這個問題:

這個動畫的幀率變化從平穩過渡到緊張的可怕的任何地方,以1幀,直到完成徹底的只是落後。 這幾乎肯定是由於它必須加載新視圖,渲染所有內容,甚至更進一步;在它們中加載數據的列表需要更多的渲染時間,然而在發生所有這些情況時,它試圖對其位置變化進行動畫處理,這似乎嚴重影響了動畫的性能。

它讓我震驚,由於在屏幕上移動一些像素簡單的東西是如此的圖形密集型爲WPF處理

這裏是動畫本身的粗表示: enter image description here

我的問題:

是否有任何一種基本的最佳做法來處理WPF中的密集動畫以改善其性能或任何ki對於那些加起來可以提升性能的東西發生微小變化? 或者是WPF在動畫製作中非常糟糕,我們只需要處理它。

+1

你是否在'ListView's中啓用了'Virtualization''?如果不想查看'VirtualizingStackPanel'。 – XAMlMAX

+0

是的,他們都有,所以我的猜測是某些列表框項目的數據模型有時足夠複雜,即使只有幾個顯示足以減慢速度 – Logan

+0

確保虛擬化在您的「ListView」上工作,我以前遇到過問題。你使用'ItemsSource'的普通Binding還是使用'CollectionViewSource'?你是否也可以發佈一個包含虛擬化的ListView的'XAML'? – XAMlMAX

回答

0

我認爲你的問題是,你試圖在同一時間或同一線程做所有事情。只是嘗試在分割任務中做到異步。有很多不同的方法。另一種方法是用信號量來處理工作,這應該會提高你的性能。

+1

你可能是對的 - 異步性是我們需要更多關注的東西。 – Logan

0

我想出了一個解決方案,在我的情況下,它一直解決抖動問題。這當然值得嘗試。策略是在整個動畫中將不會更改的任何元素插入到本地參考框架(如網格或畫布)中,使該網格或畫布存儲其內容的緩存版本,然後將動畫應用到網格或畫布,而不是內部元素。它是如此簡單:

<Canvas ...Your canvas properties...> 
    <Canvas.CacheMode> 
     <BitmapCache /> 
    </Canvas.CacheMode> 
    ...Your UI elements... 
</Canvas> 

,或者一格:

<Grid ...Your grid properties...> 
    <Grid.CacheMode> 
     <BitmapCache /> 
    </Grid.CacheMode> 
    ...Your UI elements... 
</Grid> 

你要簡單地確保您沒有更新畫布裏的任何東西(或網格),因爲這將撤消緩存的版本,並且您會發現自己有一個類似的問題,WPF將在每個幀上重新生成其渲染。

通過內容的緩存版本,WPF將在屏幕上移動的內容不是動態更新的元素,它只是該元素最後一次呈現的位圖,並且只有在更改時WPF纔會更新該位圖應用於元素。

如果這樣不能解決您的問題,則意味着性能受到本地元素生成之外發生的事件的阻礙。這意味着您需要查看整體應用程序,或者降低應用程序的整個幀速率。但是,實際上,在我爲我的WPF動畫找到的抖動和抖動動作的所有情況下,BitmapCache解決方案似乎一直在運行。只要小心,不要將動畫應用到要緩存的元素內的對象。