于双缓冲技术的GDI无闪烁绘图
JournalofComputerApplications
计算机应用,2012,32(S2):136-139文章编号:1001-9081(2012)S2-0136-04
ISSN1001-9081CODENJYIIDU2012-12-31
www.51wendang.com.joca.cn
基于双缓冲技术的GDI+无闪烁绘图
江建国,温少营,张瑞楠
(辽宁师范大学数学学院,辽宁大连116029)(*通信作者电子邮箱jjgbox@sina.com)
*
要:图形闪烁是使用GDI+编写Windows窗体应用程序时经常遇到的一个问题。在深入分析窗体重绘模型
阐述了图形闪烁的本质原因。利用.NET框架中内置的双缓冲技术,提出了两种GDI+无闪烁绘图方法。以基础上,
摘
模拟时钟程序为例,说明了这两种方法都非常简便且有效。
关键词:双缓冲;无闪烁绘图;图形闪烁;GDI+;.NET框架;模拟时钟
中图分类号:TP391.41
文献标志码:A
Flicker-freeGDI+drawingbasedondoublebuffering
JIANGJian-guo,WENShao-ying,ZHANGRui-nan
(SchoolofMathematies,LiaoningNormalUniversity,DalianLiaoning116029,China)
*
Abstract:GraphicsflickeringisanintractablecommonproblemwhenprogrammingWindowsformsapplicationsbyusingGDI+.Onthebasisofprofoundanalysisonthemodelofformredrawing,theessentialsofgraphicsflickeringwereexplainedinthispaper.Twoflicker-freeGDI+drawingmethodswereproposedbasedondoublebufferingbuiltinthe.NETframework.Totakeanalogclockasanexample,itisshownthatthesetwomethodsareveryeasy-to-useandeffective.
Keywords:doublebuffering;flicker-freedrawing;graphicsflickering;GDI+;.NETframework;analogclock
0引言
在编写图形应用程序时,经常会发现程序所绘制的图形
在屏幕上不停地闪烁,这是一个比较难以解决的编程问题
[1]
双缓冲技术在编程界应用已经有好多年了。在早期
Win32编程年代,使用C语言调用GDI编写图形应用程序,就
为了使用双缓存技术消除经常会遇到图形闪烁问题。那时,
图形闪烁,往往需要额外编写一些较高技巧的代码;后来,随着面向对象开发技术的成熟与流行,双缓冲技术在一些面向
[5]
DirectX[3,6]对象风格的图形库中得到了支持,如OpenGL、
等图形库。一些面向对象风格的应用程序框架也都为双缓冲
X窗口系统[8]、如ET++、技术提供了不同程度的支持,
MFC[9-10]、Java[11-12]、.NET[1,4]等。
[4]
虽然.NET框架中内置了双缓冲技术,但是我们发现,很多.NET程序员在开发Windows窗体应用程序时,仍不能正确地使用双缓冲技术消除图形闪烁。许多.NET程序员还是
这不但增加了实现使用传统的手工编码方式来实现双缓冲,
难度,而且有时还会引入其他的一些编程问题。造成.NET程序员不正确使用双缓冲技术的主要原因有两个:一个是没有正确地理解Windows窗体重绘模型;另一个就是没有掌握.NET框架中内置的双缓冲技术。
本文通过研究Windows窗体重绘模型,以及.NET框架中与双缓冲技术密切相关的一些类,来探讨如何在Windows窗体应用程序中使用双缓冲技术来消除图形闪烁。在分析Windows窗体重绘模型基础上,阐述引起图形闪烁的本质原因;提出两种基于双缓冲技术的GDI+无闪烁绘图方法:一种是控件默认的双缓冲绘图,另一种是自定义双缓冲绘图。以模拟时钟为例,详细地说明如何在实际的项目开发过程中使用双缓冲技术消除图形闪烁。
。绘图密集型应用程序,如动画、视频游戏等,往往会导
致其所绘制的图形出现闪烁。闪烁使图形具有不可接受的外会严重地影响用户体验。观,
有许多消除图形闪烁的方法,如增量更新(incrementalupdate)[2]、页面切换(pageflipping)[3]、双缓冲(doublebuffering)[4]等。每种方法都有其不同的优缺点,也都有其不同的适用范围。增量更新的缺点是不适用于难以判断无效区域的编程场景,优点是能在某种程度上提高程序运行效率;页面切换的缺点是需要显卡硬件的支持,优点是运行效率最高;双缓冲的缺点是需要较多的内存,优点是适用范围广泛。在一般编程场景下,大多数开发人员还是喜欢使用双缓冲技术来消除图形闪烁。
双缓冲技术的基本思想是不直接在屏幕的显存(称为前端缓冲区)中绘图,而是先将图形绘制到一块内存(称为后端缓冲区)中,然后再将后内存中已绘制好的图形复制到显存中(见图1)。由于所有的绘图操作都是在后端缓冲区内完成的,而在屏幕上只执行一次呈现图形操作,因而能消除由多重绘制所引起的图形闪烁。
1
图1
双缓冲技术
图形闪烁
事件驱动模型是Windows窗体应用程序的运行机制。
收稿日期:2012-04-19。
CCF会员,作者简介:江建国(1969-),男,黑龙江嫩江人,副教授,博士,主要研究方向:自动推理、人工智能、智能软件;温少营(1987-),女,
辽宁鞍山人,硕士研究生,主要研究方向:自动推理、智能软件;张瑞楠(1988-),女,辽宁盘锦人,硕士研究生,主要研究方向:自动推理、智能软件。


