代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

德尔菲:如何诊断迟缓的用户界面?

  •  2
  • Ian Boyd  · 技术社区  · 14 年前

    我有一个窗体,您可以假装它是像Windows资源管理器一样布置的:

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

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

    左侧面板和工作区面板都有丰富的控件。

    问题是使用拆分器非常缓慢。我希望现代的2千兆赫计算机能像人类推动鼠标一样快速地重新显示窗体。但情况肯定不是这样的,需要200-300毫秒才能完全重新调整表单。

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

    我该如何去追查谁是导致行动迟缓的原因呢?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Zoë Peterson RRUZ    14 年前

    使用分析器。埃里克·格兰奇的 Sampling Profiler 很好。AutomatedQA AQtime 很好。

    这很可能是由于控件调整布局和大小时重复调整大小和重新绘制。很多嵌套或只是很多控制通常会导致问题。你可以通过重写 AlignControls 并且每次拆分器移动时只调整一次对齐,但这将涉及相当多的工作。

    或者,tsplitter有一个 ResizeStyle 属性,该属性控制控件是立即移动还是在窗体上换行,并且控件仅在末尾更新。视觉效果不太好,但工作量要少得多。

        2
  •  4
  •   dwo    14 年前

    我建议您挂起两个面板的重新绘制,只要拆分器正在移动,或者使用一个特定的值,例如50px,在这里重新绘制。

        3
  •  1
  •   Chris Thornton    14 年前

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

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

    左侧面板和拆分器应对齐,并与另一个Alclient对齐。

        4
  •  1
  •   André    14 年前

    这主要是由于许多控件的重新绘制事件所致。

    您可以尝试禁用窗体中的背景绘制(减少绘制数量):

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