Включение визуальных тем / визуальных стилей XP снижает производительность - PullRequest
2 голосов
/ 05 декабря 2009

Пытаясь модернизировать внешний вид старого приложения C ++ Builder / Delphi, я включил визуальные темы ( визуальные стили ) и был удивлен, насколько много добавлено тем, влияющих на производительность. Например, для нашей основной страницы настройки (диалоговое окно «Монстр из 200 элементов управления» с 11 вкладками, которое мы не хотим сейчас переделывать по причинам времени разработки и затрат на переподготовку):

  • Без включенных тем: ~ 0,1 с для построения формы и ее элементов управления (как измерено QueryPerformanceCounter), ~ 0,9 с от щелчка по элементу меню до отображаемой формы ( как измерено секундомером). Не очень заметно для конечного пользователя.
  • При включенных темах: ~ 0,6 с для создания формы и элементов управления, ~ 1,5 с от щелчка по элементу меню до отображаемой формы. Очень заметно для конечного пользователя.

Я получаю похожие результаты как на рабочем столе Windows XP, так и на виртуальной машине Windows 7.

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

Ответы [ 2 ]

3 голосов
/ 05 декабря 2009

Ничего себе. Я не уверен, что у меня когда-либо было 200 элементов управления в одной форме. Вот несколько предложений.

  • Это может быть особый случай, когда вы хотите создать диалоговое окно один раз при запуске приложения и отобразить его при необходимости вместо создания по требованию.

  • Я бы также посмотрел, что происходит в конструкторе или событии OnShow. Заполняете ли вы какие-либо списки, где BeginUpdate / EndUpdate будет преимуществом?

  • Есть ли у вас какой-либо код в событии OnResize или аналогичном, который запускается более одного раза, который может подождать, пока форма не будет создана, и будет запущен один раз?

  • Какие виды контроля вы используете? Если один тип контроля рисует особенно медленно, вы можете заменить его более быстрым. Однако это потребует некоторого тестирования.

1 голос
/ 09 декабря 2009

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

...