2009-11-30 39 views
1

我试图创建一个PNG顺序器类,这将允许我通过动画更改ImageBrush的ImageSource属性。WPF - RenderTargetBitmap比改变图像源更好吗?

问题是我有大约150个PNG文件要加载,而且当我在屏幕上显示一些动画时,它确实会影响性能。

我已经读了一些关于RenderTargetBitmap和WriteableBitmap,但我不知道如何得到一个很大的性能提升,因为我真的需要它。

在某些情况下,我可能会下降到6fps,这显然是不可接受的。

在我的Sequencer类中,我只更新了一个CurrentFrame DP,它改变了ImageBrush的ImageSource属性。

有关如何提高性能的任何想法吗?

+0

也许我应该使用CompositionTarget.Rendering? – Mark 2009-11-30 09:41:05

回答

3

第1步是提前加载所有图像(最好在后台线程)。您应该使用CacheOption = BitmapCacheOption.OnLoad对您的BitmapImage对象进行初始化。您可能已经在执行此操作,或者它可能不是问题(默认情况下为图像缓存)。

但是,当您更改图像源时,渲染线程也需要做一些工作。如果不是以源图像大小显示,那可能是一个问题,因为默认情况下,Image控件使用高质量的Fant缩放算法。在这种情况下,您可以通过致电RenderOptions.SetBitmapScalingMode(uiImage, BitmapScalingMode.LowQuality);Image上获得性能提升。低质量缩放的速度要快几个数量级。然而,即便如此,仍然有一些工作涉及。如果您想要获得最快的动画,您可以为每一帧创建一个Image控件,然后将它们全部重叠在同一个位置,并更改哪一个出现在顶部。你仍然会在渲染线程中加载所有图像,但实际的动画应该很快。

+0

哇,在这个时候,它看起来像缩放模式选项已经很好地工作!非常感谢。还有一件事,当我运行WPF性能分析器时,当第一次加载我的映像时,我可以看到我的视频卡内存跳过了几百MB,这是否正常?另外,它不会退缩,如果它? – Mark 2009-12-02 21:12:08

+0

如果你将每一帧加载到一个单独的图像中并改变z顺序,我会期待这种行为,因为所有图像都提前显示到视频卡上(这就是为什么它如此之快)。 如果你仍然只是改变了BitmapSource,我不知道在这种情况下应该做什么。 内存跳转是否与所有动画中的总帧数相关? – RandomEngy 2009-12-03 01:52:46

+0

它很难说,但它绝对相关,因为直到我运行我的动画时,视频内存才会发生任何事情。我还应该提到,我正在使用我的动画作为3D几何体上的材质,因此可能会将其加载到内存中,因为它的所有硬件都已渲染? – Mark 2009-12-03 02:54:20