Как сохранить использование RAM ниже 90 МБ? (Специально масштабирование изображений)

StackOverflow https://stackoverflow.com/questions/3873819

Вопрос

Я разрабатываю приложение для WP7 (VS2010 Express для Windows Phone RTM и WP эмулятора), но теперь я сталкиваюсь с большой проблемой, связанной с использованием памяти. Сам приложение имеет вроде 12 просмотров, а некоторые из них повторно используются с разными данными. Это новости, поэтому представления в основном списки (миниатюра изображения, StackPanels и TextBlocks).

Первый вид имеет список с 30 элементами. Это занимает около 20 МБ ОЗУ, но, поскольку я навиваюсь между взглядами, то текущее и пиковое использование ОЗУ начинает расти. Ну, использование пика Это около 55 МБ, которое я думаю, в порядке, но в приложении есть раздел галереи, в котором после выбора эскизы навигации на другой вид, который отображает загруженное изображение (JPEG, 1131PX × 1647PX, ~ 486KB), но изначально подходит для экран. До здесь все хорошо, но для масштабирования я использую Поведение Multitouch Lourent Bugnion а также проблема в То, что когда я увеличиваю изображение, использование памяти приближается к 90 МБ (например, в последний раз 87 МБ, я проверен с максимальным размером масштаба в 2.5).

Кроме того, после того, как я перемещаюсь в представлениях, текущее использование ОЗУ может передаваться и остаться на 35 МБ, что я верю, связан с устройством, кэширующим некоторые вещи.

Итак, как говорит название, как я могу избежать такого огромного использования ОЗУ?

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

Это было полезно?

Решение 2

Ну, может быть, я должен смотреть в Deepzoom (но когда я впервые прочитал об этом, я думал, что это для использования его с тем же изображением в разных размерах, таких как Google Maps на спутниковом режиме), но вчера я решил, используя веб-сайт, используя WebBrowser внутри моего Взгляд, так что если раньше у меня будет:

<Image x:Name="imgPlaceHolder" delay:LowProfileImageLoader.UriSource="{Binding Path=ActualImageSource}" MaxHeight="800"
               MaxWidth="480" >
            <interac:Interaction.Behaviors >
                <tbeh:MultiTouchBehavior x:Name="ImageMTB" IsScaleEnabled="True"
                                                 MinimumScale="0.4"
                                                 MaximumScale="2.5"
                                                 IsRotateEnabled="False"
                                                 IsDebugModeActive="False"
                                                 IsTranslateXEnabled="True"
                                                 IsTranslateYEnabled="True"

                                     >

                </tbeh:MultiTouchBehavior>
            </interac:Interaction.Behaviors>
        </Image>

Я изменил это:

<phone:WebBrowser Source="{Binding Path=ActualImageSource}" x:Name="wbbigimage"  />

Он использует меньше памяти и заботится о увеличении без проблем.

Я немного подожду для кого-то с лучшим решением, прежде чем проверять этот.

Другие советы

Вообще говоря, вы хотите сохранить изображения как можно меньше (в глубине размеров и цветов, не обязательно размер файла). Чтобы отобразить изображение, устройство должно декомпрессировать его к фактическому растрому, так что в этом случае вы смотрите на изображение 1131x1647pixel, скажем, на 16bpp, означает, что у вас есть 3,7 МБ, не являющийся следом памяти для изображения, а не 3,7 МБ. 486k размер файла.

В зависимости от вашего масштабирования / вращения, может быть второй буфер копирования, поэтому вы можете эффективно удвоить это. Это не займет много времени, чтобы добраться до 90 МБ. Я, безусловно, попробую либо загрузить меньшие файлы изображений, либо попробуйте изменять изменение их локально, а затем с помощью измененного изображения.

Пару вещей, чтобы отметить. Во-первых, убедитесь, что вы устанавливаете любые списки или изображения, которые вы используете на страницах, умоляющих методом OnnavigatedFrom. Путь WP7 сделки с изображениями - «интересна». Одно из вещей, которые я обнаружил, чтобы помочь, - это нулевое значение любого панорамы, когда страница не отображается.

Что касается вашей конкретной проблемы, вы рассмотрели, используя MultiScaleImage (глубокий зум), чтобы сократить память?

http://msdn.microsoft.com/en-us/library/system.windows.controls.multiscaleimage(vs.95).aspx.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top