目录
前言:
学了easyx图形库的朋友们都知道,我们可以在easyx图形库上面画出连续运动的图片,或者通过贴图的方式把每一帧图片连起来达到动态效果,但是我们每次贴完图片或者画完一些图形的时候要进行清屏,然后就会出现闪屏现象,这让我们非常难受,那怎么去消除这种现象呢?这一期我会介绍双缓冲函数来消除闪屏现象。
案例1:作图时闪屏
#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
struct data
{
int x;
int y;
int step;
};
int main()
{
struct data o = { 30,200,2 };//初始化
initgraph(800, 600);
cleardevice();
while (true)//进入死循环
{
setfillcolor(RED);
solidcircle(o.x, o.y,30);//画一个无边框圆
o.x = o.x + o.step;//每一次循环画的圆圆心坐标加上速度(step)
cleardevice();
if (o.x > 800)
o.x = 30;//如果超过边框,就回到起点,再次循环
Sleep(2);//隔两毫秒秒画一个圆,连续形成动图效果
}
return 0;
}
效果如下:
QQ录屏20221223225801
从这里我们可以看出 ,每一次清屏再画圆的时候,会出现很明显的闪屏现象,这不仅让我们视觉体验极差,而且屏幕的圆虽然在运动,但却因为闪屏导致运动连续性差,动态效果差,很不美观。
案例2:贴图时闪屏
#include<graphics.h>
#include<stdio.h>
#include<Windows.h>
struct a
{
IMAGE kk;
struct a* next;
};
void name();
void background();
int main()
{
initgraph(1050, 640);
cleardevice();
background();
return 0;
}
void name()
{
settextcolor(YELLOW);//设立字体颜色
setbkmode(TRANSPARENT);//这个可以让字体背景透明
settextstyle(40, 0, "宋体");
outtextxy(0, 10, "橘右京--修罗");
settextcolor(BLUE);
setbkmode(TRANSPARENT);
settextstyle(40, 0, "华文行楷");
outtextxy(getwidth()-80, getheight()-230, "星空");
}
void background()//创建链表以及背景贴图
{
struct a* head, * tail, * p;
head = tail = NULL;
int i = 0;
char a[200] = { 0 };
IMAGE star;
loadimage(&star,"star.jpg", 100, 190);
while (i < 200)
{
p = new struct a();
sprintf(a, "D:\\图片ol\\橘右京\\Image%d.jpg", i + 1);
loadimage(&p->kk, a, getwidth(), getheight());
if (head == NULL)
head = p;
else
tail->next = p;
tail = p;
p->next = head;
i++;
}
p = head;
while (p)
{
putimage(0, 0, &p->kk);
putimage(getwidth() - 100, getheight() - 190, &star);
name();
Sleep(50);//50毫秒循环一次贴图
p = p->next;
}
}
效果如下:
QQ录屏20221223231150
很显然,里面的字体明显出现了闪动,而且那个星空图也会出现闪动(没有录得太明显),这也会使视觉效果不够美观。当我们去贴多张图片的时候闪动得更加厉害。
双缓冲解决闪屏问题
对于以上的闪屏问题,我们可以通过双缓冲去解决,这里我会详细介绍双缓冲函数的使用方法,以及相关注意事项。
组合1
void BeginBatchDraw();
void EndBatchDraw();
组合2
void BeginBatchDraw();
void FlushBatchDraw();
参数:无
返回值:void
说明:每个组合里面的两个函数实际上是以及封装好的函数,我们可以直接去使用者两个双缓冲,如果想了解更多可以看看这个http://t.csdn.cn/hco0K
这里我个人比较建议用组合2,FlushBatchDraw相对而言比较稳定一些
原理:
BeginBatchDraw 开始运行时,绘制的图形不会直接显示在屏幕上,而是存入到这个函数里面去,也就是存入到电脑的内存里面。当遇到EndBatchDraw是BeginBatchDraw 里面存入的图片内容会释放出来,显示到屏幕上,就这样一直循环,实现每一次循环的每一帧图片可以显示到屏幕上。
以案例1作为例子
#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
struct data
{
int x;
int y;
int step;
};
int main()
{
struct data o = { 30,200,2 };
initgraph(800, 600);
cleardevice();
while (true)
{
BeginBatchDraw();
cleardevice();
//魔鬼细节: 这里必须先清屏再去画图,因为BeginBatchDraw();是吧每一次作图内容存入进去
//先cleardevice();清屏,然后再去作图,最后当遇到FlushBatchDraw();或者EndBatchDraw();的时候
//就可以把帧图显示到屏幕上,如果反过来的话最后显示的是 cleardevice(); 清屏后的黑屏幕
setfillcolor(RED);
solidcircle(o.x, o.y,30);
o.x = o.x + o.step;
if (o.x > 800)
o.x = 10;
Sleep(2);
FlushBatchDraw();//这里也可以用EndBatchDraw();
}
EndBatchDraw();
return 0;
}
效果如下:
QQ录屏
很显然,在双缓冲作用下,就不会出现闪屏现象,而且每一帧图片都会显示出来,不会闪瞎设计者的眼睛,视觉效果非常好。
就介绍到这里了,谢谢大家!