Delphi: Как диагностировать вялый интерфейс? - PullRequest
2 голосов
/ 09 апреля 2010

У меня есть форма, которую вы можете сделать вид, что она выглядит как Проводник Windows:

  • панель слева
  • сплиттер
  • панель клиента

    +------------+#+-----------------------+
    |            |#|                       |
    |            |#|                       |
    |            |#|                       |
    |            |#|                       |
    |  Left      |#|      Client           |
    |            |#|                       |
    |            |#|                       |
    |            |#|                       |
    |            |#|                       |
    |            |#|                       |
    +------------+#+-----------------------+
                  ^
                  |
                  +----splitter
    

Левая панель и панель клиентской области богаты элементами управления.

Проблема в том, что использование сплиттера очень вялое. Я ожидаю, что современный компьютер с частотой 2 ГГц может отображать форму так же быстро, как человек может двигать мышью. Но это определенно не тот случай, и требуется около 200-300 мс, прежде чем форма будет полностью перенастроена.

Форма содержит около 100 визуальных элементов управления, без кода или пользовательских элементов управления.

Как мне узнать, кто является причиной вялости?

Ответы [ 4 ]

4 голосов
/ 10 апреля 2010

Используйте профилировщик. Эрик Грандж * Sampling Profiler - это хорошо. AutomatedQA AQtime отлично.

Это более чем вероятно из-за повторного изменения размера и перерисовки, поскольку элементы управления корректируют свои макеты и размеры. Много вложенности или просто много элементов управления в целом могут вызвать проблемы. Вы можете избежать этого, переопределив AlignControls и отрегулировав выравнивание только один раз при каждом перемещении сплиттера, но это потребует немало работы.

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

4 голосов
/ 09 апреля 2010

Я бы посоветовал вам приостановить перерисовку 2 панелей, пока сплиттер движется, или использовать определенное значение, например 50px, где вы перерисовываете снова.

1 голос
/ 12 апреля 2010

Это происходит в основном из-за событий перерисовки этих многих элементов управления

Вы можете попробовать отключить фоновую краску в вашей форме (уменьшает количество красок):

procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

...

procedure TfrmBaseMain.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result := 1;
end;
1 голос
/ 10 апреля 2010

Сделайте тестовую версию своей формы, удалите все элементы управления и оставьте себя с помощью только панелей и сплиттера.Посмотрите, если производительность по-прежнему вялый.

Поместите некоторые неблокирующие сообщения (в файл, консольный отладчик, gexperts отладчик) в события изменения размера.Вы получаете всего несколько, как и следовало ожидать, или десятки?

Левая панель и разветвитель должны быть выровнены по высоте, а другая по alClient.

...