2009-05-10 1 views
3

Я испытываю огромную утечку памяти в своем проекте WPF и пытаюсь выяснить, что я могу сделать, чтобы свести к минимуму ее. Для доступа к ресурсам я использую StaticResource в 100% случаев. Должен ли я использовать DynamicResource, где я могу? Есть ли преимущества в управлении памятью между StaticResource и DynamicResource?WPF - динамические и статические ресурсы

FYI: У меня есть список, показывающий данные через DataTemplate. По мере того как пользователь прокручивает вверх/вниз, память увеличивается быстро, достигая 1 ГБ всего за пару минут прокрутки вверх/вниз.

ответ

3

Это вряд ли будет веществом StaticResource/DynamicResource. Статические и динамические см для поиска стратегии, а не стратегии удержания:

  • StaticResource означает «смотреть на ресурс один раз, а затем продолжать использовать то же значение.»

  • DynamicResource означает «искать источник каждый раз, когда это необходимо, в случае значение изменилось».

Что вы делаете поэтому звучит правильно: использовать StaticResource для неизменных ресурсов, таких как DataTemplates (и резервного DynamicResource для ресурсов, которые могут изменяться, например, системы щеток, которые могут измениться, если пользователь изменяет цветовую схему системы). Выделение DataTemplate с помощью ссылки StaticResource будет стоить не больше памяти, чем выделение его с помощью ссылки DynamicResource, а долгосрочный будет дешевле, потому что WPF не должен продолжать возвращаться и переоценивать ссылку.

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

0

Насколько я знаю, операционная система клиента очень важна.

WPF предназначен для работы в системах Vista и более поздних версий (Windows 7). У вас могут быть проблемы с производительностью с пользователями xp.

+0

WPF был разработан для Longhorn, а не для Vista. WPF также предшествует Windows Vista, поскольку он официально вышел с Visual Studio 2005, который вышел за год до Windows Vista. WPF основан на DirectX 9 (он по-прежнему даже в Windows 10 вам нужно перепрыгнуть через обручи, чтобы взаимодействовать с DirectX 10 и 11, а DX12 - из-за принципиально другого дизайна). – Dai