2009-08-28 93 views
3

當前,我正在使用System.Windows.Media.DrawingGroup在Children-DrawingCollection屬性中存儲一些平鋪圖像(ImageDrawing)。 現在的問題是,如果您在Image控件中顯示整個DrawingGroup,則此方法會變得非常慢,因爲我的DrawingGroup可能包含數百甚至數千的小圖像,它可能會影響性能。將WPF DrawingGroup渲染爲單個ImageSource

所以我的第一個想法是以某種方式渲染DrawingGroup中所有小圖像的單個圖像,然後只顯示該圖像,這會更快。但正如你可能已經想通了,我還沒有找到任何解決方案,所以簡單地將幾個圖像與WPF成像。

如果有人能夠幫助解決這個問題,或者告訴我如何使用DrawingGroup提高性能,甚至使用其他方法,那真的很棒。最後還有一件事,目前我使用RenderTargetBitmap來從DrawingGroup生成一個BitmapSource,這種方法並不是很快,但它使滾動和在Image控件上的工作至少更平滑一些。

回答

1

我正在處理與平鋪圖像有關的問題,增加了複雜性,不得不顯示覆蓋在其他圖像上的一些圖像。

我還沒有遇到任何性能問題(並且可能不會出現,因爲我的圖像相對較小且數量相對較少,最大大約爲100),但我在代碼示例中遇到了Freeze方法DrawingImage類。對此的評論是「凍結DrawingImage以獲得性能優勢」。

Freeze方法也適用於DrawingGroup類。也許試試看吧?

2

我不知道這適用於您的問題,但我會在這裏發佈也無妨,因爲它可能會幫助別人:

如果不是所有的繪圖組中的圖像的將是在可見同時,您可以將ClipGeometry屬性設置爲您希望繪製的任何內容。這有效地告訴WPF幾何外部的部分不需要,並且在渲染過程中將被跳過。

,你可以嘗試使用一些其他的東西是:

  • Freeze的drawinggroup把它應用到你的圖像源之前。至少它不會傷害(除非你真的需要修改實例,但要記住,你總是可以創建一個新的而不是修改舊的)
  • 嘗試不同的方法來顯示你的繪圖組。例如,作爲DrawingVisual(其被認爲是輕重量)或作爲DrawingBrush來繪製例如一個矩形。
  • 將小圖像組合成更小的組,然後將其組合成更大的組。不知道這是否會改善或損害性能,但可能值得嘗試。