在OnPaint方法中绘制大量线会导致无响应状态

问题描述 投票:0回答:1

在我的自定义控件中,我使用了将近1000个序列,每个序列具有100个点,这会导致绘制延迟,即使绘制后也需要花费一些时间才能做出响应。

甚至在加载点之前甚至使用Begin和End更新。但是没有用。

我已经在一个简单的示例中通过在循环中画一条线来复制了相同的内容,这也会进入无响应状态。

有什么解决方案可以克服这个问题。

    public Form2()
    {
        InitializeComponent();
        ControlExt controlExt = new ControlExt();
        this.Controls.Add(controlExt);
    }

  public class ControlExt : Control
  {

    public ControlExt()
    {
        Height = 500;
        Width = 1000;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        for (int i = 0; i < 1000; i++)
        {

            for (int j = 0; j < 100; j++)
            {
                using (var pen = new Pen(Color.Red, 2))
                {
                    e.Graphics.DrawLine(pen, 400, 200, 300, 100);
                }
            }
        }           
    }
}
c# winforms windows-forms-designer onpaint
1个回答
0
投票

绘制线条是在主线程上完成的,当线条很多时,效率可能很低。 Winforms基于GDI,并且使用Immediate Mode渲染。由于处理器必须每帧将所有命令发送到图形设备,因此这种扩展的趋势很差。

典型的解决方案是使用较少的绘制命令,因此开销较小。例如:

  • 如果线段连接成条,则使用DrawLines。>>
  • 为所有线条创建图形路径并使用DrawPath
  • 创建位图,在后台线程上将此图像绘制,然后在UI中使用DrawImage
© www.soinside.com 2019 - 2024. All rights reserved.