2013-04-25 38 views
2

我的應用程序從here下載6張圖像,然後循環播放。我以GIF格式下載圖像,使用.NET Image Tools將它們轉換爲PNG格式,並將每個圖像作爲BitmapImage存儲在List<BitmapImage>中。如何減少多個圖像的內存使用量?

我使用所下載的圖像添加到圖像的列表的代碼是:

List<BitmapImage> images = new List<BitmapImage>(); 
//WebClient used for download 

... 

    GifDecoder decoder = new GifDecoder(); 
    ExtendedImage eim = new ExtendedImage(); 
    decoder.Decode(eim, DOWNLOADEDIMAGESTREAM); 

    using (MemoryStream ms = new MemoryStream()) 
     { 
      WriteableBitmap wbmp = eim.ToBitmap(); 
      PngEncoder encoder = new PngEncoder(); 
      encoder.Encode(eim, ms); 
      ms.Flush(); 
      ms.Position = 0; 

      BitmapImage bmp = new BitmapImage(); 
      bmp.SetSource(ms); 
      ms.Close(); 
      images.Add(bmp); 
     } 
    e.Result.Dispose(); 

每個轉換後的圖像是大約10〜20 KB,尺寸爲600像素X 550px。 (原始GIF的大小約爲2/3。)

下載圖像後,我的內存使用量約爲80 MB。在不下載圖像的情況下,內存使用量大約爲50 MB。 30 MB似乎有很多內存可用於存儲六張圖像,總大小約爲90 KB。此外,它會將幀速率降低到5或6,這會在用戶放大或移動圖像時出現性能問題。 (我不是當前顯示的圖像,只需將它們存儲在內存中。我使用縮放和移動是一個測試圖像,並在我的記憶測量被包括在內。)

我也想增加下載的圖像的大小,但他們已經使用的內存量使得這是不合理的。

回答

1

忘記壓縮圖像有多大。一旦你從它創建一個位圖,它將是600x550x(3或4,可能每個像素的字節數)。所以你看每個圖像超過1MB。在內存中,它們存儲爲未壓縮的位圖。這不佔30MB,但如果你真的關心內存使用的細節,可以使用SciTech的.NET Memory Profiler之類的東西(試用版在這裏:http://memprofiler.com/),你可以確定內存在哪裏佔用。

我與SciTech不存在任何關聯。在過去的十年中,我曾多次使用過輪廓儀(包括幾年的時間,我經常在一個項目中使用它)。我發現它是確定.NET如何使用內存的更準確的方法之一。否則,我發現很多猜測常常是錯誤的假設。

+0

感謝您的鏈接。我會看看它是否可以提供任何幫助。 – msbg 2013-04-25 18:20:23

+0

它支持Windows Phone嗎?我沒有看到WP應用程序的任何選項,並且在他們的論壇上有一篇文章說他們不支持它。 – msbg 2013-04-25 18:37:34

1

從我的觀點來看,我們可以在WP7上解決問題,因爲手機屏幕很小,我們無法按照需要顯示圖像的全部內容。我們可以下載,而不是顯示原始文件,我們應該減少手機屏幕的寬度和高度。只是我的兩分錢。

+0

我並沒有實際顯示我下載的任何圖像。只需將它們存儲爲BitmapImages。 – msbg 2013-04-25 18:23:50

+0

感謝您的信息。因爲您已經發布了「另外,它會將幀速率降低到5或6,這會導致用戶放大或移動圖像時出現性能問題。」所以這就是我遵循這種方式回答的原因。對不起,誤會了。 – 2013-04-25 18:26:40

+0

+1提供良好的提示和技巧。 – 2013-04-25 18:29:52