C#OnPaint mousemove使用较高的cpu

我写了一个自定义控件来渲染一些图形。 图形本身渲染起来相当昂贵,但一旦渲染它很少发生变化。 我遇到的问题是,如果将鼠标移动到图形表面上的速度非常快,它会一直调用控件的重写Paint方法,这会导致高CPU损失:

private void UserControl1_Paint(object sender,PaintEventArgs e)

由于鼠标指针下面的图形/图像实际上并没有改变,所以可以使用什么技术来避免这种情况或最小化任何不必要的重绘?


编辑:看到你的编辑后,我可以向你保证,当鼠标移动到控件上时,默认情况下不会调用OnPaint。 你的代码中的东西肯定会导致重新绘制,你只是还没有看到它。 也许发布一些代码可以帮助我们发现问题。

您是否使MouseMove上的控件失效? 这可能是一个坏主意,如果你确实需要这样做(即你正在制作一个图形编辑器或其他东西),那么你必须明白一个区域实际上被重新绘制了多大。 所以,解决方案; 请勿在MouseMove中绘制您的控件。

否则,当鼠标移过控件时,我不希望OnPaint触发。 您也可以只生成一次图像,然后将其绘制到Graphics对象上,直到需要重新生成。


你可以使用一个缓冲区图像来绘制什么东西被改变,而在Paint方法中只需要在屏幕上复制图像。 应该很快。 您也可以使用剪辑区域来仅复制需要更新的部分。 这应该会减少CPU使用率。

如果需要,您还可以使用IsDirty标志来知道何时更新缓冲区映像(即完全重新绘制它)。


你不应该直接调用Paint

相反,调用Invalidate (Control.Invalidate)。 这排队需要重新绘制,Windows将自己照顾电话。 这样,通过一次调用Paint即可为很多快速失效(重新绘制请求)提供服务。

链接地址: http://www.djcxy.com/p/50275.html

上一篇: C# OnPaint mousemove high cpu usage

下一篇: gdi+ Graphics::DrawImage really slow~~