2009-11-30 41 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