我在C#中有一个自定义控件。我注意到调用Refresh
比我想要的慢得多(大约0.1ms),即使我有一个空的RePaint
函数。基本上,我的应用程序处理一个网格,并逐个刷新每个网格单元格。这种相当低效的行为是设计的;当启用时,我希望能够实际看到每个处理步骤的内容,并且每个步骤最终只会更改一个单元格。切换双缓冲没有太大区别。
有人可以提供任何建议吗?
目前,我提出的最佳改进是通过拨打Refresh
来取代我对Refresh2
的通话。后一个函数是Repaint
的精确副本,除了添加到顶部的两行Graphics g = Graphics.FromHwnd(this.Handle); g.Clear(BackColor);
并用e.Graphics
替换g
。我怀疑这有一些不利之处,但确实将绘图速度降低了一半。请注意,我正在使用的控件没有子组件,所以像验证这样的事情并没有那么多关注。
答案 0 :(得分:2)
刷新太多会降低你的体验速度,尝试压缩事件,即当你得到一个新网格时不刷新,但是当你需要更新时设置一个变量,并让计时器每隔1秒检查一次该变量例子,然后刷新。
答案 1 :(得分:0)
刷新是自动重复发生的事件还是响应用户事件?
在第一种情况下,它应该是异步的(在它自己的线程中)。如果响应用户事件,那么在“刷新”对事件不重要的情况下也是如此。
如果更新接口的代码太慢,请确保它只是更新接口(它应该已经准备好了数据......这是双缓冲的一种方式)。如果不是这样,做一些记录,找出花费太多时间的东西。
如果必须先获取数据,那么预计会有一些延迟。如果这是不可接受的,那么你需要有一些缓存机制。您可以让异步自动更新缓存,或者让它返回缓存的内容,获取新数据,然后导致另一次更新......或其他类似的事情。