1

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

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

目前,我想出的最佳改进是将我Refresh的呼叫替换为对Refresh2. 后一个函数是 的精确副本Repaint,除了在顶部添加两行Graphics g = Graphics.FromHwnd(this.Handle); g.Clear(BackColor);并替换e.Graphicsg. 我怀疑这有一些缺点,但它确实将绘图速度减半。请注意,我正在使用的控件没有子组件,因此验证之类的事情并没有那么重要。

4

2 回答 2

2

刷新太多会减慢您的体验,尝试压缩事件,即在获得新网格时不刷新,但在需要更新时设置变量,并让计时器每 1 秒检查一次该变量并刷新然后。

于 2009-05-09T20:15:44.667 回答
0

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

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

如果更新接口的代码太慢,请确保它只更新接口(它应该已经准备好数据......这是双缓冲的脉络)。如果不是这种情况,请进行一些日志记录,找出花费太多时间的原因。

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

于 2009-05-09T20:50:44.210 回答