GDI绘图应用程序与高CPU使用率

本文关键字:CPU 使用率 绘图 应用程序 GDI | 更新日期: 2023-09-27 18:13:27

我有一个用户绘制一些形状的应用程序。当我点击一个形状并拖动它时,由于鼠标移动中的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);
    }`

GDI绘图应用程序与高CPU使用率

一般有三种解决方案。

1)不要边画边移动,这是很长一段时间窗口的解决方案,当你拖动窗口时,它就消失了,你看到的是窗口的轮廓。

2)创建一个位图对象,并只移动它。注意,你必须重新绘制它下面的区域。

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

同样,如果GDI不是世界上最快的绘图函数。如果你的形状非常复杂,你可能要考虑使用OpenGL, DirectX或SDL。

除了使整个区域无效之外,还可以使用以下命令使已更改的控件部分无效:

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

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

 this.DoubleBuffered = true;

从您所提供的有限代码来看,我认为无效不会造成任何问题。最有可能的问题是在您的shape.Render()的实际渲染代码中。在过去,我写过类似的应用程序,我在鼠标移动中调用了Invalidate,应用程序工作得很好。