当前位置: 首页 > news >正文

Easyx图形库应用(直接显存操作)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        有过屏幕驱动经验的同学都知道,所谓的屏幕驱动,那就是把内存的数据,一次又一次通过vga、mipi、rgb888、hdmi这样的接口送出去。一秒之内,可以送出去多少次,那就代表了当前帧率是多少。这里面,如果我们希望及时更新图象,一般有两种方法。一种就是系统api操作,一种就是直接显存操作。

1、更新单个像素

        在easyx库下面,就有这样的函数putpixel。如果我们希望操作某一个像素的时候,就可以通过putpixel函数来操作具体的像素值。这里,我们可以写一个小的demo程序,

#undef UNICODE
#include <graphics.h>
#include <math.h>
#include <conio.h>int main(int argc, char* argv[])
{int w = 640;int h = 480;DWORD* buf = NULL;initgraph(w, h);BeginBatchDraw();buf = GetImageBuffer(); // get basic address of image bufferdouble t = 0.0;while (!_kbhit()){for (int y = 0; y < h; y++){for (int x = 0; x < w; x++){double dx = x - w / 2.0;double dy = y - h / 2.0;double r = sqrt(dx * dx + dy * dy);double v = sin(r / 10.0 - t) * 0.5 + 0.5;int R = (int)(v * 255);int G = (int)((1 - v) * 255);int B = (int)(128 + 127 * sin(t + r / 20.0));putpixel(x, y, RGB(B, G, R));}}FlushBatchDraw();Sleep(20);t += 0.2;}EndBatchDraw();closegraph();return 0;
}

2、效果分析

        但是等程序写好后,我们却发现程序运行起来的时候,非常卡顿。经过分析,终于找到了原因。原因就是这里的putpixel。分析发现,如果是调用putpixel函数,那么相当于每次都需要经过system call,最终调用os api才能刷新像素值。这样做,虽然比较简单,但是非常浪费时间。

3、直接操作缓存

        和putpixel相比较,另外一种更高效的办法,就是操作缓存。所谓的操作缓存,就是直接修改内存里面的数值。这个内存,就是下一次系统要swap过来,刷新的内存。修改以后呢,并不着急调用系统api,刷新界面,而是等所有的数据都ok之后,再一起刷新界面。这样刷新的效率,无疑会高很多。

#undef UNICODE
#include <graphics.h>
#include <math.h>
#include <conio.h>int main(int argc, char* argv[])
{int w = 640;int h = 480;DWORD* buf = NULL;initgraph(w, h);BeginBatchDraw();buf = GetImageBuffer(); // get basic address of image bufferdouble t = 0.0;while (!_kbhit()){for (int y = 0; y < h; y++){for (int x = 0; x < w; x++){double dx = x - w / 2.0;double dy = y - h / 2.0;double r = sqrt(dx * dx + dy * dy);double v = sin(r / 10.0 - t) * 0.5 + 0.5;int R = (int)(v * 255);int G = (int)((1 - v) * 255);int B = (int)(128 + 127 * sin(t + r / 20.0));buf[y * w + x] = RGB(R, G, B);}}FlushBatchDraw();Sleep(20);t += 0.2;}EndBatchDraw();closegraph();return 0;
}

        所以,这里通过GetImageBuffer获取显存首地址,直接操作像素的方法,其实是非常重要的一个措施。大家可以好好练习一下。

http://www.dtcms.com/a/537293.html

相关文章:

  • 网站翻书效果网站建设费用 会计分录
  • Langchain从零开始到应用落地案例[AI智能助手]【4】---优化ocr识别编写,实现按文件类型进行调用识别
  • 如何添加网站logo天津网站定制公司
  • 做网站需要规划哪些内容南宁网站seo大概多少钱
  • 第15天:网络基础与故障排除
  • confluence or 语雀 or sward,知识管理工具一文全方位对比
  • 易语言中函数参数“参考”的基本概念
  • 阿里巴巴国际站的前台网址是西安美食网页设计
  • 制作网站需要怎么做苏州注册公司流程和步骤
  • 云栖实录 | 驰骋在数据洪流上:Flink+Hologres驱动零跑科技实时计算的应用与实践
  • 基层建设是哪个网站的工作总结及工作计划
  • 网站开发学习网站ui设计怎么自学
  • 整站优化工具wordpress joonla安全
  • 在Linux下循环创建N个子进程的实现与解析
  • Spring AI Alibaba 基于JWT的鉴权登录系统实现详解
  • 软件测试(五)--自动化测试Selenium(一)
  • 网站项目开发网站菜单导航制作教程
  • 兰州最好的网站建设公司青岛网站优化排名
  • 某汽车公司4S店携手Acrel-5000建筑能耗管理系统,实现连锁门店能源精细化管理新突破
  • LeetCode 刷题【135. 分发糖果】
  • 专业做网站建设的网站内页产品 首页推荐
  • TCP 流通信中的 EOFException 与 JSON 半包问题解析
  • Garnet技术深度解析:微软研究院出品的高性能缓存存储引擎
  • 如何制作论坛网站网页制作软件是哪个
  • 《从点击到响应:HTTP 请求是如何传出去的》
  • 科技+文化:从“参观游览”到“沉浸共生”的文旅产业革命
  • 做条形图的网站河南郑州网站建设
  • 青少儿机器人技术学什么?
  • 基本魔法语言数组 (一) (C语言)
  • php源码网站修改保定建设厅网站