Windows Phone 7 управление памятью - PullRequest
1 голос
/ 15 декабря 2011

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

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

Есть ли какие-нибудь указатели для продвижения вперед?

1 Ответ

1 голос
/ 15 декабря 2011

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

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

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

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

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

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

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

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

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

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

Растровое изображение освобождается, если (мое предположение), если источник элемента управления установлен на ноль. Загруженный образ удаляется из кеша, когда Uri имеет значение NULL. (Об этом много раз сообщают в Интернете.)

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

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