首页 > 其他分享 >AOSP CameraLatencyHistogram 的原理与使用

AOSP CameraLatencyHistogram 的原理与使用

时间:2022-10-17 20:33:23浏览次数:92  
标签:buffer CameraLatencyHistogram nsecs MONOTONIC AOSP 直方图 TIME 原理

AOSP 代码引用参考:www.aospxref.com/

可以搜索到 android 各个版本的代码,比较方便,不必下载 AOSP 代码。

AOSP CameraLatencyHistogram 的原理与使用_Framework

CameraLatencyHistogram 是什么

CameraLatencyHistogram 是 AOSP Camera 模块的一个工具类,主要作用是进行直方图统计,针对一些有时延的操作,比如 request 执行的时间,dequeue buffer 的时间等,做直方图统计,最后用于性能相关问题的 debug。

核心源代码位置:​​/frameworks/av/services/camera/libcameraservice/utils/LatencyHistogram.cpp​

源码解析

头文件定义

AOSP CameraLatencyHistogram 的原理与使用_Framework_02

其中,

  • mBinSizeMs 记录的是当前记录表的标准时间,比如预设一次 request 的标准时长为 40ms
  • mBinCount 记录的是直方图的等级划分数量,通常默认是 10 个等级
  • mBins 记录的是直方图各个等级的数量
  • mTotalCount 记录的是直方图的统计数量总数

类初始化

AOSP CameraLatencyHistogram 的原理与使用_Android_03

初始化上述的变量,注意,这里对 vector 进行的初始化,实际上是设定 vector 的 size 大小,不是将第一个元素设定为 binCount。

增加一个数据/清空所有数据

AOSP CameraLatencyHistogram 的原理与使用_Android_04

add 一个数据时:先计算时间差,注意,这里是 ns,然后转换为 ms,再与标准时间做除法(计算机的整数除法只取整数部分,比如标准时间是 40ms,本次耗时 30ms,则除法得到 0,耗时 70ms,则除法得到 1),这样就能保证 0<=t<mBinSizeMs 的时长 index 为 0,然后依次类推到 9mbinSizeMs<=t<10mBinSizeMs 的 index 为 9;

然后针对小于 0 和大于等于 10 的做归一化操作;

然后对应存储位置加一,总数加一。

dump/log 以及内部处理函数 formatHistogramText

AOSP CameraLatencyHistogram 的原理与使用_Android_05

dump 的逻辑:

  • 先 dump 数据的行头,标识 dump 时的记录数据量;
  • 然后将直方图数据构造成字符串;
  • 将直方图数据写入到对应的 fd 文件中。

log 函数的操作与 dump 基本一致,只是这时是调用 Android log 打印出来。

AOSP CameraLatencyHistogram 的原理与使用_Framework_06

这个函数的作用就是将统计结果表示成字符串:

  • 先打印耗时的时间段,如 33ms/66ms/99ms,最大值打印为 inf (max ms)
  • 然后打印每一个段数据占总数据量的百分比100.0*mBins[i]/mTotalCount
  • 最后打印一个 %号。

使用该工具的位置

mDequeueBufferLatency:dequeue buffer 的时延,5ms

///frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.h
//dequebuffer默认耗时5ms,进行记录
static const int32_t kDequeueLatencyBinSize = 5; // in ms C
ameraLatencyHistogram mDequeueBufferLatency;

status_t Camera3OutputStream::getBuffersLocked(std::vector<OutstandingBuffer>* outBuffers) {
...
nsecs_t dequeueStart = systemTime(SYSTEM_TIME_MONOTONIC);
res = consumer->dequeueBuffers(&buffers);
nsecs_t dequeueEnd = systemTime(SYSTEM_TIME_MONOTONIC);
mDequeueBufferLatency.add(dequeueStart, dequeueEnd);
...
}

mBufferLimitLatency:buffer signal 时延,33ms

///frameworks/av/services/camera/libcameraservice/device3/Camera3Stream.h
// Latency histogram of the wait time for handout buffer count to drop below
// max_buffers.
static const int32_t kBufferLimitLatencyBinSize = 33; //in ms
CameraLatencyHistogram mBufferLimitLatency;
status_t Camera3Stream::getBuffer(camera_stream_buffer *buffer, nsecs_t waitBufferTimeout, const std::vector<size_t>& surface_ids) {
...
nsecs_t waitStart = systemTime(SYSTEM_TIME_MONOTONIC);
if (waitBufferTimeout < kWaitForBufferDuration) {
waitBufferTimeout = kWaitForBufferDuration;
}
res = mOutputBufferReturnedSignal.waitRelative(mLock, waitBufferTimeout);
nsecs_t waitEnd = systemTime(SYSTEM_TIME_MONOTONIC);
mBufferLimitLatency.add(waitStart, waitEnd);
...
}

mRequestLatency:request 执行的时延,40ms

///frameworks/av/services/camera/libcameraservice/device3/Camera3Device.h
//记录request的时延,默认一帧request时长40ms
static const int32_t kRequestLatencyBinSize = 40; // in ms
CameraLatencyHistogram mRequestLatency;
bool Camera3Device::RequestThread::threadLoop() {
...
bool submitRequestSuccess = false;
nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
submitRequestSuccess = sendRequestsBatch();
nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
mRequestLatency.add(tRequestStart, tRequestEnd);
...
}

具体使用

ADBlog 搜索关键字:CameraLatencyHistogram

AOSP CameraLatencyHistogram 的原理与使用_Framework_07

由此可见,采样 41 个 request,40ms 内执行成功的有 95.12%;采样 36 个 dequeue buffer,全部都在 5ms 内执行成功。

该模块主要用于查看 framework 的一些耗时流程的时延直方图分布,check 性能时可以进行参考

标签:buffer,CameraLatencyHistogram,nsecs,MONOTONIC,AOSP,直方图,TIME,原理
From: https://blog.51cto.com/u_15830688/5764323

相关文章

  • 【转】多态的实现原理
    转载自:https://blog.csdn.net/fightHHA/article/details/81626383https://blog.csdn.net/weixin_49199646/article/details/109492763?spm=1001.2101.3001.6650.8&u......
  • vue 的响应式原理
    通过Obejct.defineProperty定义数据,给数据加上geter和setter,获取数据和触发getter设置数据触发setter,从而实现数据的监听;通过发布订阅模式进行依赖收集与视图......
  • Java JDK 动态代理(AOP)使用及实现原理分析
    目录​​一、什么是代理?​​​​二、Java动态代理类 ​​​​三、JDK的动态代理怎么使用?​​​​四、动态代理怎么实现的?​​​​五、结论​​一、什么是代理?代理是一种常......
  • 11.0 Spring整合Mybatis原理
    一、整合核心思路由很多框架都需要和Spring进行整合,而整合的核心思想就是把其他框架所产生的对象放到Spring容器中,让其成为Bean,只要成为了Bean,在Spring项目中就能很方便的......
  • 记录--图解 Vue 响应式原理
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助最近部门分享,有同学提到了Vue响应式原理,大家在讨论时,发现一些同学对这一知识理解还不够深入,不能形成......
  • 全文搜索引擎Solr原理和实战教程
    Solr简介1.Solr是什么?Solr它是一种开放源码的、基于LuceneJava的搜索服务器,易于加入到Web应用程序中。Solr提供了层面搜索(就是统计)、命中醒目显示并且支持多......
  • quartus II输入原理图及仿真步骤(转)
    https://www.cnblogs.com/mikewolf2002/p/10237681.html?ivk_sa=1024320uquartusII输入原理图及仿真步骤   在QuartusII中输入原理图以及实现仿真是学习基本数字......
  • [转]MySQL索引原理及慢查询优化
    原文地址:MySQL索引原理及慢查询优化-美团技术团队(meituan.com)背景MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库......
  • Yarn原理解析
    Yarn介绍一,介绍yarn是一种通用的资源管理系统和调度平台。资源管理系统:管理集群内的硬件资源,和程序运行相关,比如内存,CPU等。调度平台:多个程序同时申请计算资源时提供......
  • 经常被问到的react-router实现原理详解
    在单页面应用如日中天发展的过程中,备受关注的少了前端路由。而且还经常会被xxx面试官问到,什么是前端路由,它的原理的是什么,它是怎么实现,跳转不刷新页面的...一大堆为什么,......