背景:
投屏其实在android等使用场景非常非常多,比如现在火爆小米汽车的车机,上面涉及到手机和车机互联画面相关都是属于投屏范围。这种跨设备的投屏场景,流畅的体验是最重要的,这里就会要求投屏中最重要的一个性能指标,那就是投屏的延时。
说道投屏延时,这里有同学会问啥叫投屏延时?
比如上图所示,手机画面显示数字已经是A101,但是投屏画面的数字还是A99,为啥会有这种差异呢?
这个就因为投屏画面一般都是录制手机真实画面,但是投屏画面需要经过如下几个阶段才可以让投屏画面显示出来
上面每一个阶段都是需要耗费时间的,所以必然导致投屏的画面肯定相比真实画面有一定延时。
说到了有延时,那么如何科学的评估或者测量延时到底多少呢,人的感觉其实是最不靠谱的,因为我们一般很难感知几十毫秒的差异,除非有几百毫秒以上的差异才可能可以感知到?
投屏画面延时测量工具开发
针对延时测量,首先的知道一个测量延时的数量级,这个延时其实一般都是在毫秒级别,所以测量工具开发时候就需要有一个毫秒表进行展示。
比如如下这个毫秒表:
这里时间就带上了毫秒数据 ,有个这个毫秒数据就可以开心的测试延时了,比如如下画面:
时间当然是真实画面的时间后,投屏画面的时间早,这样很简单的计算差值既可以
毫秒表如何开发?代码如下:
ValueAnimator animator = ValueAnimator.ofInt(0,100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
long time = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String date = sdf.format(time);
mTime.setText(date);
}
});
animator.setDuration(2000);
animator.setRepeatCount(-1);
animator.start();
就是一个无限循环动画,然后每次valueanimator会触发每次的update回调时候,对当前的时间进行获取,转变成毫秒这种格式的字符串,然后进行setText既可以。
ps:这里毫秒表展示方式大家自己选着,可以是Activity,也可以是一个系统悬浮窗口(建议这种可以多场景测试延时)
分场景测量投屏延时
测量延时一般都是需要分不同场景进行,画面的刷新变化区域对延时影响也很大,大家也知道h264等视频编码都是差量进行编码,如果变化小传递数据小,如果变化大当然传递数据也大。
一般分为如下几个场景进行分开测量延时:
1、时钟秒表,或者是上面写的毫秒表,这类场景主要变化区域只有变化的时间数字,属于变化较小的情况
2、进入复杂的游戏画面,比如王者荣耀,和平精英等画面,这里需要把毫秒表变成一个悬浮窗口,然后测量延时
3、需要连续拍照或者录屏获取延时数据,取平均延时值
本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
其他课程七件套专题:
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频试看:
https://www.bilibili.com/video/BV1wc41117L4/