(五) 下篇 Android 性能优化 Systrace文件分析

1,644 阅读2分钟

常日好读书,晚年学垂纶。

什么是60fps?

 60fps:画面每秒刷新60次,一帧的时间就是1/60 ~=16.67ms

刷新率 vs 帧率?

刷新率:每秒屏幕刷新次数,现在大部分手机屏幕的刷新率是60HZ 帧率:GPU在一秒内绘制的帧数。

为什么是60fps?

 现阶段,Android的帧率是60fps(16.67ms绘制一次),而手机的屏幕刷新率是60HZ(16.67ms刷新一次),所以目前的Android手机基本是这个配置,目前阶段的最优解。

为什么会卡顿丢帧?

 Android系统每16ms发出VSYNC信号,触发GPU对UI渲染,如果你的耗时是20ms,系统在得到VSYNC信号的时候由于还没准备好,就无法进行更新任何内容,那么用户在32ms内看到的是同一帧画面,就丢帧了,会有卡顿现象。

实操体验

(1)实操环境

  • 可选项,用自己的环境和代码也一样
  • SamplePop代码下载
  • SamplePop环境如下:  Android Studio 4.0  Gradle version 6.1.1  Android API version 30

(2)示例代码

    public void onFramesLossMonitor(View view) {
        Log.d(TAG, "onFramesLossMonitor: ");
        startAnimator();
    }

    private void startAnimator() {
        Log.d(TAG, "startAnimator: ");
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mMonitorBgView.setAlpha((float) animation.getAnimatedValue());
                monitorDoSomeThings();
            }
        });
        valueAnimator.setDuration(500);
        valueAnimator.start();
    }

    private void monitorDoSomeThings() {
        Log.d(TAG, "monitorDoSomeThings: ");
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            Log.d(TAG, "writeSomething: ");
        }
    }

 按照 上篇 讲述的方法,导出html文件报表,找到对应包名的进程,查看Frames,表明有卡顿(丢帧)。
 绿色:< 1* vsync
 黄色:1 * vsync ~ 2 * vsync之间
 红色:> 2 * vsync

(3)结果报表

 打开运行的systrace结果报表:

systrace卡顿Frames显示

键盘快捷键
W :放大跟踪时间轴
A :在跟踪时间轴上向左平移
S :缩小跟踪时间轴
D :在跟踪时间轴上向右平移
E :以当前鼠标位置为中定位跟踪时间轴
M :高亮当前选区

界面管道颜色说明
灰色:正在休眠。
蓝色:可运行(它可以运行,但是调度程序尚未选择让它运行)。
绿色:正在运行(调度程序认为它正在运行)。
红色:不可中断休眠(通常在内核中处于休眠锁定状态)。可以指示 I/O 负载,在调试性能问题时非常有用。
橙色:由于 I/O 负载而不可中断休眠。

(4)单帧信息

systrace卡顿具体Frames详情

 点击单帧详情,会提示卡顿的详细信息以及建议。

小编的扩展链接

参考链接

荷花宫样美人妆,荷叶临风翠作裳

   ❤ 比心 ❤