繁体   English   中英

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

[英]GDI drawing application with high CPU usage

我有一个应用程序,用户可以在其中绘制一些形状。 当我单击某个形状并将其拖动时,由于MouseMove中的Invalidate(),CPU的运行速度为100%。 如果我使用计时器,并从滴答事件中调用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);
    }`

有三种通用解决方案。

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,并且应用程序运行良好。 启用双缓冲后,只有一些闪烁发生了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM