在界面开发过程中,我们常常要处理窗口控件闪烁的问题,而在实际情况中,难以达到理想要求,在开发SkinSE换肤的过程中,实现了20几种控件的绘制,为了解决窗口闪烁问题,曾经花去大量的时间,查阅了大量资料,这里就做一个的总结。
在阅读本文之前,请认真阅读第一、第二部分,这对闪烁有一个非常深刻的认识。
一 闪烁的原理
GDI绘制图像向屏幕输出的时候,不是立即在显示屏上面显示,而是首先讲数据写入显存,而显卡每隔一段时间把显存的数据显示到显示屏。这个时间间隔就是我们通常所说的屏幕刷新频率(一般台式显示器是80 HZ,液晶显示器是60 HZ)。如果在一个刷新周期内,没有完成一次绘制的操作,那么就是在几个刷新周期内完成,这样给人的感觉就是一闪一闪的感觉,这就是我们要解决的问题:窗口控件的闪烁。
二 闪烁的原因
常见的闪烁分为两种,一种是窗口控件本身绘制背景的闪烁,一种重叠窗口闪烁。
分析第一种情况:窗口控件本身的绘制过程,通常是首先绘制窗体背景,然后再绘制用户需求的绘制,如果整个绘制过程相当的复杂,绘制过程所需时间大于我们显示屏的刷新周期,就出现闪烁。(读到这里,可能读者第一知觉就是缓存技术,如果绘制非常频繁,缓存技术也会闪烁,怎么解决呢?下文将给出解答)
分析第二种情况:重叠窗口的闪烁。如下图所示情况: