目录

前言:

案例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 开始运行时,绘制的图形不会直接显示在屏幕上,而是存入到这个函数里面去,也就是存入到电脑的内存里面。当遇到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录屏

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

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

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

  1. easyx图形库-----贴图技巧之连续贴图

            先看作品: QQ录屏20221220195006 看吧,是不是很炫!这一期我来教大家怎么去做这种视频效果. 目录 前言: 获取帧图的方法 介绍两种方法实现动图 1.数组 2.单循环链表 ...

  2. 运用c++与easyx图形库实现消灭星星最基本的消除功能、掉落功能以及判断死锁的方式

    运用c++与easyx图形库实现消灭星星最基本的消除功能.掉落功能以及判断死锁的方式 写在前面的话 此程序只实现了游戏的小部分内容,没有华丽的外观与消除特效 消灭星星是一款前些年十分流行的手机游戏,玩 ...

  3. 如何用C的easyX图形库制作图形化界面菜单(财务管理系统)

    这是财务管理系统的一个图形化界面主菜单 : 下面这个是查询功能的一个子菜单: 一: 菜单的实现靠的是easyX,它是针对C++的一个图形库,编译器用的是Visual C.其实VC和easyX图形库就很 ...

  4. Windows和Ubuntu双系统Ubuntu闪屏解决办法

    双系统安装成功后,闪屏,这是因为显卡驱动的问题(我们的显示器分辨率太高了),我们可以先通过进入recovery模式,然后选择resume,然后更新显卡驱动解决这个问题,如果您有更好的方案,欢迎回复.

  5. easyx图形库----贴图

    我们都知道图形的加载与贴出的函数是通过loadimage与putimage来实现的,如下所示: initgraph(400, 700);int a = getheight();//获取屏幕的高度int ...

  6. MFC基础知识(四)——双缓冲解决刷屏时闪烁

    本文主要介绍:在利用MFC画图或图像显示时,有时候需要调用OnDraw()函数刷新屏幕,而屏幕往往会发生闪烁,本文主要介绍利用双缓冲解决闪屏问题. 关于闪屏方面的介绍分析见博文: http://blo ...

  7. EasyX图形库学习(完整版)

    在此之前我们用C/C++编程面对的都是黑框框,可能会感觉很无聊.现在用easyX库可以很快的画一个房子.车子.人物等等.当然也可以基于easyX图形库来做一些我们平时玩过的游戏,比如贪吃蛇.俄罗斯方块 ...

  8. java闪烁_java双缓冲解决屏幕闪烁

    今天做实验,发现了屏幕闪烁问题,网上找到解决方法,在此谢谢原作者 转自http://blog.sina.com.cn/s/blog_611ca6300100ezfx.html Java的强大特性让其在 ...

  9. EGE基础入门篇(九):双缓冲与手动渲染

    EGE专栏:EGE专栏 上一篇:EGE基础入门篇(八):清屏与重绘 下一篇: 文章目录 一.双缓冲机制 1. 单缓冲绘图 1.1 单缓冲绘图的缺点 1.2 系统读取帧缓冲 2. 双缓冲绘图 2.1 双 ...

最新文章

  1. thinkpad e40 热键hotkey失效解决办法
  2. vue父子组件传值,sync语法糖
  3. favicon自动获取_友情链接前面自动获取并添加favicon.ico小图标
  4. 开发基础(字符编码、列表操作)
  5. 一、OpenStack架构
  6. 用c语言程序编写一份试卷,C语言程序设计试题
  7. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
  8. SpringBoot整合(Elasticserch)
  9. 注解返回html页面,【提问】ajax请求返回整个html页面
  10. Android设计模式系列-组合模式
  11. win10 java环境变量
  12. linux windows市场占有率,Windows 10市场份额罕见倒退:Win7也跌了 Linux暴增111%
  13. mysql 收货地址表_会员收货地址 - 数据库设计 - 数据库表结构 - 果创云
  14. java 汉字转拼音(解决多音字问题)
  15. Axure RP9教程大全
  16. word 插入公式技巧
  17. PCI Express Capability Structure
  18. 一篇五分生信临床模型预测文章代码复现——Figure1 差异表达基因及预后基因筛选——火山图,Venn图,热图绘制(二)
  19. android中服务播放音乐,android中用Service播放音乐
  20. matlab 画思维图像,「4」图像思维

热门文章

  1. 基于PHP的学生管理系统
  2. 哈佛大学——差异表达分析(七)设计公式(Design formulas)
  3. sqliteconnection中的version一旦比先前的大,则执行onUpgrade;模仿疯狂猜图游戏;matrix设置图片比例
  4. 在网站上就能直接实现视频剪辑? #Runway
  5. 基于EasyX的三个小程序案例
  6. 16个超级实用的Java工具包
  7. 数据结构:累加和汉诺塔
  8. python+OpenCV笔记(三十五):特征匹配——基于FLANN的匹配、基于FLANN进行单应性匹配
  9. 硬件描述语言(HDL)基础——层次结构
  10. Cytoskeleton丨艾美捷 微管/微管蛋白体内分析生化试剂盒