Я использую приложение Windows Phone 8.1 RT. Один из способов отобразить изображение после его чтения из файла — создать BitmapImage
и установить его в качестве источника для элемента управления XAML Image
.
Я использую следующий код, чтобы сделать то же самое. Изображение хранится в папке 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
(плюс любое увеличение служебной памяти), но профилирование памяти приложения говорит об обратном. Я вижу, что память стреляет до320 MB
, когда загружается изображение40 MB
.Если я использую
DecodePixelHeight
илиDecodePixelWidth
для экономии памяти, память все равно увеличивается до50-80MB
(больше, чем размер исходного изображения), в зависимости от значенияDecodePixelHeight
/DecodePixelWidth
.
Я ожидаю, что ОС будет разумно использовать память и использовать минимальный объем памяти при загрузке изображений. Я ожидал, что ОС будет использовать менее 40 MB
памяти, когда установлено DecodePixelWidth
, но был очень удивлен, увидев фактические результаты.
Может кто-нибудь объяснить, почему при загрузке изображений в память используется такой большой объем памяти? Это ожидаемое поведение? Что я могу сделать для экономии памяти, потому что, если дела пойдут так, я не могу загрузить два больших изображения в память одновременно, не получая OOM, даже с DecodePixelWidth
.
Скриншоты профилирования прилагаю.
- Без использования
DecodePixelWidth
размер изображения40 MB.
Первый пик245 MB
, второй пик327 MB
- Используется
DecodePixelWidth = 500
, размер изображения40 MB
. Первый пик —88 MB
, а устойчивый уровень —49 MB
.