Включение визуальных тем / визуальных стилей XP снижает производительность

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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам