Delphi:如何诊断缓慢的用户界面?

时间:2010-04-09 19:55:07

标签: performance delphi user-interface vcl

我有一个表单,你可以假装它像Windows资源管理器一样:

  • 面板左侧
  • 分离器
  • 客户面板

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

左侧和客户区面板每个都有丰富的控件。

问题是使用分离器非常缓慢。我希望现代的2 GHz计算机可以像人类可以快速移动鼠标那样快速地重新显示表格。但事实并非如此,在完全重新调整表单之前需要大约200-300毫秒。

表单上有大约100个可视控件,没有代码或自定义控件。

我如何追踪谁是导致迟缓的原因?

4 个答案:

答案 0 :(得分:4)

我建议您暂停重新绘制2个面板,只要分割器正在移动,或者使用特定值(例如50px)重新绘制。

答案 1 :(得分:4)

使用分析器。 Eric Grange的Sampling Profiler很好。 AutomatedQA的AQtime非常出色。

这很可能是由于控件调整其布局和大小而重复调整大小和重新绘制。一般来说,大量嵌套或大量控制都会导致问题。您可以通过覆盖AlignControls来避免这种情况,并且每次分割器移动时只调整一次对齐,但这将涉及相当多的工作。

或者,TSplitter具有ResizeStyle属性,该属性控制控件是立即移动还是对表单进行异或,并且控件仅在结束时更新。视觉上并不好,但工作量却少得多。

答案 2 :(得分:1)

制作表单的测试版本,删除所有控件,只留下面板和分割器。看看性能是否仍然低迷。

在调整大小事件中放置一些非阻塞消息(到文件,控制台调试器,gexperts调试器)。你会得到一些,如你所料,还是几十个?

左侧面板和分割器应该对齐alLeft,另一个是alClient。

答案 3 :(得分:1)

这主要是由于重复那些许多控件的事件

您可以尝试在表单中禁用背景颜料(减少颜料数量):

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

...

procedure TfrmBaseMain.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result := 1;
end;