手机显示一帧的流程是如何实现?
和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、显示一帧流程概览
二、生产者,消费者 BufferQueue 流转图
三、App ,SF Buffer 交互图
四、SF 跟 HWC 交互图
一、显示一帧流程概览
显示一帧流程概览
Android 显示一帧大致分为下面 八步:
App 接收到 vsync-app 信号后开始工作。
App 主线程被Message唤醒,执行onVsync。
App 执行 doFrame ,处理input、animation、traversal、draw等。
App UIThread 跟RenderThread sync 数据。
App 执行DrawFrame,从SurfaceFlinger(后续简称SF) 的 BufferQueue 中 Dequeue buffer,取出一个bufffer后,执行渲染绘制,接着将绘制好的Buffer 通过queuebuffer 放回到。BufferQueue中给 SF消费。
App queuebuffer 后, SF 中对应的 app buffer 会增加 +1。
Vsync-sf 到来后,SF 从BufferQueue 中 acquireBuffer一个Buffer 进行消费, 对应SF 中的 app buffer 会减 - 1 , SF 消费处理后,通过 releaseBuffer 将buffer 归还到BufferQueue 中。
SF 通过 bind 跟 Hardware Composer HAL(简称HWC) 进行通信,通过一些处理后显示到手机屏幕上。
二、生产者,消费者 BufferQueue 流转图
生产者,消费者 BufferQueue 流转图
dequeue(生产者发起) :
当生产者需要缓冲区时,它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和使用标记。queue(生产者发起):
生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。acquire(消费者发起) :
消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容release(消费者发起) :
当消费者操作完成后,它会通过调用 releaseBuffer() 将该缓冲区返回到队列
三、App ,SF Buffer 交互图
App ,SF Buffer 交互图
App 通过bind 向SF dequeuebuffer 进行buffer申请
SF 对端完成对bufferQueue 的dequeuebuffer的申请
App 处理合成完后,通过binder向SF queuebuffer 申请buffer 入队。
SF 对端通过queuebuffer 完成buffer 对BufferQueue的入队申请,供SF消费并显示到屏幕上
四、SF 跟 HWC 交互图
SurfaceFlinger 接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备。
SF 送显图
SF 跟 HWC 交互图
vsync-sf 周期到来,SF 开始绘制准备工作
SF 通过 acquirebuffer 从BufferQueue 中取出一帧进行消费
App 对应的BufferQueue 在SF acquirebuffer 后对那个的值会 -1
App 对应的buffer 值为 2
App 对应的buffer值 在SF acquirebuffer 后变为 1
SF 跟HWC 通过binder 通信处理完后,通过rleasebuffer将buffer 归还到BufferQueue中,紧接着一帧就可以显示出来
友情推荐:
Android 开发干货集锦
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
点击阅读原文,为大佬点赞!
手机显示一帧的流程是如何实现?相关推荐
- h5 video 手机 显示第一帧_【图像处理二】HDMI显示(一)
引言 做图像处理没有显示怎么能行,所以用两章来介绍HDMI的协议以及编码实现.HDMI的编码,仿真和调试会花费较长时间,特别是第一次在windows环境下部署UVM环境,对于刚刚入门UVM的我来说,这 ...
- h5 video 手机 显示第一帧_解决h5嵌入app后video标签poster不能显示视频第一帧(表现为空白)...
这里我们先来描述一下问题,页面中使用了video标签,按照video标签的官方介绍下图介绍: 没有设置poster的情况下在浏览器中我们可以看到视频的第一帧,页面效果如下图左图所示:但是嵌入App后, ...
- 天籁obd接口针脚定义_典藏 | OBD接口位置大全及部分常用手机型号语音播报设置流程...
OBD接口的位置 OBD接口的位置一般都在方向盘下方的内饰板中,靠近驾驶员膝盖附近的地方,不同车型的位置稍有区别,但基本位置都差不多. OBD接口统一采用梯形的16针DLC形式接插件,梯形接口是防误插 ...
- 51定时中断系统控制LED点阵屏显示逐帧动画
写在前面 最近回头看之前写的文章感到一种很浓的公式感,我确实是提前写好了模板每次都套用,整篇看下来感觉就像是在交老师布置的实验报告,看起来很成熟但实际上背离了自己的初衷,接下来我会尽可能的复现自己在做 ...
- 手机经常提示找不到服务器,为什么我的手机显示无法连接到服务器
lujb31612级分类:其他被浏览3227次2014.10.13 yaorong319 采纳率:50%6级2014.10.14 您好: 若手机显示已连接无线网络,但是依然无法上网,建议您: 1.把手 ...
- LED显示驱动(二):显示驱动FPGA验证流程与注意细节
显示驱动FPGA验证流程与注意细节 验证流程 : ...
- android系统方法裁剪图片 华为手机显示为圆
在android调用系统方法对图片进行裁剪时,华为手机显示的图形会变成圆形,改为aspectX和aspectY不是1;1就好 if(android.os.Build.MODEL.contains(&q ...
- 裁剪图片 华为手机显示为圆
在android调用系统方法对图片进行裁剪时,华为手机显示的图形会变成圆形,改为aspectX和aspectY不是1;1就好 if(android.os.Build.MODEL.contains(&q ...
- [Unity][插件]游戏中显示FPS帧数
在Unity 的Asset Store 商店中搜索 FPS.这些插件用于显示 FPS帧数 FPS Counter,FPS Label,Fps Graph Analyzer
- 手机显示仅限紧急呼叫 无服务 以及无信号的解决教程
手机显示仅限紧急呼叫 无服务 以及无信号的解决教程MTK,这个教程限于MTK类型的手机,手机显示无服务或显示"紧急呼叫",这两种情况是有区别的,如果是无服务,表示没有接收信号,先写 ...
最新文章
- .classpath文件
- springboot源码 红色J_通达信副图指标源码之,出手就赢
- 2022年美国大学生数学建模竞赛O奖流程图
- 微信公众平台两种消息处理流程对比
- python中forward_符合python风格的对象
- MMC无法创建管理单元
- 实现线段切割法_漫画:如何实现抢红包算法?
- linux 用户、群组及权限操作
- DAO层、ENTITY层、SERVICE层、CONTROLLER层
- 手写邮箱获取验证码注册登录功能
- 如何在小数点前补0,new DecimalFormat(##0.00);
- 数字权限管理(DRM)技术
- 全球第一开源ERP Odoo操作手册 数据库自动备份
- matlab NORM函数
- myeclipse创建web-project没有WebRoot文件夹
- 水滴动态IP:自动换IP软件哪个好用?换IP的原理是什
- D3 二维图表的绘制系列(二十三)旭日图
- 今天开始正式认认真真学习Python,以上!
- 常见的IM开源服务器
- 局域网、网段、子网的区别
热门文章
- Shel编程之条件语句 条件 if ,case语句
- OC中的分类与类扩展
- 课堂作业:评估手机输入法——讯飞
- NTFS,exFAT,FAT32最详细的评测
- C++/C输出素数,满某个数就换行
- background-color:transparent
- 当web应用包含了websocket长连接,如何在web应用前加一层nginx转发
- 数竞党必看!数学竞赛权威赛事大合集,先马后看
- apache网站漏洞修复解决办法
- AI后门检测论文翻译:Universal Litmus Patterns: Revealing Backdoor Attacks in CNNs