Android Graphics 显示系统 - BufferQueue的状态监测

news2024/11/23 22:16:00

“ BufferQueue作为连接生产者和消费者的桥梁,时刻掌握队列中每一块Buffer的状态,对于解决一些卡死卡顿问题很有帮助,辨别是否有生产者或消费者长期持有大量Buffer不放导致运行不畅的情况。

01

前言

在Android系统中,应用UI的显示、播放器解码后画面的显示、Camera预览画面的显示最终都是要送到Graphics系统的流程完成最终的合成送显,所以在出现画面卡顿卡死问题时Graphics系统往往成为"背锅侠"。

因此,我们要学会如何快速精准地理清问题(甩锅)。

最近遇到一些播放相关的问题:

player的小伙伴认为是decode时dequeue不出新的buffer导致解码流程卡住;

graphics的小伙伴认为是decoder长期持有大量的buffer,导致显示合成卡住;

那有没有办法可以实时监测下当前BufferQueue的状态呢?我简单研究了下,有点发现,但未必完美,在此分享下供大家讨论!

建议小伙伴们先阅读下早前BufferQueue的讲解文章:

Android Graphics 显示系统 - BufferQueue的工作流程(十二)

Android Graphics 显示系统 - BufferQueue的工作流程(十三)

Android Graphics 显示系统 - BufferQueue的工作流程(十四)

Android Graphics 显示系统 - BufferQueue的工作流程(十五)

在正常的显示流程中,每一块buffer的状态会进行转换

FREE -> DEQUEUED -> QUEUED -> ACQUIRED -> FREE

图片

监测下当前BufferQueue的状态,目标就是获取当下队列中分配了多少了块Buffer?以及每一块Buffer所处的状态是什么?

02

演示效果

使用原生gallery3d app播放视频时,抓到的BufferQueue的状态信息

06-22 10:14:04.297  3400  3427 E BufferQueue: State: [SurfaceView[com.android.gallery3d/com.android.gallery3d.app.MovieActivity]#11(BLAST Consumer)11]
06-22 10:14:04.297  3400  3427 E BufferQueue: - BufferQueue mMaxAcquiredBufferCount=1 mMaxDequeuedBufferCount=15
06-22 10:14:04.297  3400  3427 E BufferQueue:   mDequeueBufferCannotBlock=0 mAsyncMode=0
06-22 10:14:04.297  3400  3427 E BufferQueue:   mQueueBufferCanDrop=0 mLegacyBufferDrop=1
06-22 10:14:04.297  3400  3427 E BufferQueue:   default-size=[720x1280] default-format=4   transform-hint=00 frame-counter=84
06-22 10:14:04.297  3400  3427 E BufferQueue:   mTransformHintInUse=00 mAutoPrerotation=0
06-22 10:14:04.297  3400  3427 E BufferQueue: FIFO(1):
06-22 10:14:04.297  3400  3427 E BufferQueue: (mConsumerName=SurfaceView[com.android.gallery3d/com.android.gallery3d.app.MovieActivity]#11(BLAST Consumer)11, mConnectedApi=3, mConsumerUsageBits=2304, mId=d480000000b, producer=[532:???], consumer=[3400:com.android.gallery3d])
06-22 10:14:04.297  3400  3427 E BufferQueue:   15:0x7756e78afd10 crop=[0,0,720,1280] xform=0x00 time=1049.6518 scale=SCALE_TO_WINDOW
06-22 10:14:04.297  3400  3427 E BufferQueue: Slots:
06-22 10:14:04.297  3400  3427 E BufferQueue:   [00:0x7756e78ad490] state=DEQUEUED 0x7756278c19d0 frame=75 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [01:0x7756e78c2190] state=DEQUEUED 0x7756278d0230 frame=71 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [02:0x7756e78bf010] state=DEQUEUED 0x7756278c5de0 frame=74 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [03:0x7756e78c2df0] state=DEQUEUED 0x7756278c4680 frame=80 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [04:0x7756e78b0df0] state=DEQUEUED 0x7756278d02e0 frame=70 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [05:0x7756e78c4e90] state=DEQUEUED 0x7756278cf310 frame=72 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [06:0x7756e78b82f0] state=DEQUEUED 0x7756278d7030 frame=73 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [07:0x7756e78c10b0] state=DEQUEUED 0x7756278d6e20 frame=76 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [08:0x7756e78c7950] state=DEQUEUED 0x7756278cfcb0 frame=77 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [09:0x7756e78c61b0] state=DEQUEUED 0x7756278d4f30 frame=78 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [10:0x7756e78bf910] state=DEQUEUED 0x7756278d5980 frame=79 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:  >[11:0x7756e78af890] state=ACQUIRED 0x7756278c6570 frame=81 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [13:0x7756e78b7d50] state=DEQUEUED 0x7756278c94e0 frame=67 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:  >[14:0x7756e78c22b0] state=ACQUIRED 0x7756278c54f0 frame=83 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [15:0x7756e78afd10] state=QUEUED   0x7756278c9590 frame=84 [ 768x1280: 768,32315659]
06-22 10:14:04.297  3400  3427 E BufferQueue:   [12:0x7756e78ad370] state=FREE     0x7756278d7b30 frame=82 [ 768x1280: 768,32315659]

可以看到:

  • 一共分配了16块buffer;

  • 2块buffer处于ACQUIRED状态,说明已被消费者拿去准备合成显示了;

  • 1块buffer处于QUEUED状态,说明生产者已经queueBuffer返还了;

  • 1块buffer处于FREE状态;

  • 12块buffer处于DEQUEUED状态,说明生产者dequeueBuffer准备填充数据;

  • 还可以看到每一块buffer的width/height/stride/format 

  • frame=xx,代表了该buffer被queueBuffer的顺序,即为BufferSlot中的

        // mFrameNumber is the number of the queued frame for this slot.  This
        // is used to dequeue buffers in LRU order (useful because buffers
        // may be released before their release fence is signaled).
        uint64_t mFrameNumber;
    
  • 另外还有BufferQueue的配置信息;

使用原生gallery3d app展示图片时,抓到的BufferQueue的状态信息

06-22 11:24:40.224  3400  9472 E BufferQueue: State: [SurfaceView[com.android.gallery3d/com.android.gallery3d.app.GalleryActivity]#29(BLAST Consumer)29]
06-22 11:24:40.224  3400  9472 E BufferQueue: - BufferQueue mMaxAcquiredBufferCount=1 mMaxDequeuedBufferCount=2
06-22 11:24:40.224  3400  9472 E BufferQueue:   mDequeueBufferCannotBlock=0 mAsyncMode=0
06-22 11:24:40.224  3400  9472 E BufferQueue:   mQueueBufferCanDrop=0 mLegacyBufferDrop=1
06-22 11:24:40.224  3400  9472 E BufferQueue:   default-size=[1080x1776] default-format=3   transform-hint=00 frame-counter=414
06-22 11:24:40.224  3400  9472 E BufferQueue:   mTransformHintInUse=00 mAutoPrerotation=0
06-22 11:24:40.224  3400  9472 E BufferQueue: FIFO(1):
06-22 11:24:40.224  3400  9472 E BufferQueue: (mConsumerName=SurfaceView[com.android.gallery3d/com.android.gallery3d.app.GalleryActivity]#29(BLAST Consumer)29, mConnectedApi=1, mConsumerUsageBits=2304, mId=d480000001d, producer=[3400:com.android.gallery3d], consumer=[3400:com.android.gallery3d])
06-22 11:24:40.224  3400  9472 E BufferQueue:   02:0x7756e78c73b0 crop=[0,0,0,0] xform=0x00 time=5285.5555 scale=SCALE_TO_WINDOW
06-22 11:24:40.224  3400  9472 E BufferQueue: Slots:
06-22 11:24:40.224  3400  9472 E BufferQueue:  >[00:0x7756e78b7210] state=ACQUIRED 0x7756278cf050 frame=412 [1080x1776:1088,  1]
06-22 11:24:40.224  3400  9472 E BufferQueue:  >[01:0x7756e78c0210] state=ACQUIRED 0x7756278c3ad0 frame=413 [1080x1776:1088,  1]
06-22 11:24:40.224  3400  9472 E BufferQueue:   [02:0x7756e78c73b0] state=QUEUED   0x7756278d0e90 frame=414 [1080x1776:1088,  1]

03

方法及源码

现在的方法是把BufferQueue的状态信息直接打印到logcat中,通过设置一个属性值来指定需要打印哪一个BufferQueue的信息。

源码

阅读原文获取

Android Graphics 显示系统 - BufferQueue的状态监测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用evo工具比较ORB-SLAM3的运行轨迹(从安装到解决报错)

ORB-SLAM2和ORB-SLAM3怎么跑出来,之前都有相关的保姆级的教程,下来给大家介绍一款evo工具,给科研加速!!! 文章目录 1.下载evo2.生成轨迹3.evo别的功能使用 1.下载evo 输入命令下载 pip install -i https…

Redis的使用和原理

目录 1.初识Redis 1.1 Redis是什么? 1.2 Redis的特性 1.2.1 速度快 1.2.2 基于键值对的数据结构服务器 1.2.3 丰富的功能 1.2.4 简单稳定 1.2.5 持久化 1.2.6 主从复制 1.2.7 高可用和分布式 1.3 Redis的使用场景 1.3.1 缓存 1.3.2 排行榜系统 1.3.3 计数器应用 1.3…

Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在现代软件开发中,版本控制系统(VCS)是不可或缺的工具,它不仅帮助开发者有效管理代码的变化,还支持团队协作与项目管理。Mercurial 是一个高效且易用的分布式版本控制系统,其设计目标是简洁、快速…

第二十三课,再识字符串

前言,再识字符串 字符串是我们学习python编程第一眼见到的东西,一行print(“hello world”)可谓是太亲切了,但在此之前我们对字符串的认知也仅局限于如何用单引号、双引号、三引号去定义字符串并打印,今天开始我们就更深入地去理…

详细介绍MySQL的索引(下)

索引的使用 同一条数据在未创建索引的情况下耗时: nick字段是未创建索引的 select * from t_user WHERE nick 邹丽;SHOW PROFILES; 耗时为: user_account字段创建了唯一索引 select * from t_user WHERE user_account 13781945844;SHOW PROFILES;…

重温react-06(初识函数组件和快速生成格式的插件使用方式)

开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…

前端优化:首屏加载速度的实践

目录 目录 前言 多图片的懒加载 避免用户多次点击请求 骨架屏原理 结束语 前言 随着互联网技术的飞速发展&#xff0c;前端网页逐渐取代了传统客户端成为用户获取信息、进行交互的重要渠道&#xff0c;但是网页也有常见的弊端&#xff0c;比如网页首屏加载速度的快慢直接…

大模型压缩量化方案怎么选?无问芯穹Qllm-Eval量化方案全面评估:多模型、多参数、多维度

基于 Transformer架构的大型语言模型在各种基准测试中展现出优异性能&#xff0c;但数百亿、千亿乃至万亿量级的参数规模会带来高昂的服务成本。例如GPT-3有1750亿参数&#xff0c;采用FP16存储&#xff0c;模型大小约为350GB&#xff0c;而即使是英伟达最新的B200 GPU 内存也只…

5G NR PUSCH物理层过程

物理层过程 加扰 假设要在单个码字q上传输的bit块为 b ( q ) ( 0 ) , . . . , b ( q ) ( M b i t ( q ) − 1 ) b^{(q)}(0),...,b^{(q)}(M_{bit}^{(q)} - 1) b(q)(0),...,b(q)(Mbit(q)​−1) &#xff0c;其中 M b i t ( q ) M_{bit}^{(q)} Mbit(q)​是总比特数&#xff0c;加…

MySQL高级-MVCC-隐藏字段

文章目录 1、介绍2、测试2.1、进入服务器中的 /var/lib/mysql/atguigu/2.2、查看有主键的表 stu2.3、查看没有主键的表 employee2.3.1、创建表 employee2.3.2、查看表结构及其其中的字段信息 1、介绍 ---------------- | id | age | name | ---------------- | 1 | 1 | Js…

云计算与 AI 融合:Amazon Connect 开创客户服务智能时代

在亚马逊云科技 re:Invent 2023 大会上&#xff0c;Amazon Connect 引入生成式人工智能功能&#xff0c;标志着客户服务迎来了智能化的新时代。云计算作为提供弹性、可靠、高效服务的基础&#xff0c;与人工智能的融合为客户服务注入了新的活力。这次推出的新功能不仅仅是技术的…

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式&#xff0c;求出各个权重大小 loss函数是找最小值的&#xff0c;要求导&#xff0c;在计算机里面计算导数是倒着来的&#xff0c;所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 灰度图像恢复(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Android 根证书管理与证书验证

大部分的安卓应用都免不了与后端服务器进行通信。在通信过程中&#xff0c;主要面临两方面的风险&#xff1a;1、中间人攻击。当通信使用 HTTP 等明文协议&#xff0c;通信内容可被嗅探甚至篡改。2、通信内容被攻击者分析。使用加密的协议&#xff0c;虽然避免了中间人攻击&…

RocketMQ 顺序消息和事务消息及其原理

RocketMQ 顺序消息和事务消息 1、Spring Cloud Alibaba RocketMq 架构图2、RocketMQ 顺序消息2.1、RockerMQ 实现顺序消费2.1.1、顺序发消息2.1.2、顺序收消息 2.2、顺序发送的技术原理2.3、顺序消费的技术原理 3、RocketMQ 的事务消息3.1、RocketMQ 事务消息流程3.2、事务消息…

查看Windows启动时长

&#xff08;附图片&#xff09;电脑自带检测开机时长---查看方式_电脑开机时长命令-CSDN博客 eventvwr - Windows日志 - 系统 - 查找 - 6013.jpg

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中&#xff0c;任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互&#xff0c;专注于高效执行特定任务&#xff0c;如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

使用ioDraw,AI绘图只需几秒钟!

只需几秒钟&#xff0c;就能将文字或图片转化为精准的思维导图、流程图、折线图、柱状图、饼图等各种图表&#xff01; 思维导图 思维导图工具使用入口 文字转思维导图 将文本大纲或想法转换成可视化的思维导图&#xff0c;以组织和结构化您的想法。 图片转思维导图 从现有…

汽车电子工程师入门系列——AUTOSAR通信服务框架(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…