首页 > 其他分享 >framebuffer帧缓存

framebuffer帧缓存

时间:2024-09-10 21:55:11浏览次数:12  
标签:缓存 颜色 int virtual vinf xres framebuffer yres

1. framebuffer

Framebuffer(帧缓冲区)是用于存储图像数据的一块内存区域。我们可以将我们想要显示的图像数据写到framebuffer中,驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据,并根据读取到的图像数据在屏幕上显示对应的图像。

2. 颜色的表示

 我们知道一幅图像其实是由一个一个的像素点组成的,诸多的不同颜色的像素最终组成了一幅图像,因此上面提到的图像数据指的就是这一幅图像中每个像素点的颜色数据。

 在美术中,将红绿蓝三种颜色称为三原色,通过将不同亮度的三元色进行组合,就可以调配出任何一种颜色。在计算机中颜色数据的表示同样利用了这个原理。在计算机中,颜色通常用 RGB(红绿蓝)模型来表示。RGB 模型将颜色描述为三个分量的组合,即红色、绿色和蓝色分量的亮度值。而根据每个分量所占的位数不同,又产生了三种不同的颜色格式,分别为:RGB888 、RGB565、RGB555。

RGB888:

RGB888 格式使用 24 位来表示一个像素的颜色信息,其中 8 位用于红色通道、8 位用于绿色通道、8 位用于蓝色通道。这意味着每个颜色通道可以有 256(2^8)种不同的亮度级别,共同组合形成一个广泛的颜色范围。

RGB565:

RGB565 格式使用 16 位来表示一个像素的颜色信息,其中 5 位用于红色通道、6 位用于绿色通道、5 位用于蓝色通道。这种格式相比 RGB888 来说更加节省存储空间,但同时牺牲了一定的颜色精度。

RGB555:

RGB555 格式也使用 16 位来表示一个像素的颜色信息,其中 5 位用于红色通道、5 位用于绿色通道、5 位用于蓝色通道。与 RGB565 相比,RGB555 在绿色通道上减少了一位,因此在绿色调性上可能会略显不足,但整体颜色表现仍比较均衡。

第(x,y)个像素点地址为 :y*(屏幕x轴最大宽度)+ x

FrameBuffer 开发流程:

1.打开设备(/dev/fd0)
2.获取显示设备相关参数(分辨率,位深度)
3.建立内存映射(映射物理显存到用户虚拟内存空间)
4.写入RGB颜色值
5.解除显存映射
6.关闭设备

void *pmem;
struct fb_var_screeninfo vinf;

int init_fb(char *devname)
{
	//1. 打开显示设备
	int fd = open(devname, O_RDWR);	
	if (-1 == fd)
	{
		perror("fail open fb");
		return -1;
	}
	
	//2、获取显示设备相关参数 分辨率 位深度
	int ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinf);
	if (-1 ==ret)
	{
		perror("fail ioctl");
		return -1;
	}
	
	printf("xres = %d, yres = %d\n", vinf.xres, vinf.yres);
	printf("xres_virtual = %d, yres_virtual = %d\n", vinf.xres_virtual, vinf.yres_virtual);
	printf("bits_per_pixel : %d\n", vinf.bits_per_pixel);

	size_t len = vinf.xres_virtual * vinf.yres_virtual * vinf.bits_per_pixel/8;
	//3, 建立显存和用户空间的映射关系
	pmem = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
	if ((void *)-1 == pmem)
	{
		perror("fail mmap");
		return -1;
	}
	

	return fd;
}

void draw_point(int x, int y, unsigned int col)
{
	if (x >= vinf.xres || y >= vinf.yres)
	{
		return ;
	}
	if (vinf.bits_per_pixel == RGB888_FMT)
	{
		unsigned int *p = pmem;
		*(p + y * vinf.xres_virtual + x) = col;
	}
	else if (vinf.bits_per_pixel == RGB565_FMT)
	{
		unsigned short *p  = pmem;	
		*(p + y * vinf.xres_virtual + x) = col;
	}
	return ;
}

void uninit_fb(int fd)
{

	size_t len = vinf.xres_virtual * vinf.yres_virtual * vinf.bits_per_pixel/8;
	munmap(pmem, len);
	close(fd);
}

标签:缓存,颜色,int,virtual,vinf,xres,framebuffer,yres
From: https://blog.csdn.net/pc202103/article/details/142109423

相关文章

  • 帧缓冲 framebuffer
    一、基本概念framebuffer:帧缓存、帧缓存(显示设备)Linux内核为显示提供的一套应用程序接口。(驱动内核支持)分辨率:像素点显示屏:800*600(横向有800个像素点,纵向有600个像素点)显卡(显存(保存像素点的值))RGB888(8个bitR,8个bitG,8个bitB)PC,4412(RGB888)RGB565(S3C2440)......
  • 解决路由缓存问题
    路由缓存问题即:当再vue3中使用带参数的路由时,随着路由跳转,组件被重新复用,不能正常执行生命周期尤其我们通常在onMounted中使用的请求的发送,那么如何解决呢1.粗暴的方法:强制替换销毁vue官方曾说,key可以强制替换一个元素或者组件,而不是复用它那么我们可以在组件中使用ke......
  • 102MB缓存的锐龙5 7600X3D性能惊人!Zen5全都败了
    9月8日消息,AMD日前发布了锐龙57600X3D,是第一款AM5平台的六核心X3D产品,依然基于Zen4架构,配备多达102MB三级缓存,包括6MB二级缓存、32MB三级缓存、64MB3D缓存,热设计功耗仅为65W。不过,它没有公开零售,而是仅限欧美部分零售商,包括美国的MicroCenter、德国的MindFactory,后续是否会开放......
  • 数据库系统 第45节 数据库缓存
    缓存是数据库系统中用于提高性能的重要技术之一。它通过减少对数据库的直接访问次数,从而减少数据检索的时间和减轻数据库服务器的负载。以下是缓存的两种主要类型及其作用:查询结果缓存(QueryResultCache):这种类型的缓存存储了数据库查询的结果集。当相同的查询再次执......
  • CPU 缓存一致性
    CPU缓存一致性参考:https://mp.weixin.qq.com/s?__biz=MzUxODAzNDg4NQ==&mid=2247486479&idx=1&sn=433a551c37a445d068ffbf8ac85f0346&scene=21#wechat_redirectCPUCache的数据写入随着时间的推移,CPU和内存的访问性能相差越来越大,于是就在CPU内部嵌入了CPUCache(高速缓......
  • 缓存雪崩问题
    缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。解决方案:1、使用锁进行控制2、对同一类型信息的key设置不同的过期时间3、缓存预热1.什么是缓存雪崩缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直......
  • Redis缓存和Mysql数据一致性问题
            在高并发环境下,保持Redis缓存和MySQL数据库的数据一致性是一个复杂但至关重要的任务。下面是对这一问题的详细讲解,并结合PHP代码示例来展示如何解决这些一致性问题。问题背景Redis缓存和MySQL数据库的主要挑战在于:缓存和数据库之间的延迟:在缓存更......
  • uniapp数据缓存和发起网络请求
    数据缓存uni.onStorageSync同步的方式将数据存储到本地缓存<template> <button@click="onStorageSync()">存储数据</button></template><scriptsetup> constonStorageSync=()=>{ //存储数据 uni.setStorageSync('username',&......
  • 如何解决缓存(redis)和数据库(MySQL)数据不一致的问题?
    在使用缓存(如Redis)和数据库(如MySQL)时,数据不一致是常见的问题。通常,我们希望缓存能够提高系统的读性能,但同时也会面临缓存与数据库数据同步的问题。解决缓存与数据库数据不一致的问题有多种方法,常见的策略包括以下几种:1.缓存更新策略常用的缓存更新策略包括缓存穿透、缓存......
  • 配置PHP的Session存储到Mysql / Redis / memcache 以及使用opcache以及apc缓存清除工
    一、配置PHP的Session存储到Mysql,Redis以及memcache等        PHP的会话默认是以文件的形式存在的,可以通过简单的配置到将Session存储到NoSQL中,即提高了访问速度,又能很好地实现会话共享!1.默认配置:session.save_handler=filessession.save_path=/tmp/2.配......