Android 刷新一帧流程trace拆解

发布时间:2026/7/2 15:41:15

Android 刷新一帧流程trace拆解 和你一起终身学习这里是程序员Android其实一眼就喜欢的不是文案而是似曾相识的经历 O(∩_∩)O经典好文推荐通过阅读本文您将收获以下知识点:一、Android 显示一帧流程概览二、生产者消费者 BufferQueue 流转图三、App SF Buffer 交互图四、SF 跟 HWC 交互图一、Android 显示一帧流程概览程序员Android原图链接https://upload-images.jianshu.io/upload_images/5851256-5d802da2815c12f2.png1.1 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 流转图原图链接https://upload-images.jianshu.io/upload_images/5851256-1fd0a4018940ddd8.png2.1. dequeue(生产者发起)当生产者需要缓冲区时它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区并指定缓冲区的宽度、高度、像素格式和使用标记。2.2. queue(生产者发起)生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。2.3. acquire(消费者发起)消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容2.4. release(消费者发起)当消费者操作完成后它会通过调用 releaseBuffer() 将该缓冲区返回到队列三、App SF Buffer 交互图App SF Buffer 交互图原图链接https://upload-images.jianshu.io/upload_images/5851256-9ee4c505abf5eff3.png3.1App SF Buffer 交互流程拆解App 通过bind 向SF dequeuebuffer 进行buffer申请SF 对端完成对bufferQueue 的dequeuebuffer的申请App 处理合成完后通过binder向SF queuebuffer 申请buffer 入队。SF 对端通过queuebuffer 完成buffer 对BufferQueue的入队申请供SF消费并显示到屏幕上四、SF 跟 HWC 交互图SurfaceFlinger 接受来自多个来源的数据缓冲区对它们进行合成然后发送到显示设备。SF 送显图原图链接https://upload-images.jianshu.io/upload_images/5851256-e2998c0cd7dd4219.pngSF 跟 HWC 交互图原图链接https://upload-images.jianshu.io/upload_images/5851256-53d12f9bfef6809a.png4.1 SF 跟 HWC 交互流程vsync-sf 周期到来SF 开始绘制准备工作SF 通过 acquirebuffer 从BufferQueue 中取出一帧进行消费App 对应的BufferQueue 在SF acquirebuffer 后对那个的值会 -1App 对应的buffer 值为 2App 对应的buffer值 在SF acquirebuffer 后变为 1SF 跟HWC 通过binder 通信处理完后通过rleasebuffer将buffer 归还到BufferQueue中紧接着一帧就可以显示出来至此本篇已结束。转载网络的文章小编觉得很优秀欢迎点击阅读原文支持原创作者如有侵权恳请联系小编删除比如文章底部留言12小时内必删欢迎您的建议与指正。同时期待您的关注感谢您的阅读谢谢如果认为有点用欢迎您来点点赞❤️爱心发射 biu收到请留言

相关新闻