具有高CPU使用率的GDI绘图应用程序

时间:2011-11-04 11:51:40

标签: c# .net winforms

我有一个用户绘制一些形状的应用程序。 当我点击一个形状并将其拖动时,由于MouseMove中的Invalidate(),CPU会100%。 如果我使用计时器并从tick事件中调用Invalidate(),则移动不是那么顺利。 有没有其他方法可以最大限度地减少CPU并使其顺畅移动?

  ` Point startDragMousePoint;
    Point startShapeLocation;
    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if(isMouseDown)
        {
            Point deltaPoint = Point.Subtract(e.Location, new Size(startDragMousePoint));
            shape.Location = Point.Add(startShapeLocation, new Size(deltaPoint));
            Invalidate();
        }
    }

    private void Canvas_Paint(object sender, PaintEventArgs e)
    {
       shape.Render(e.Graphics);
    }`

3 个答案:

答案 0 :(得分:0)

有三种通用解决方案。

1)不要在你移动的时候画画,这是很长一段时间在窗户上的解决方案,当你拖动窗户时,它只是不屑一顾,你看到了窗户的轮廓。

2)创建一个位图对象并仅移动它。请注意,您必须重绘其下的区域。

3)不要使孔窗口无效,只要更改您正在更改的区域。绘制到缓冲区(位图)可以帮助您重用区域。

此外,如果GDI不是世界上最快的绘图功能。如果您的形状非常复杂,您可能需要考虑使用OpenGL,DirectX或SDL。

答案 1 :(得分:0)

不是使整个区域无效,而是使用以下方法使已更改的控件部分无效:

Rectangle changedArea = new Rectangle(cX, cY, cW, cH);
this.Invalidate(changedArea);

还要确保您的控件设置为使用DoubleBuffering

 this.DoubleBuffered = true;

答案 2 :(得分:0)

根据您提供的有限代码,我认为无效不会导致任何问题。很可能问题可能在你的shape.Render()的真实渲染代码中。在过去,我已经编写了类似的应用程序,我在鼠标移动中调用了Invalidate,应用程序运行良好。只有一些闪烁才能实现双缓冲。