wp7 - TextBlock с большим количеством текста - огромное использование памяти - как этого избежать? - PullRequest
3 голосов
/ 31 января 2011

У меня проблема с приложением, и я не знаю, нормально это или нет.В моем приложении есть текстовый блок, который должен отображать большой объем текста (2000-4000 символов).В любом случае есть ограничение в 2048 пикселей. Я думаю, что мой текст обрезан, это не проблема, я использую это: http://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx.

Проблема в том, что чем длиннее текст, тем больше памятипотребляет.Без очень длинного текста взлома по ссылке выше, текстовый блок занимает около 10 МБ памяти!Если я использую ScrollableTextBlock по ссылке выше, объем памяти идет еще дальше и может достигать 30-40 мб. Ограничений нет.Таким образом, кажется, что использование памяти связано с областью, которая рисуется ...

Есть ли способ уменьшить использование памяти для длинных текстов?Имеет ли BitmapCach какое-либо отношение к этой проблеме и можно ли ее отключить?Вы можете легко воспроизвести эту проблему, просто добавив текстовый блок с очень длинным текстом, и вы можете проверить использование памяти с помощью этого кода, вы увидите, что при использовании только одного текстового блока с длинным текстом пиковая память увеличивается на 10 МБ или более:

        long deviceTotalMemory = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory");
        long applicationCurrentMemoryUsage = (long)DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage");
        long applicationPeakMemoryUsage = (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage");

        Debug.WriteLine("### deviceTotalMemory             : " + deviceTotalMemory);
        Debug.WriteLine("### applicationCurrentMemoryUsage : " + applicationCurrentMemoryUsage);
        Debug.WriteLine("### applicationPeakMemoryUsage    : " + applicationPeakMemoryUsage);

Ответы [ 3 ]

3 голосов
/ 31 января 2011

Я сталкивался с подобными проблемами при создании Overflow7

Проблемы, с которыми я столкнулся, были связаны с тем, что если вы используете StackPanel внутри ScrollViewer, то ScrollViewer настаивает на том, чтобы всеStackPanel визуализируется, а не только видимая часть.

Я прочитал, и было 2 общих решения:

  • использовать методы виртуализации пользовательского интерфейса - например, VirtualizingStackPanel
  • useметоды виртуализации данных - например, создание собственного пейджинга

Чтобы обойти это в Overflow7, я использовал ListBoxes вместо комбо ScrollViewer / StackPanel.Внутренняя часть ListBox использует VirtualizingStackPanel - и этот VirtualizingStackPanel отображает только то, что на экране, а не всю прокручиваемую клиентскую область.

Это было немного "хакерским", но сработало хорошо.Если у вас есть время, то я считаю, что лучшим решением было бы улучшить реализацию ScrollableTextBlock, чтобы он использовал VirtualizingStackPanel - есть хорошие сообщения о том, как использовать это на (например) WPF VirtualizingStackPanel для повышения производительности

0 голосов
/ 27 августа 2013

Я знаю, что это старый вопрос, однако я хотел добавить еще одно решение.

http://blogs.msdn.com/b/stankovski/archive/2013/08/27/yet-another-scrollable-textblock-for-windows-phone.aspx

Чтобы выполнить мою задачу, я инкапсулировал логику «расщепления» в отдельный класс, который создает выходные данные в виде списка строк.Затем вы можете связать этот список с вашим любимым элементом управления ListBox и вуаля, у вас есть огромный текстовый блок.Логика разделения оптимизирована для повышения производительности, поэтому вы получите намного лучшее время обработки, чем ScrollableTextBlock от Alex.Кроме того, поскольку вы можете привязать список к любому элементу управления ListBox, поддерживающему виртуализацию, у вас будет гораздо более консервативный объем памяти.

0 голосов
/ 31 января 2011

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

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

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