在WinForms中加速缓慢的CPU密集型滚动

时间:2010-05-03 15:55:23

标签: c# winforms performance rendering repaint

如何在WinForms应用程序中加快UserControls的滚动。?

我的主要表单无法在慢速机器上快速滚动 - 每个小滚动增量的绘画都是CPU密集型的。

我的表单大约有五十个UserControls(有多个字段)一个位于另一个之下。 我已经尝试拦截OnScroll和UserPaint,以便为非常小的滚动事件消除一些不必要的重新绘制,但无论如何都要调用底层的Paint。

如何在较慢的机器上简化滚动?

3 个答案:

答案 0 :(得分:3)

经过验证的方法是使用屏幕外位图,仅当控件所代表的数据实际发生变化时才会更新;然后,所有OnPaint需要做的就是将该位图渲染到屏幕上。

如果您的绘画过程非常密集,并且由于您拥有如此多的控件,您会发现这会对应用程序的性能产生巨大影响。

请注意,使用DoubleBuffering控件属性对您的情况没有帮助 - 告诉WinForms在渲染到屏幕之前渲染到屏幕外位图,但仍然会发生在每个绘制周期,因为WinForms不会跟踪表示何时发生变化。

所以,你必须自己动手。这并不困难。这看起来像reasonably good article on the subject

答案 1 :(得分:2)

您还可以增加滚动步长的大小。例如

panel1.VerticalScroll.SmallChange = 100;

每次单击滚动条按钮,将导致面板垂直滚动内容100个单位。所以你每次都要采取更大的步骤,这可能会让体验至少变得更好。当然,你可以对水平滚动条做同样的事情。

答案 2 :(得分:1)

我使用了标签来消除滚动。