C# Control.Invalidate()或Control.Invalidate(矩形)

C# Control.Invalidate()或Control.Invalidate(矩形),c#,.net,vb.net,C#,.net,Vb.net,我应该使用Control.Invalidate()还是最好使用Control.Invalidate(矩形)?MSDN对这些方法的信息有点缺乏 在这两种情况下,调用相同的OnPaint方法并执行相同的代码行。那么这里的区别是什么,除了我必须计算矩形结构来告诉窗口应该重画哪个区域 我觉得只要一直使用Control.Invalidate()我就安全多了,但同时我觉得我写了糟糕的代码并失去了性能。您应该始终使尽可能小的区域无效,因此您应该传递一个矩形或区域,除非整个控制区域已经或可能已经更改。原因是,将

我应该使用
Control.Invalidate()
还是最好使用
Control.Invalidate(矩形)
?MSDN对这些方法的信息有点缺乏

在这两种情况下,调用相同的
OnPaint
方法并执行相同的代码行。那么这里的区别是什么,除了我必须计算矩形结构来告诉窗口应该重画哪个区域


我觉得只要一直使用
Control.Invalidate()
我就安全多了,但同时我觉得我写了糟糕的代码并失去了性能。

您应该始终使尽可能小的区域无效,因此您应该传递一个
矩形
区域
,除非整个控制区域已经或可能已经更改。原因是,将像素实际绘制到屏幕是整个操作中最慢的部分,无效区域内的每个像素都将重新绘制。像素越少,即重新绘制的速度越快


您可能并不总是能够看到差异,但是,特别是如果您经常重新绘制,可能会出现明显的性能差异。执行稍微复杂的计算来确定最小的
矩形或
区域通常比重新绘制额外的像素要快得多。

您应该始终使可能的最小区域无效,因此,您应该传递一个
矩形
区域
,除非整个控制区域已经或可能已经更改。原因是,将像素实际绘制到屏幕是整个操作中最慢的部分,无效区域内的每个像素都将重新绘制。像素越少,即重新绘制的速度越快


您可能并不总是能够看到差异,但是,特别是如果您经常重新绘制,可能会出现明显的性能差异。通常,执行稍微复杂的计算来确定最小的
矩形
区域
比重新绘制额外像素要快得多。

如果要使整个内容无效,请使用invalidate()。如果只想使控件的一部分无效,请使用矩形方法。这只是一种优化技术。单独使用Invalidate()应该没问题。大多数时候,这些东西都是双缓冲的,据我所知,整个东西都被重新绘制了。我认为这是CPU和GPU能力非常有限时的产物。实际上情况已经不是这样了,尤其是对于GDI.Invalidate(矩形)来说,只有在绘制事件中重新绘制部分区域时才有意义。如果整个区域总是被重画,那就没有意义了。@AlexanderPetrov,那不是真的。始终在事件处理程序中绘制所有图形。这与
无效
完全无关。每次都绘制所有图形,然后只有图形中位于无效区域的部分实际绘制到屏幕上。缓慢的是绘图部分,而不是绘图部分。如果要使整个内容无效,请使用invalidate()。如果只想使控件的一部分无效,请使用矩形方法。这只是一种优化技术。单独使用Invalidate()应该没问题。大多数时候,这些东西都是双缓冲的,据我所知,整个东西都被重新绘制了。我认为这是CPU和GPU能力非常有限时的产物。实际上情况已经不是这样了,尤其是对于GDI.Invalidate(矩形)来说,只有在绘制事件中重新绘制部分区域时才有意义。如果整个区域总是被重画,那就没有意义了。@AlexanderPetrov,那不是真的。始终在事件处理程序中绘制所有图形。这与
无效
完全无关。每次都绘制所有图形,然后只有图形中位于无效区域的部分实际绘制到屏幕上。慢的是绘画部分,而不是绘画部分。也许我低估了绘画方法的成本。如果客户提供的方法在指定区域(在
Graphics.Clip
中指定)之外绘制,您将如何通过更改该方法来处理该方法?不能保证我刚才经过的区域和他过去画的区域是一样的。我不知道你的意思。如果一个方法正在绘制,那么可能已经引发了
Paint
事件,因此已经调用了
Invalidate
。这意味着在调用
Invalidate
时,应该已经计算并指定了可能已更改的区域。你不应该在现有问题答案的评论中提出新问题。如果您有一个新问题,请发布一个新问题,并附上与该问题相关的所有信息。@keco您可以让客户传递绘制到的图像部分的坐标。然后将它们用作参数来控制.Invalidate()
。也许我低估了绘图方法的成本。如果客户提供的方法在指定区域(在
Graphics.Clip
中指定)之外绘制,您将如何通过更改该方法来处理该方法?不能保证我刚才经过的区域和他过去画的区域是一样的。我不知道你的意思。如果一个方法正在绘制,那么可能已经引发了
Paint
事件,因此已经调用了
Invalidate
。这意味着在调用
Invalidate
时,应该已经计算并指定了可能已更改的区域。你不应该在现有问题答案的评论中提出新问题。如果你有一个新的问题,那么发布一个新的问题与所有