我正在使用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