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
即可为很多快速失效(重新绘制请求)提供服务。