【问题标题】:Delphi: How to diagnose sluggish UI?Delphi:如何诊断缓慢的 UI?
【发布时间】:2011-02-06 07:39:13
【问题描述】:

我有一个表单,你可以假装它的布局类似于 Windows 资源管理器:

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

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

左侧面板和客户区面板都包含丰富的控件。

问题是使用拆分器非常缓慢。我希望现代 2 GHz 计算机可以像人类推动鼠标一样快地重新显示表格。但绝对不是这样,在表格完全重新调整之前大约需要 200-300 毫秒。

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

我该如何去追查谁是导致呆滞的原因?

【问题讨论】:

    标签: performance delphi user-interface vcl


    【解决方案1】:

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

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

    另外,TSplitter 有一个ResizeStyle 属性,该属性控制控件是立即移动还是在表单上对一行进行异或运算,并且控件仅在最后更新。视觉上没有那么好,但工作量少了很多。

    【讨论】:

    • 德尔福采样分析器是一个优秀的建议。它确实是一个很棒的工具。
    【解决方案2】:

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

    【讨论】:

    • 正确 - 在释放鼠标按钮之前不允许绘图。
    • 好吧,我可以将分离器返回到“模式”模式;但它不会处于“更新”模式。
    【解决方案3】:

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

    在调整大小事件中放置一些非阻塞消息(到文件、控制台调试器、gexperts 调试器)。正如您所期望的那样,您只得到几个还是几十个?

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

    【讨论】:

      【解决方案4】:

      这主要是由于许多控件的重绘事件

      您可以尝试在表单中禁用背景绘制(减少绘制次数):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        相关资源
        最近更新 更多