easyx图形库-----贴图技巧之双缓冲消除闪屏(BeginBatchDraw 与 EndBatchDraw)

目录

 前言:

   案例1:作图时闪屏

案例2:贴图时闪屏

双缓冲解决闪屏问题

 原理:


 前言:

        学了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 开始运行时,绘制的图形不会直接显示在屏幕上,而是存入到这个函数里面去,也就是存入到电脑的内存里面。当遇到EndBatchDrawBeginBatchDraw 里面存入的图片内容会释放出来,显示到屏幕上,就这样一直循环,实现每一次循环的每一帧图片可以显示到屏幕上。

以案例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录屏

很显然,在双缓冲作用下,就不会出现闪屏现象,而且每一帧图片都会显示出来,不会闪瞎设计者的眼睛,视觉效果非常好。

就介绍到这里了,谢谢大家!

  • 30
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值