easyx图形库 您所在的位置:网站首页 一加6闪屏问题怎么办 easyx图形库

easyx图形库

2024-07-10 02:35| 来源: 网络整理| 查看: 265

目录

 前言:

   案例1:作图时闪屏

案例2:贴图时闪屏

双缓冲解决闪屏问题

 原理:

 前言:

        学了easyx图形库的朋友们都知道,我们可以在easyx图形库上面画出连续运动的图片,或者通过贴图的方式把每一帧图片连起来达到动态效果,但是我们每次贴完图片或者画完一些图形的时候要进行清屏,然后就会出现闪屏现象,这让我们非常难受,那怎么去消除这种现象呢?这一期我会介绍双缓冲函数来消除闪屏现象。

   案例1:作图时闪屏 #include #include #include 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 #include #include 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 #include #include 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录屏

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有