如何更快地刷新控件?

时间:2009-05-09 20:02:40

标签: c# controls drawing refresh

我在C#中有一个自定义控件。我注意到调用Refresh比我想要的慢得多(大约0.1ms),即使我有一个空的RePaint函数。基本上,我的应用程序处理一个网格,并逐个刷新每个网格单元格。这种相当低效的行为是设计的;当启用时,我希望能够实际看到每个处理步骤的内容,并且每个步骤最终只会更改一个单元格。切换双缓冲没有太大区别。

有人可以提供任何建议吗?

目前,我提出的最佳改进是通过拨打Refresh来取代我对Refresh2的通话。后一个函数是Repaint的精确副本,除了添加到顶部的两行Graphics g = Graphics.FromHwnd(this.Handle); g.Clear(BackColor);并用e.Graphics替换g。我怀疑这有一些不利之处,但确实将绘图速度降低了一半。请注意,我正在使用的控件没有子组件,所以像验证这样的事情并没有那么多关注。

2 个答案:

答案 0 :(得分:2)

刷新太多会降低你的体验速度,尝试压缩事件,即当你得到一个新网格时不刷新,但是当你需要更新时设置一个变量,并让计时器每隔1秒检查一次该变量例子,然后刷新。

答案 1 :(得分:0)

刷新是自动重复发生的事件还是响应用户事件?

在第一种情况下,它应该是异步的(在它自己的线程中)。如果响应用户事件,那么在“刷新”对事件不重要的情况下也是如此。

如果更新接口的代码太慢,请确保它只是更新接口(它应该已经准备好了数据......这是双缓冲的一种方式)。如果不是这样,做一些记录,找出花费太多时间的东西。

如果必须先获取数据,那么预计会有一些延迟。如果这是不可接受的,那么你需要有一些缓存机制。您可以让异步自动更新缓存,或者让它返回缓存的内容,获取新数据,然后导致另一次更新......或其他类似的事情。