2010-09-09 45 views
0

這裏的問題:圖形性能優化問題

我需要滾動先前已呈現波浪形態的巨大圖像, WPF沒有讓我那巨大的(80000 * 256)圖片分配到圖像, 它適用於較小的(30000 * 256)圖像,但它很慢的動畫,它是不切實際的。

所以我決定使用一個WriteableBitmap,我分配給我的Image.Source, ,然後我只需要更新說1920 * 256(或只有屏幕的寬度)。 現在效果好多了,但經過一些分析後,似乎 實際的複製過程需要相當長的一段時間,而且不是每次都是60 fps。

我已經通過鎖定和使用指針來寫入位圖。

我的問題是:

你知道的任何(快)的方式來更新位圖?

這些像素已經在巨大的位圖內存中,直接從這裏讀取似乎是一個明智的想法;那麼,擺脫我的Image.Source和我的BitmapData之間的WriteableBitmap。

感謝您的幫助:)

回答

0

我已經修復它,使用GC.Collect;仍然不能相信它解決了這個問題。 不知道這是一個很好的做法,但它的工作原理...

這給了我最近幾天的頭痛和惡夢,但現在大多數是排序。 我會對此有趣的結論是,GCCollectionMode.Optimized, 認爲它從來沒有收集內存的時間,它上升到使用2Gb, 不穩定整個系統(Windows),直到它凍結鼠標,大聲笑...

感謝您的幫助:-)

1

您可以嘗試使用InteropBitmap來更新像素,因爲WriteableBitmap在CPU綁定內部操作時速度較慢。我在這裏有一些使用它的代碼:http://silverlightviewport.codeplex.com/SourceControl/changeset/view/57274#1534506

它是Bgra32的硬編碼,它是3.5 SP1中InteropBitmap支持的唯一色彩空間。在4.0中它應該支持24位色彩空間。

+0

我目前正在嘗試根據某人在微軟的Imaging.CreateBitmapFromMemorySection,只在需要時直接複製到GPU。這聽起來不錯,但實際上它比我以前的方法需要更多的CPU:更新WriteableBitmap。所以我回到了起點,試着從CodePlex中嘗試WriteableBitmapEx來看看它的功能。事實上,我想要的(我認爲應該適合這個問題)是一個WriteableBitmap,我可以在其中更改其BackBuffer。 – Aybe 2010-09-12 20:11:21

+0

經過一些測試後,WriteableBitmap贏得比賽!使用Imaging.CreateBitmapFromMemorySection和CopyMemory的方法是當它工作時,非常流暢,但CPU上升40%...應用程序不吃更多的CPU,但「系統」過程!我回到了我的第一個解決方案的起點,感覺還有更多可以完成的事情......我聽說表單性能好得多,但我在WPF上... – Aybe 2010-09-12 21:38:11

+0

我忘了回答你,你的InteropBitmap方法正是我用CreateFileMapping等做的......這是最好的,直到我從800 * 256說,這是非常好的1920 * 256其中CPU上升40%。此外,我不知道這是否阻止更多,但;當我從一個更大的位圖複製時,我需要多個CopyMemory因爲不同的步幅;所以有儘可能多的CopyMemory與行數;但是在分析時,不知道是什麼導致了這一點......我需要進一步調查! – Aybe 2010-09-12 21:46:49