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;elsetail->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录屏
很显然,在双缓冲作用下,就不会出现闪屏现象,而且每一帧图片都会显示出来,不会闪瞎设计者的眼睛,视觉效果非常好。
就介绍到这里了,谢谢大家!
easyx图形库-----贴图技巧之双缓冲消除闪屏(BeginBatchDraw 与 EndBatchDraw)相关推荐
- easyx图形库-----贴图技巧之连续贴图
先看作品: QQ录屏20221220195006 看吧,是不是很炫!这一期我来教大家怎么去做这种视频效果. 目录 前言: 获取帧图的方法 介绍两种方法实现动图 1.数组 2.单循环链表 ...
- 运用c++与easyx图形库实现消灭星星最基本的消除功能、掉落功能以及判断死锁的方式
运用c++与easyx图形库实现消灭星星最基本的消除功能.掉落功能以及判断死锁的方式 写在前面的话 此程序只实现了游戏的小部分内容,没有华丽的外观与消除特效 消灭星星是一款前些年十分流行的手机游戏,玩 ...
- 如何用C的easyX图形库制作图形化界面菜单(财务管理系统)
这是财务管理系统的一个图形化界面主菜单 : 下面这个是查询功能的一个子菜单: 一: 菜单的实现靠的是easyX,它是针对C++的一个图形库,编译器用的是Visual C.其实VC和easyX图形库就很 ...
- Windows和Ubuntu双系统Ubuntu闪屏解决办法
双系统安装成功后,闪屏,这是因为显卡驱动的问题(我们的显示器分辨率太高了),我们可以先通过进入recovery模式,然后选择resume,然后更新显卡驱动解决这个问题,如果您有更好的方案,欢迎回复.
- easyx图形库----贴图
我们都知道图形的加载与贴出的函数是通过loadimage与putimage来实现的,如下所示: initgraph(400, 700);int a = getheight();//获取屏幕的高度int ...
- MFC基础知识(四)——双缓冲解决刷屏时闪烁
本文主要介绍:在利用MFC画图或图像显示时,有时候需要调用OnDraw()函数刷新屏幕,而屏幕往往会发生闪烁,本文主要介绍利用双缓冲解决闪屏问题. 关于闪屏方面的介绍分析见博文: http://blo ...
- EasyX图形库学习(完整版)
在此之前我们用C/C++编程面对的都是黑框框,可能会感觉很无聊.现在用easyX库可以很快的画一个房子.车子.人物等等.当然也可以基于easyX图形库来做一些我们平时玩过的游戏,比如贪吃蛇.俄罗斯方块 ...
- java闪烁_java双缓冲解决屏幕闪烁
今天做实验,发现了屏幕闪烁问题,网上找到解决方法,在此谢谢原作者 转自http://blog.sina.com.cn/s/blog_611ca6300100ezfx.html Java的强大特性让其在 ...
- EGE基础入门篇(九):双缓冲与手动渲染
EGE专栏:EGE专栏 上一篇:EGE基础入门篇(八):清屏与重绘 下一篇: 文章目录 一.双缓冲机制 1. 单缓冲绘图 1.1 单缓冲绘图的缺点 1.2 系统读取帧缓冲 2. 双缓冲绘图 2.1 双 ...
最新文章
- thinkpad e40 热键hotkey失效解决办法
- vue父子组件传值,sync语法糖
- favicon自动获取_友情链接前面自动获取并添加favicon.ico小图标
- 开发基础(字符编码、列表操作)
- 一、OpenStack架构
- 用c语言程序编写一份试卷,C语言程序设计试题
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
- SpringBoot整合(Elasticserch)
- 注解返回html页面,【提问】ajax请求返回整个html页面
- Android设计模式系列-组合模式
- win10 java环境变量
- linux windows市场占有率,Windows 10市场份额罕见倒退:Win7也跌了 Linux暴增111%
- mysql 收货地址表_会员收货地址 - 数据库设计 - 数据库表结构 - 果创云
- java 汉字转拼音(解决多音字问题)
- Axure RP9教程大全
- word 插入公式技巧
- PCI Express Capability Structure
- 一篇五分生信临床模型预测文章代码复现——Figure1 差异表达基因及预后基因筛选——火山图,Venn图,热图绘制(二)
- android中服务播放音乐,android中用Service播放音乐
- matlab 画思维图像,「4」图像思维
热门文章
- 基于PHP的学生管理系统
- 哈佛大学——差异表达分析(七)设计公式(Design formulas)
- sqliteconnection中的version一旦比先前的大,则执行onUpgrade;模仿疯狂猜图游戏;matrix设置图片比例
- 在网站上就能直接实现视频剪辑? #Runway
- 基于EasyX的三个小程序案例
- 16个超级实用的Java工具包
- 数据结构:累加和汉诺塔
- python+OpenCV笔记(三十五):特征匹配——基于FLANN的匹配、基于FLANN进行单应性匹配
- 硬件描述语言(HDL)基础——层次结构
- Cytoskeleton丨艾美捷 微管/微管蛋白体内分析生化试剂盒