使用反射设置控件样式时的效率

本文关键字:效率 样式 控件 反射 设置 | 更新日期: 2023-09-27 18:36:28

Background

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

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

事实证明,这样做很烦人,因为 GetStyle 和 SetStyle 方法受到保护,并且我们需要禁用许多第三方控件来禁用双缓冲。 为了克服这个问题,我创建了一个帮助程序方法,通过反射禁用双重缓冲,这似乎是所有邪恶中较小的一个。 然后,我通过布局事件监视控件的大小,并相应地设置 DoubleBuffer 和 OptimizedDoubleBuffer 标志。

问题

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

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

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

使用反射设置控件样式时的效率

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

分配双缓冲区和绘图相比,少量的反射访问实际上算不了什么。别想了。