Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[029]如何获取屏幕帧率

[029]如何获取屏幕帧率

作者头像
王小二
发布于 2020-06-08 02:53:11
发布于 2020-06-08 02:53:11
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

前言

王小二图解Android【006】高帧率屏幕这期的视频中,我给大家揭秘今年所有安卓旗舰都会吹的高帧率屏幕,其实高帧率屏幕不需要应用开发人员去主动适配,只要应用能在当前的硬件配置下,规定时间(1s/屏幕帧率)中完成一帧的绘制就可以了。

那肯定有人就要问了,能否当前获得屏幕帧率,然后对高帧率屏幕做针对性优化,在有限的时间内完成一帧的绘制。

一、标准SDK接口

很简单,只要能够拿到WindowManager就可以获取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//this是Activity
Log.v("Kobe", "Screen Hz is " + this.getWindowManager().getDefaultDisplay().getRefreshRate());
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
02-26 23:31:50.526 18982 18982 V Kobe    : Screen Hz is 60.000004

二、帧率约等于 1s/两次Vsync时间差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    private long firstVsync;
    private long secondVsync;

    private Choreographer.FrameCallback firstCallBack = new Choreographer.FrameCallback() {
        @Override
        public void doFrame(long frameTimeNanos) {
            firstVsync = frameTimeNanos;
            Choreographer.getInstance().postFrameCallback(secondCallBack);
        }
    };

    private Choreographer.FrameCallback secondCallBack = new Choreographer.FrameCallback() {
        @Override
        public void doFrame(long frameTimeNanos) {
            secondVsync = frameTimeNanos;
            //1s = 1000000000ns
            long hz = 1000000000 / (secondVsync - firstVsync);
            Log.v("Kobe", "Screen Hz is " + hz);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        HandlerThread vSyncThread = new HandlerThread("Vsync");
        vSyncThread.start();
        Handler handler = new Handler(vSyncThread.getLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Choreographer.getInstance().postFrameCallback(firstCallBack);
            }
        });
    }
}

原理就是利用Choreographer这个类的postFrameCallback的方法。调用postFrameCallback之后将会在下一个Vsync信号来的时候触发运行FrameCallback的doFrame,Vsync的上报时间就是形参frameTimeNanos(单位:纳秒)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long hz = 1000000000 / (secondVsync - firstVsync);

简单的计算就可以算出来了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
02-26 23:38:01.633 19234 19261 V Kobe    : Screen Hz is 59//大概的推测出是60hz的屏幕

有没有发现上述代码中的两个细节

1.Choreographer.getInstance()必须运行在有Looper的线程中。

因为Vsync信号的监听是通过Looper中的epoll机制监听的。

2.我没有使用主线程的Looper,而是另外新建HandlerThread。

因为主线程的Looper比较忙,容易导致Vsync信号监听推迟,导致两次Vsync时间差不对。 我之前没有另外新建HandlerThread,得到的结果是不固定的,而且是错的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
02-26 23:22:29.374 18442 18442 V Kobe    : Screen Hz is 14
02-26 23:31:21.079 18753 18753 V Kobe    : Screen Hz is 19
如果听不懂,可以看我的视频

王小二图解Android【001】Looper上篇 王小二图解Android【002】Looper下篇

三、总结

一般来说用标准SDK接口就够了,为什么我要大费周章的讲方法2,其实是想让大家了解Choreographer的作用,因为在我们调用View的渲染中就是用到了这个类,在下一个Vsync信号到来的时候触发渲染的代码。

思考

如果你们有其他想法可以获得屏幕的帧率,也可以回复留言。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Choreographer原理及应用
Choreographer对于一些同学来说可能比较陌生,但是,它其实出场率是极高的。View的三大流程就是靠着Choreographer来实现的,翻译过来这个单词的意思是“编舞者”。下面我们来详细介绍,它的具体作用是什么。
潇风寒月
2021/04/05
1.5K0
Android 开发必须了解的屏幕刷新机制
原文链接 https://juejin.cn/post/7291935035530313755
GeeJoe
2023/10/24
4420
Android 开发必须了解的屏幕刷新机制
“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
在Android中,当我们谈到 布局优化、卡顿优化 时,通常都知道 需要减少布局层级、减少主线程耗时操作,这样可以减少丢帧。如果丢帧比较严重,那么界面可能会有明显的卡顿感。我们知道 通常手机刷新是每秒60次,即每隔16.6ms刷新一次。 问题来了:
胡飞洋
2020/08/25
10K1
“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
揭秘:60FPS流畅体验背后,Android渲染机制深度解析与性能优化秘籍!
Android 的渲染显示是一个复杂的过程,涉及多个系统组件和层次。为了理解帧率、掉帧和卡顿的原理,我们需要深入了解 Android 的渲染体系。
AntDream
2024/10/31
2690
揭秘:60FPS流畅体验背后,Android渲染机制深度解析与性能优化秘籍!
面试官:如何监测应用的 FPS ?
即使你不知道 FPS,但你一定听说过这么一句话,在 Android 中,每一帧的绘制时间不要超过 16.67ms。那么,这个 16.67ms 是怎么来的呢?就是由 FPS 决定的。
音视频开发进阶
2020/11/10
1.5K0
面试官:如何监测应用的 FPS ?
面试官:如何监测应用的 FPS ?
即使你不知道 FPS,但你一定听说过这么一句话,在 Android 中,每一帧的绘制时间不要超过 16.67ms。那么,这个 16.67ms 是怎么来的呢?就是由 FPS 决定的。
路遥TM
2021/08/31
1.5K0
Android性能优化之2个帧率和卡顿监控方案(附详细实现代码)
在 Android 开发中,监控应用的帧率(FPS)是评估应用性能和发现卡顿问题的一个重要指标。本次介绍一些常用的方法来监控 Android 应用的 FPS,包括如何实现这些方法的详细说明和代码示例。
AntDream
2024/10/31
5100
Android性能优化之2个帧率和卡顿监控方案(附详细实现代码)
来看“Android编舞者”怎么编舞
(本篇涉及到大量Handler知识点,如果忘记的朋友可以再翻翻我之前写的《Handler27问》- https://juejin.cn/post/6943048240291905549)
码上积木
2021/04/30
1.3K0
《广研Android卡顿监控系统》
实现背景 应用的使用流畅度,是衡量用户体验的重要标准之一。Android 由于机型配置和系统的不同,项目复杂App场景丰富,代码多人参与迭代历史较久,代码可能会存在很多UI线程耗时的操作,实际测试时候也会偶尔发现某些业务场景发生卡顿的现象,用户也经常反馈和投诉App使用遇到卡顿。因此,我们越来越关注和提升用户体验的流畅度问题。 已有方案 在这之前,我们将反馈的常见卡顿场景,或测试过程中常见的测试场景使用UI自动化来重复操作,用adb系统工具观察App的卡顿数据情况,试图重现场景来定位问题。 常用的方式是使用
腾讯Bugly
2018/03/23
4.6K2
Android帧率监测与优化技巧
Android 应用的性能优化是开发过程中至关重要的一环,而帧率(Frame Rate)是评估应用性能的一个关键指标。在本文中,我们将深入探讨如何监测 Android 应用的帧率,以及如何通过代码示例来优化应用的性能。
Rouse
2023/10/27
5220
Android帧率监测与优化技巧
Android面试题之App的卡顿监控和卡顿优化
1、 在主线程中,加载SP,或者是缓存加载,JSON解析,可以放到Idelhander
AntDream
2024/06/24
1410
Android面试题之App的卡顿监控和卡顿优化
Choreographer全解析
早呀各位。今天继续屏幕刷新机制的知识讲解,上文说到vsync的处理,每一帧UI的绘制前期处理都在Choreographer中实现,那么今天就来看看这个神奇的舞蹈编舞师是怎么将UI变化反应到屏幕上的。
码上积木
2021/01/11
4760
Choreographer全解析
Android系统的编舞者Choreographer
上一篇文章 Android的16ms和垂直同步以及三重缓存 解释了手机流畅性的问题,并在文章中提到了在Android4.1中添加的Vsync。Choreographer机制,用于同Vsync机制配合,实现统一调度界面绘图。
静默加载
2020/05/29
2.4K0
去大厂面试,结果没想到一个Handler还有中高级几种问法,我慌了...
ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。
Android技术干货分享
2020/11/18
7110
去大厂面试,结果没想到一个Handler还有中高级几种问法,我慌了...
绘制优化
过度绘制(Overdraw)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的 UI 结构里面,如果不可见的 UI 也在做绘制的操作,会导致某些像素区域被绘制了多次,同时也会浪费大量的 CPU 以及 GPU 资源。 在 Android 手机的开发者选项中,有一个『调试 GPU 过度绘制』的选项,该选项开启之后,手机显示如下,显示出来的蓝色、绿色的色块就是过度绘制信息。
Yif
2020/04/23
9030
绘制优化
用两张图告诉你,为什么你的App会卡顿?
知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握。 学会从根源处分析画面卡顿的原因。 掌握如何编写一个流畅的App的技巧。 从源码中学习Android的细想。 收获两张自制图,帮助你理解Android的视图架构。
用户1269200
2018/07/30
9310
用两张图告诉你,为什么你的App会卡顿?
Android轻量级APM性能监测方案
[GITHUB链接 Collie ](https://github.com/happylishang/Collie)
看书的小蜗牛
2020/09/16
3.8K0
Matrix TraceCanary -- 初恋·卡顿
Baby 不要再哭泣,这一幕多么熟悉~ 在使用 App 时,有些人遇上这弹框应该会是一本正经,而有些人看到了估计一脸懵逼(黑人❓)。当然,这里我们要讨论的不是什么初恋,而是对大多数开发者来说,戏虐你千百遍,回头对它如初恋的卡顿。 曾经有篇杂志说“使用一款应用,犹如谈一场恋爱”,当时我觉得这是一本正经地在胡说八道,你手机装了上百款应用,能说这像谈恋爱?但现在想想,其实并非没有道理,当你喜欢上一款应用,往往是因为它的功能足够吸引你,就像你喜欢他的外表,再然后你体验了一段时间(交往),发现这款确实是你喜欢的
微信终端开发团队
2019/01/11
4.3K0
Matrix TraceCanary -- 初恋·卡顿
[036]Choreographer Skipped真正含义
我相信大家肯定遇到过下面这个LOG,表面意思是在主线程做了太多的事,但是可能你们不知道这条LOG的真实含义。换句话说你们能写一个Demo生成这条LOG吗?我建议你们先写写看,再继续看下去。
王小二
2020/06/08
1.7K0
用两张图告诉你,为什么你的App会卡顿?
有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握。 学会从根源处分析画面卡顿的原因。 掌握如何编写一个流畅的App的技巧。 从源码中学习Android的细想。 收获两张自制图,帮助你理解Android的视图架构。 从setContentView()说起 public class AnalyzeViewFrameworkActivity extends Act
范蠡
2018/04/04
2.2K0
用两张图告诉你,为什么你的App会卡顿?
相关推荐
Choreographer原理及应用
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验