Почему listbox потребляет так много памяти, когда изображения извлекаются из изолированного хранилища, а не изображения, встроенного в сборку? - PullRequest
0 голосов
/ 10 января 2012

Я создал список в Windows Phone Mango.

Я буду использовать его для отображения многих фотографий в одном длинном списке.

В целях тестирования я использую только одну фотографию иповторяя его для каждого индекса.

При загрузке изображения из изолированного хранилища 100 изображений потребляют 170 МБ памяти.

Когда я вставляю то же изображение в сборку в качестве ресурса (т.е. / Images / image1.jpg) 10'000 изображений потребляют только 40 МБ.На самом деле он никогда не превышает 40 МБ, что бы здесь ни происходило (виртуализация пользовательского интерфейса?), Он работает хорошо.

Я должен использовать изолированное хранилище для своих изображений, так как обновления изображений периодически загружаются на телефон.Могу ли я заставить его работать так же, как встроенное изображение?

Может кто-нибудь объяснить мне;

  1. Когда я получаю изображение из изолированного хранилища, почему оно такЧем больше памяти, тем больше я загружаю, тем выше он получает?

  2. Когда я получаю его из папки с изображениями, когда он является частью сборки, как он может загружать десятки тысяч изображенийи память никогда не увеличивается, это виртуализация пользовательского интерфейса?

Спасибо за любую помощь заранее.

Вот мой код.(Разработка началась только 6 месяцев назад, если она выглядит несколько хитроумно!)

// ПОЛУЧИТЬ ИЗОБРАЖЕНИЕ ИЗ ИЗОЛИРОВАННОГО ХРАНИЛИЩА

IsolatedStorageFile insISF = IsolatedStorageFile.GetUserStoreForApplication();

        for (int i = 0; i < 100; i++)
        {
            byte[] byte1;

            using (IsolatedStorageFileStream isfs = insISF.OpenFile("\\Photos\\image1.jpg", FileMode.Open, FileAccess.Read))
            {
                byte1 = new byte[isfs.Length];
                isfs.Read(byte1, 0, byte1.Length);
                isfs.Close();
            }

            Image image = new Image();
            MemoryStream ms = new MemoryStream(byte1);
            BitmapImage bi = new BitmapImage();
            bi.SetSource(ms);
            image.Source = bi;
            listBox2.Items.Add(image);
    //NOTE I HAVE TRIED "ms.Dispose();" HERE BUT IT DOES NOT HELP.
        }

// END

// GET IMAGEОТ ПАПКИ ИЗОБРАЖЕНИЙ КАК ЧАСТЬ СБОРКИ

        for (int i = 0; i < 10000; i++)
        {
        BitmapImage bi = new BitmapImage(new Uri("/Images/image1.jpg", UriKind.Relative));
        Image image = new Image();
        image.Source = bi;            
        listBox2.Items.Add(image);
        }

// END

Ответы [ 3 ]

2 голосов
/ 10 января 2012

Когда вы загружаете изображение из Isolated Storage, вы загружаете его побайтово, т.е. все изображения загружены полностью.

Напротив, когда вы создаете BitmapImage, он использует опцию DelayCreation по умолчанию. Итак, приложение загружало изображения, которые теперь только на экране. См. CreateOption enum для более подробной информации.

Офф-декодирование изображений на манго

0 голосов
/ 10 января 2012

В вашем коде байтовый массив располагается сборщиком мусора, единственные объекты, которые должны быть явно удалены сборщиком мусора после выхода из области видимости, это те, которые могут быть включены в оператор using ...

Я никогда не пробовал, но я думаю, что если вы читаете изображения непосредственно из потока, а не читаете его из потока, записываете его в массив и перечитываете его из массива, и , включая поток в операторе using, память должна быть освобождена.

Надеюсь, что это поможет.

0 голосов
/ 10 января 2012

Может ли это быть объектами IsolatedStorageFileStream и MemoryStream ???

Попробуйте использовать GC для мониторинга использования памяти каждой итерации в цикле for.

Виртуализация в вашем списке должна работать одинаково в любом случае.

Кстати, вы должны также использовать конструкцию using в MemoryStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...