1

背景

我目前正在尝试修复一些行为,如果控件太大而无法分配缓冲区,则双缓冲会导致崩溃。

经过多次讨论和反复试验,我们决定最好的做法是为控件启用双缓冲,如果大小将支持它(比如小于 3000x3000 像素),但如果它超过该大小阈值,那么我们将以编程方式关闭双缓冲。

事实证明这样做相当烦人,因为 GetStyle 和 SetStyle 方法受到保护,并且有许多我们需要禁用双缓冲的第 3 方控件。为了克服这个问题,我创建了一个辅助方法,通过反射禁用双缓冲,这似乎是万恶之源。然后我通过 Layout 事件监控控件的大小,并相应地设置 DoubleBuffer 和 OptimizedDoubleBuffer 标志。

问题

我对反射并不太熟悉,我的主要问题是我应该期望通过 MethodInfo.Invoke 方法获取/设置 ControlStyles 对性能产生什么样的影响。

特别是,我想知道通过首先读取值来防止设置 DoubleBuffer/OptimizedDoubleBuffer ControlStyles 是否有帮助(这也必须通过反射使用 GetStyle() 来完成)。还是每次只调用 SetStyle() 基本相同。我很担心,因为 Layout 事件被调用了很多,我不想仅仅因为这个双缓冲跟踪逻辑而严重降低性能。

任何输入都将不胜感激,特别是关于我正在做的事情的性能影响,而且如果有人有更好的想法,只有在超过一定大小时才禁用控件的双缓冲。

4

1 回答 1

1

我建议您先阅读样式,看看是否需要调用 SetStyle。设置样式可能很昂贵。

与分配双缓冲区和绘图相比,少量的反射访问实际上微不足道。别想了。

于 2012-06-05T21:40:58.250 回答