再来一贴,关于C#不尽人意的控件绘制效率,没有原因吗?
本人近期发现C#的控件绘制效率有些出乎意外的慢。我白思不得其解,我手动用Graphics画一个相似的控件都要快很多。这实在是有些无法解释。连续几天请教了很多朋友,学到很多东西,但是还是没能最终解释控件绘制慢的原因。所以,在此再贴一贴重申一下问题的关键,并且对之前一起讨论的朋友表示感谢,希望大家还能多多指点,继续讨论,多提出一些意见,哪怕贴出一点点猜想都好。
原贴位置:http://community.csdn.net/Expert/topic/4830/4830989.xml
问题大致的描述:一个窗口中添加了100多个控件(例如label),可以明显看到控件的绘制过程(控件是一个一个出现的,而不是一次性全部绘制完成并“翻页”),大约需要0.x秒绘制完成。
这里首先说明几个容易被误导的问题,以此避免讨论不必要的细节:
1、应该不存在我的相关代码的效率影响。因为我的测试都是建立的新建空工程的基础上的。我用过两种方法测试:一种办法是直接在构造函数中填写最简单的生成控件的代码进行测试。另一个方法更简单,就是完全不手动写任何代码,开了新工程直接添加=>复制、粘贴=>复制、粘贴=>复制、粘贴……100多个label。
2、我所指的慢是绘制速度慢,既不是生成速度,也不是移动、滚动(因为这里不会引起整个窗口重绘,实际上只是copy贴图)。我已经发现的测试绘制速度的办法有四种:第一种是弹出时直接看速度(要求添加控件在构造期完成,否则影响测试结果);第二种是用另外一个窗口完全遮罩本窗口,然后再切换回原来的窗口;第三种是将本窗最小化/还原;第四种是将窗口大小调整到非常小,然后再拉大。
还有一点要注意的就是,测试的时候窗口得稍微大点,否则看不到效果。
如果你能看得清窗口中的大片控件是从某一个地方开始按顺序绘制的(大约超过0.x秒人眼就能察觉了吧),那就是我想要表达的:)