博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux framebuffer ---double buffer
阅读量:4047 次
发布时间:2019-05-25

本文共 1472 字,大约阅读时间需要 4 分钟。

【什么是FrameBuffer】

FrameBuffer直译就是,帧缓冲。

Frame帧:你所看到的屏幕的图像,或者在一个窗口中的图像,就叫一帧。

Buffer缓冲:一段RAM,用来暂存图像数据,这些数据会被直接写入到显示设备。

帧缓冲就相当于介于 图形操作 和 图像输出中间的一个中间人。将程序对图形数据的处理操作,反馈到显示输出上。

显卡(显存中的数据) <-> 帧缓冲(程序对其中的数据进行处理) <-> 显示器(输出图像)

帧缓冲可用于,实现原先视频卡并不支持的分辨率。

显卡可能并不支持你当前某个更大分辨率的显示器,但是可以通过帧缓冲获取显卡的显存中的数据,处理之后,实现更大的分辨率的图像,然后将数据直接输出到显示器上。

【双显示器例子】

一个例子,可能就是双显示,最近刚刚看到实际某开发者的系统,就是两个显示器,鼠标移动超过单个显示器,到最右边的时候,就跑到另一个显示器了。对于常常用多系统或者需要打开很多东西的开发人员,这个功能很实用。

帧缓冲可以用于 页面交换page flipping(也常叫做 双缓冲double buffering),许多游戏都是采用此技术,以实现更流畅的视频输出,以便用户获得更好的游戏体验。此技术也被用于3D图形加速。

【双缓冲的主要实现原理】

假如你的显示器是VGA模式,640×400,也就是虚拟的分辨率是640X800,也就是800线(每一行的数据,称为一条线,也就是640X1 的数据了)。800线的数据存储于Framebuffer,而实际的显示内容,只是400线,Linux内核中的Framebuffer模型中,对应有个变量yoffset,就是表示的这个具体的纵坐标,默认是0,所以显示的内容就是,0-399线,由于和实际显示页面大小等同,所以此处可以简称为第一帧。如果yoffset改变了,比如此例中变为400,那就是显示剩余的部分,400-799线。此处简称为第二帧。

在系统显示第一帧的时候,系统在后台悄悄地准备第二帧的数据,所以,等第一帧显示完成,多数时候,第二帧的数据也准备好了,就可以直接显示,同时系统又在准备接下来的一帧的数据,这样就可以大大提高显示效率。

【平滑地滚动页面的实现原理】

同上,在显示完第一帧数据的时候,也就是0-399线的时候,将yoffset设置为1,就可以显示1-400线的数据了,显示完成后,再设置 yoffset为2,就显示2-401线的数据,这样,就可以一点点地,平滑地显示整个滚动画面了。其实也就是画面在垂直方向的滚动。其中yoffset 的增加,可以使用定时器,各个一段时间,比如10us,增加1,系统自动会更新显示对应的内容,这样我们所看到的内容就是滚动的画面了。

此外,Linux中的Framebuffer模型中,提供了一些ioctl功能,给定一些参数,然后系统可以实现对应的功能,其中有个参数就是FBIOPAN_DISPLAY。具体也就是类似如下调用:

ioctl (framebuffer_handler, FBIOPAN_DISPLAY, &variable_info);

而这个调用,如果显示不支持framebuffer的双缓冲的话,那么其framebuffer的缓冲大小,就是和物理上的显示器大小等同,那么对应的yoffset也就不会像双缓冲那样变化了。

也就是说,如果显卡/显示屏控制器不支持双缓冲,那么yoffset就应该一直为0,并且在运行时候,也不应该改变,也不应该去给FBIOPAN_DISPLAY的参数调用ioctl。

 

转载地址:http://bokci.baihongyu.com/

你可能感兴趣的文章
常用排序算法总结(一) 比较算法总结
查看>>
剖析 Linux hypervisor
查看>>
常用排序算法总结(二)
查看>>
基于redhat的发行版本的linux系统 下 扩展Swap分区
查看>>
Fedora下安装Fcitx
查看>>
SSH原理与运用
查看>>
libvirt LXC driver --pass-fds
查看>>
Python ::OS模块 提供的接口介绍
查看>>
Python调用shell命令的几种方法(在新进程中执行shell命令)
查看>>
shell快捷键大全
查看>>
linux 4.15.7内核fedora(Ubuntu)下编译安装
查看>>
GRV – 可视化git仓库工具
查看>>
docker 镜像构建实践pagekit CMS(docker hub/docker cloud)
查看>>
搭建Docker Registry(2) 代理+认证(doing)
查看>>
简单Gitlab服务器的搭建(Gitlab+GerRit+Jenkins)
查看>>
简单GerRit服务器的搭建(Gitlab+GerRit+Jenkins)
查看>>
简单Jenkins服务器的搭建(Gitlab+GerRit+Jenkins)
查看>>
Kubernetes入门实践
查看>>
What every programmer should know about memory (Part 1) 译
查看>>
What every programmer should know about memory (Part 2-0) 译
查看>>