2017-04-27 295 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解决方案似乎一直在运行。只要小心,不要将动画应用到要缓存的元素内的对象。