我有一个用户绘制一些形状的应用程序。 当我点击一个形状并将其拖动时,由于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);
}`
答案 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,应用程序运行良好。只有一些闪烁才能实现双缓冲。