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

帧缓冲 framebuffer

时间:2024-09-10 21:51:22浏览次数:3  
标签:int 缓冲 vinf col y1 y0 framebuffer x0

一、基本概念

framebuffer: 帧缓存、帧缓存(显示设备)

Linux内核为显示提供的一套应用程序接口。(驱动内核支持)

分辨率:

像素点

显示屏:800 * 600(横向有800个像素点,纵向有600个像素点)

显卡(显存(保存像素点的值))

RGB

888(8个bitR,8个bit G,8个bit B)

PC ,4412(RGB888)

RGB565(S3C2440)

为了提高代码的书写效率(将RGB扩充到4字节)

二、解决显存空间不能直接被用户访问

根据显存的大小的多少,来申请空间

1、打开显示设备(/dev/fb0)

2、获取显示设备相关参数(分辨率、位深度......)

3、建立内存映射

4、写入RGB颜色值

5、解除映射

6、关闭显示设备

三、framebuffer常问话术

framebuff(是什么,具体原理、怎么做、)

是什么:Linux内核为显示提供的一套应用程序接口。(驱动内核支持)

具体原理:通过内存映射技术向显存空间写入RGB值

1、打开显示设备(/dev/fb0)

2、获取显示设备相关参数(分辨率、位深度......)

3、建立内存映射

4、写入RGB颜色值

5、解除映射

6、关闭显示设备

四、常见画图操作

1、画一个点

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;

    }
}

2、画一条竖线,横线,斜线

void draw_line(int x0,int y0,int x1,int y1,unsigned int col)
{
    if(x0 >= vinf.xres|| y0 >= vinf.yres|| x1 >= vinf.xres || y1 >= vinf.yres)
    {
        return;
    }
    if(vinf.bits_per_pixel == RGB888_FMT)
    {
        int xmax = x0 > x1 ? x0 : x1;
        int xmin = x0 < x1 ? x0 : x1;
        if(x0 == x1)
        {
            int ymax = y0 > y1 ? y0 : y1;
            int ymin = y0 < y1 ? y0 : y1;
            for(int y = ymin;y < ymax;++y)
            {
                draw_point(x0,y,col);
            }
        }
        else if(y0 == y1)
        {
            for(int x = xmin;x < xmax;++x)
            {
                draw_point(x,y0,col);
            }
        }
        else
        {
            for(int x = xmin;x < xmax;++x)
            {
                int y = (y1 - y0)/(x1 - x0) * (x - x0) + y0;
                draw_point(x,y,col);

            }
        }
    }
    
}

3、画一个圆

void draw_circle(int x,int y,int r,unsigned int col)
{
    int xc = 0;
    int yc = r;
    int p = 3 - 2 * r;
    while(xc <= yc)
    {
        draw_point(x + xc ,y+yc,col);
        draw_point(x - xc ,y+yc,col);
        draw_point(x + xc ,y-yc,col);
        draw_point(x - xc ,y-yc,col);
        draw_point(x + yc ,y+xc,col);
        draw_point(x - yc ,y-xc,col);
        draw_point(x + yc ,y-xc,col);
        draw_point(x - yc ,y-xc,col);
        xc++;

        if(p < 0)
        {
            p += 4 *xc + 6;
        }
        else
        {
            yc--;
            p += 4 *(xc - yc) + 10;
        }

    }
}

4、画一个矩形

void draw_rectangle(int x,int y,int x0,int y0,unsigned int col)
{
    if(x >= vinf.xres || y>= vinf.yres)
    {
        return;
    }
    for(int i = x;i <= x0;++i)
    {
        draw_point(i,y,col);
    }
    for(int i = x;i <= x0;++i)
    {
        draw_point(i,y0,col);
    }
    for(int i = y;i <= y0;++i)
    {
        draw_point(x,i,col);
    }
    for(int i = y;i < y0;++i)
    {
        draw_point(x0,i,col);
    }

       
}

5、清屏

void clear_watch(unsigned int col)
{
    int i = 0;
    int j = 0;
    for(i = 0;i < vinf.xres;++i)
    {
        for(j = 0;j < vinf.yres;++j)
        {
            draw_point(i,j,col);
        }
    }
}

标签:int,缓冲,vinf,col,y1,y0,framebuffer,x0
From: https://blog.csdn.net/weixin_63722559/article/details/142110177

相关文章

  • Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点SurfaceView是Android平台上用于高效渲染图形的视图控件。它将内容绘制在一个独立的Surface上,可以直接由渲染线程访问,从而提高性能,尤其是在需要频繁刷新和更新......
  • 复用优化:缓冲(Buffer)+缓存(Cache)
    在写代码的时候,你会发现有很多重复的代码可以提取出来,做成公共的方法。这样,在下次用的时候,就不用再费劲写一遍了。这种思想就是复用。上面的描述是编码逻辑上的优化,对于数据存取来说,有同样的复用情况。无论是在生活中还是编码中,重复的事情一直在发生,如果没有复用,工作和生活就......
  • 缓冲区的奥秘:解析数据交错的魔法6
    在计算机科学的广袤世界里,有一项看似简单却又深奥无比的技术,那就是缓冲。缓冲,像是隐藏在代码背后的魔法,它默默地改变着数据的流动,使得看似杂乱无章的操作变得井然有序。然而,它的本质并非只是简单的数据暂存,而是一种艺术,一门科学。一、理解缓存区的好处(一)直观性的理解在Java......
  • 两个月冲刺软考——概念+求已知内存按字节编址从(A)…到(B)…的存储容量+求采用单/双
    1.四个周期的区别与联系时钟周期:也称为CPU周期或机器周期,是CPU操作的基本时间单位。指令周期:是指CPU执行一条指令所需的全部时间。一个指令周期通常由多个时钟周期组成,因为执行一条指令可能需要多个步骤,如取指令、译码、执行、访存和写回等。总线周期:总线周期是数据在计算机......
  • File类,递归,字符集,IO流(字节流,字符流,缓冲流,转换流,转换流,序列化流,释放资源的方式)
    目录一、File类二、递归三、字符集四、IO流1.概述2.字节流3.字符流4.缓冲流5.转换流6.打印流7.数据流8.序列化流9.释放资源的方式一、File类File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。注意:File类只能对文件本身进行操......
  • 正点原子Linux Framebuffer编程:解决示例程序在开发板上LCD显示错位和颜色异常
    正点原子LinuxFramebuffer编程:解决示例程序在开发板上运行7寸LCD显示错位和颜色异常作者在学习【正点原子】I.MX6U嵌入式LinuxC应用编程指南V1.4时,发现其配套的程序在开发板上运行不正常。使用的硬件版本:正点原子I.MX6UALPHAV2.4版本底板,LCD:正点原子7寸1024*600,型号ATK-MD0......
  • IO流:缓冲流
    字节缓冲流简介缓冲流是对原原始流进行包装,提高原始流读写数据的性能。提供8KB输入输出缓冲区。 用法publicclassBufferedInputStreamTest1{publicstaticvoidmain(String[]args){try{//1.定义一个字节缓冲输入流包裹原始的字节输入流......
  • C++ 快速输入的优化与缓冲区管理(竞赛必用)
    在编程竞赛和性能敏感的场景中,数据输入的效率往往直接影响到程序的运行速度。为了优化输入操作,我们可以通过手动设定缓冲区的方式来提升输入的速度。本文将详细介绍两种不同的快速输入方案:手动设定缓冲区大小的方案与系统默认缓冲区大小的方案,并结合二进制位数与可表示数据范围......
  • Java核心API——io类缓冲流
    在前面的学习中我们学习了如何向文件中简单的传输写入数据java将流分为两类节点流与处理流节点流:又称为低级流,特点:实际连接程序与另一端的"管道",负责实际读写数据的流.IO一定是建立在某个低级流的基础上进行的.文件流就是低级流,它们是实际连接程序与文件的管道,负责......
  • JAVA基础:缓冲流
    目录前言创建缓冲流缓冲流的特点前言之前我们在使用输入流读取文件时每读一次文件就会通过输入流向程序中加载一次数据,使用输出流时,每次都要向硬盘中写入数据,如果我们读取数据的次数特别频繁就会影响性能,这种时候我们就要考虑能不能将这些数据存到一个缓冲区,当这个缓冲......