BitBlt()双缓冲办理图象闪耀[VC/C++编程]
本文“BitBlt()双缓冲办理图象闪耀[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
显示图形若何避免闪耀,若何提高显示效率是问得对比多的问题.并且大都人认为MFC的画图函数效率很低,老是想追求别的的办理筹划.
MFC的画图效率的确不高但也不差,并且它的画图函数利用非常简单,只要利用办法得当,再加上一些本领,用MFC可以得到效率很高的画图程序.
我想就我长期(呵呵当然也只有2年多)利用MFC画图的经验谈谈我的一些概念.
1、显示的图形为什么会闪耀?
我们的画图历程大多放在OnDraw大概OnPaint函数中,OnDraw在举行屏幕显示时是由OnPaint举行调用的.当窗口由于任何缘由需求重绘时,老是先用后台色将显示区排除,然后才调用OnPaint,此后台色常常与画图内容反差很大,这样在短时间内后台色与显示图形的交替呈现,使得显示窗口看起来在闪.假如将后台刷设置成NULL,这样无论怎样重画图形都不会闪了.当然,这样做会使得窗口的显示乱成一团,因为重绘时没有后台色对本来绘制的图形举行排除,而又叠加上了新的图形.有的人会说,闪耀是因为画图的速度太慢大概显示的图形太复杂造成的,其实这样说并不对,画图的显示速度对闪耀的影响不是根本性的.比方在OnDraw(CDC *pDC)中这样写:
pDC->MoveTo(0,0);
pDC->LineTo(100,100);
这个画图历程应当是非常简单、非常快了吧,但是拉动窗口改变时还是会瞥见闪耀.其实从原理上讲,画图的历程越复杂越慢闪耀应当越少,因为画图用的时间与用后台排除屏幕所花的时间的比例越大人对闪耀的感受会越不明显.比方:清楚屏幕时间为1s画图时间也是为1s,这样在10s内的持续重画中就要闪耀5次;假如清楚屏幕时间为1s不变,而画图时间为9s,这样10s内的持续重画只会闪耀一次.这个也可以试验,在OnDraw(CDC *pDC)中这样写:
for(int i=0;i<100000;i++)
{
pDC->MoveTo(0,i);
pDC->LineTo(1000,i);
}
呵呵,程序有点变态,但是能阐明问题.
说到这里大概又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差对比大,所以感受上要闪得利害一些,但是闪耀频率要低.那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次夸大了,闪耀是什么?闪耀就是反差,反差越大,闪耀越利害.因为动画的持续两个帧之间的差别很小所以看起来不闪.假如不信,可以在动画的每一帧中间加一张纯白的帧,不闪才怪呢.
2、若何避免闪耀
在知道图形显示闪耀的缘由之后,对症下药就好办了.首先当然是去掉MFC供应的后台绘制历程了.实现的办法很多,
* 可以在窗口形成时给窗口的注册类的后台刷付NULL
* 也可以在形成今后改正后台
static CBrush brush(RGB(255,0,0));
SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
* 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE
这样后台没有了,后果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱.怎么办?这就要用到双缓存的办法了.双缓冲就是除了在屏幕上有图形举行显示以外,在内存中也有图形在绘制.我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个历程非常快,因为是非通例整的内存拷贝).这样在内存中画图时,随便用什么反差大的后台色举行排除都不会闪,因为看不见.当贴到屏幕上时,因为内存中终究的图形与屏幕显示图形差别很小(假如没有运动,当然就没有差别),这样看起来就不会闪.
以上是“BitBlt()双缓冲办理图象闪耀[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |