一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Windows用户界面编程中的界面闪烁问题

时间:2008-01-12 编辑:简简单单 来源:一聚教程网


Windows用户界面编程中的界面闪烁问题
    在Windows图形化用户界面编程中,若程序自己绘制用户界面时,会经常碰到界面闪烁,比如其他窗口在上面移动,用户界面滚动,这些都有可能导致闪烁。在一个容器中绘制特定的文档,需要相应作为绘图容器的控件的OnPaint事件,需要在OnPaint事件处理中重新绘制文档,而Windows操作系统一般会在两种情况下触发OnPaint事件:容器控件被其他窗体覆盖后又显示,还有就是容器控件的滚动处理。在这些情况下,Windows操作系统会频繁的触发OnPaint事件,而应用程序会频繁的在绘图容器中重新绘制图形,若应用程序没有进行很好的优化,则很有可能导致用户界面闪烁。
   用户界面出现闪烁自然害处多多,首先它使得你的程序看起来不专业,甚至有不稳定的嫌疑,对于追求完美的你这么会容许它的存在呢;其次闪烁会损害用户的视力,容易让用户产生视觉疲劳。
    好了,废话我不多说了,我们就来发现问题,分析问题,解决问题。
    首先说说闪烁的本质,说到本质,就不得不提一些计算机系统结构和Windows图形用户子系统的一些知识。我们知道,在计算机内存中有一个区域叫做显存,而显卡则每过一些毫秒就从扫描显存,然后根据操作显示器来绘制一个个象素,因此每过一些毫秒显示器显示的内容就会重新设置一遍,由于这是硬件操作,非常快,若画面内容没有变化,则人类肉眼是看不到这个刷新的,此时用户界面是没有任何闪烁。
    右图就是应用程序绘制用户界面的原理,应用程序在CPU的支持下向显存填充数据,而以此同时显卡也从显存加载数据操作显示器绘制图形,(笔者想若应用程序能直接访问显示器则绘制速度不要太快哦),而用户界面闪烁也就根源于这种显示结构。前面提到,显卡每过一些毫秒就会扫描显存,刷新显示器的显示。假设有个显示卡,设置其刷新频率为50赫兹,则它每20毫秒就扫描显存刷新显示器,而显卡的操作和应用程序的操作和应用程序的操作之间没有任何关系,显卡是自带处理器的,于是应用程序和显卡这两个对象同时操作显存,显卡只读取显存,而应用程序则修改显存,这就导致了类似多线程程序的数据同步的问题了。但这时硬件结构决定此时没有什么锁定机制可使用。显卡每20毫秒就进行刷新操作,连操作系统也挡不住,而且应用程序根本不知道显卡会何时进行刷新操作。
    某个时刻,应用程序需要绘制用户界面,首先需要清空绘制容器,因此将显存一大片区域设置为白色,应用程序刚完成了清空操作,还每来得及绘制内容时,显卡就刷新了,很快显示器上显示了一大片白色。同时,应用程序开始绘制内容,应用程序运行缓慢,它化了20毫秒绘制了文档的上半身,文档上半身主要为红色,刚绘制了上半身,显卡就好不留情的进行刷新,很快显示器上显示了一半的文档,刚才一半的白色大半变成了红色,此时用户看来,显示器一下变成一片白,然后很快一半变成红色,此时显示器内容产生了两次大面积的内容变幻,然后应用程序又化了20毫秒显示了文档的下半身,文档下半身主要为绿色,此时显卡进行刷新,显示器上另一半还残存的白色又变成绿色。由于应用程序绘制文档完毕,因此不再修改显存,此时显示器的显示的内容不再发生改变。

热门栏目