2011-12-15 4 views
1

Я хотел бы знать, существуют ли какие-либо конкретные стратегии обработки памяти, особенно в отношении кэширования изображений на Windows Phone. У меня очень графическое приложение Silverlight, которое нужно сохранить графикой, которую он извлекает из Интернета, и ей нужно свободно перемещаться, но потребность в памяти становится довольно огромной после использования приложения на пару минут.Управление памятью Windows Phone 7

Я попытался установить UriSource изображения на нуль, но мне нужно сохранить фон изображения, когда я вернусь на страницу. Я в недоумении, потому что в Интернете мало информации. Встроенное профилирование показало мне «Доминанта текстурной памяти» и попросило меня проанализировать память кучи, чтобы решить проблему, но я до сих пор не знаю об этом.

Любые указатели для продвижения вперед?

+0

Показать код. –

+0

Это все приложение - ничего особенного. Меня просто интересовало, есть ли у кого-то стратегия для работы с большим объемом памяти –

+0

Для совершенно произвольных проблем? Мое решение обычно заключается в том, чтобы исправить кровавые проблемы в коде. –

ответ

1

Мой ответ будет общим - аналогично вашему вопросу. Я предполагаю, что вы точно знаете, что проблема в образах. (Поскольку простой ListBox с несколькими сотнями текстовых элементов может стоить вам много МБ.)

При поиске в Интернете вы найдете множество ссылок, таких как this one. Но общий анализ легко сделать.

Возьмите изображение размера экрана WP7, то есть 480x800. 32-битное растровое изображение (я полагаю, это то, что использует WP7 при открытии изображения) занимает примерно 1,5 МБ (простое умножение).

Тот же файл jpg может иметь размер меньше 10x (для сжатия высокого качества) или даже меньше.

Теперь, что делается за кулисами, когда вы используете конструкцию

<image source="http://..."/>. 

(В случае отсутствия какой-либо информации от вас, это то, что я полагаю, вы используете.)

WP7 загружает изображение и добавляет его в кеш. Кэш, по-видимому, отслеживает использование Ури, указывающего на изображение.

Как показано ниже, изображение открывается, то есть преобразуется в растровое изображение собственного размера изображения. В этом процессе изображение получает уменьшенную дискретизацию, если оно превысит максимум. Размер текстуры WP7.

Вы можете настроить размер растрового изображения, как описано here. Если вы заботитесь о качестве, то вам следует использовать коэффициент масштабирования 2, 4 или 8. В случае jpeg эти факторы представляют собой самый быстрый вариант. (Ну, я понятия не имею, знаете ли вы разрешение изображения до того, как изображение загрузится в элемент управления Image. Это не так сложно получить эту информацию из файла jpg, но прямо сейчас я понятия не имею, как это можно легко сделать на WP7.)

Растровое изображение освобождается, если (моя спекуляция), если источник элемента управления имеет значение null. Загруженное изображение очищается из кеша, когда Uri установлен в null. (Это сообщается в Интернете много раз.)

Если вы берете всю эту информацию, должно быть возможно (вид) контролировать использование кеша изображения. Вы можете грубо оценить размер изображения и можете решить, какие изображения остаются в кеше. Возможно, потребуются некоторые трюки, такие как хранение объектов Uri в ваших собственных структурах и их освобождение по мере необходимости. Я не говорю, что это легко сделать, но это, безусловно, возможно.

+0

Kinda имеет смысл, я просто помещал его туда, чтобы увидеть, есть ли общая стратегия, о которой я не знал. Благодарю. –

+0

Если я очистил изображения между движениями страниц, как бы перезагрузить их при событии Back Key? –

+0

Управление ими будет перезагружать их. –