Framebuffer,也叫帧缓冲,其内容对应于屏幕上的界面显示,可以将其简单理解为屏幕上显示内容对应的缓存,修改Framebuffer中的内容,即表示修改屏幕上的内容,所以,直接操作Framebuffer可以直接从显示器上观察到效果。
但Framebuffer并不是屏幕内容的直接的像素表示。Framebuffer实际上包含了几个不同作用的缓存,比如颜色缓存、深度缓存等,具体不详细说明。大家只需要知道,这几个缓存的共同作用下,形成了最终在屏幕上显示的图像。
Framebuffer本质上是一段内存,哦,不对,是一段显存,哦,好像还是不对。
其实,Framebuffer就是一段存储空间,其可以位于显存,也可以位于内存。
Framebuffer是一个逻辑上的概念,并非在显存或者是内存上有一块固定的物理区域叫Framebuffer。实际上,物理是显存或者内存,只要是在GPU能够访问的空间范围内(GPU的物理地址空间),任意分配一段内存(或显存),都可以作为Framebuffer使用,只需要在分配后将该内存区域信息,设置到显卡相关的寄存器中即可。这个其实跟DMA区域的概念是类似的。
如何使用Framebuffer?
================
如前面所说,Framebuffer是可以位于显存或内存上分配的任意内存,从驱动的角度说,这块内存对应于bo(buffer object),使用具体驱动提供的接口进行分配,分配时可以通过参数指定从内存(GTT)或显存(VRAM)上分配,分配后,直接修改显卡相关的寄存器配置即可。
具体来说,就是在分配缓存后,使用drm驱动提供的接口设置,以raedon驱动为例,分配的缓存对应于radeon_bo结构,代码示例为:
struct radeon_bo *buffer_object;
…
buffer_object = radeon_bo_open (driver->manager, 0,
height * *row_stride,
0, RADEON_GEM_DOMAIN_GTT, 0);
…
if (drmModeAddFB (driver->device_fd, width, height,
24, 32, *row_stride, buffer_object->handle,
&buffer_id) != 0)
{
ply_trace (“Could not set up GEM object as frame buffer: %m”);
radeon_bo_unref (buffer_object);
return 0;
}
…
调用的两个关键接口:
-
radeon_bo_open:分配缓存,本例中指定了从内存(GTT)中分配
-
drmModeAddFB:设置Framebuffer,具体由底层drm驱动实现,这里不讨论
GTT VS. VRAM
============
这两个名词不知大家是否听说过,其实很简单,GTT就是在内存(主存)上分配的内存区域,VRAM即在显存上分配的内存区域,这里不聊名词的来源和意义,只简单聊一下使用GTT和使用VRAM的底层处理逻辑的区别。
使用GTT
当使用GTT时,将图像显示到显示器上的大致逻辑是这样的:
-
在内存中分配一块缓存区域(作为Framebuffer)
-
将需要绘制的图形对应的数据拷贝到这块内存区域,当然,这个拷贝操作显然是由CPU负责的,即消耗的是CPU,GPU完全不参与。
-
GPU将Framebuffer中内容显示到显示器上(swapBuffer)。这个操作是由GPU负责的,消耗的是GPU,CPU基本不参与。这个过程显然有个数据搬移(可以理解为拷贝)的操作,毕竟搬移之前,数据还在内存中,是不可能直接显示到显示器上的。这个过程可以理解为一次DMA操作。
这个过程可以看出,如果使用GTT在做Framebuffer,存在“两次”数据拷贝操作:
1.将数据拷贝到Framebuffer中
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/8ef1af8f50317ad952dabf10857633fd.jpeg)
最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
器!
[外链图片转存中…(img-bRvda5r9-1712220793745)]