【问题标题】:How can I make refreshing a control faster?如何更快地刷新控件?
【发布时间】:2010-10-25 01:01:11
【问题描述】:

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

谁能给点建议?

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

【问题讨论】:

    标签: c# controls drawing refresh


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我已经进行了分析和日志记录,什么都没有。如果我删除调用以刷新或用另一个调用替换它,所花费的时间就会消失。清空 rePaint 功能会阻止刷新正常工作,但不会显着减少所用时间。显然,刷新函数不仅仅是调用重绘,它所做的其他事情就是消耗时间。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2021-12-10
      相关资源
      最近更新 更多