我正在使用Windows Phone 8.1 RT應用程序。從文件中讀取圖像後顯示圖像的一種方法是創建一個BitmapImage
並將其設置爲XAML控件的源。加載BitmapImage在WP 8.1中佔用大量內存RT
我正在使用下面的代碼來做同樣的事情。圖像存儲在LocalFolder
:
private async void LoadImage()
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync("imageFile.jpg");
BitmapImage bitmapImage = new BitmapImage();
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
{
bitmapImage.DecodePixelWidth = 500;
await bitmapImage.SetSourceAsync(stream);
}
imageHolder.Source = bitmapImage;
}
由於我加載圖像的一小部分,我用的是DecodePixelWidth
以節約內存。但是,我的觀察結果並不符合預期。
觀察:
如果我一個
40 MB
圖像加載到內存中,由應圍繞40 MB
(加上任何開銷內存增加)增加對內存的佔用,但應用程序的內存分析說,否則。我看到當加載一張40 MB
圖像時,內存拍到320 MB
。如果我使用
DecodePixelHeight
或DecodePixelWidth
以節省存儲器,所述存儲器仍然拍攝高達50-80MB
(比原始圖像的尺寸大),這取決於DecodePixelHeight
/DecodePixelWidth
的值。
我希望操作系統明智地使用內存,並在加載圖像時使用最少量的內存。我預計在設置DecodePixelWidth
時,操作系統的內存使用量低於40 MB
,但看到實際結果時非常驚訝。
有人可以解釋爲什麼在將圖像加載到內存時使用如此大量的內存?這是預期的行爲?我可以做些什麼來節省內存,因爲如果事情是這樣,即使使用DecodePixelWidth
,我也無法同時將兩個大圖像加載到內存中,而無法獲得OOM。
連接了剖析屏幕截圖。
- 不使用
DecodePixelWidth
,圖像尺寸40 MB.
第一峯是245 MB
,第二個峯是327 MB
我不想顯示縮略圖;我想加載一個高分辨率的圖像並顯示它。 – Flipper
傳遞給該方法的三個值是ThumbnailMode,Requestedsize和ThumbnailOption。我把所需的尺寸設置爲90,因爲我不需要顯示非常大的圖像,只是非常多。但仍然在這個尺寸,他們看起來非常好。我敢打賭,如果你看看這些價值觀,你會得到你所需要的。使用我的應用程序,我可以加載數百個高分辨率圖像,而不會對內存造成任何問題。 – StijnvanGaal