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

常日好讀書,晚年學垂綸。html

什麼是60fps?

 60fps:畫面每秒刷新60次,一幀的時間就是1/60 ~=16.67msandroid

刷新率 vs 幀率?

刷新率:每秒屏幕刷新次數,如今大部分手機屏幕的刷新率是60HZ 幀率:GPU在一秒內繪製的幀數。git

爲何是60fps?

 現階段,Android的幀率是60fps(16.67ms繪製一次),而手機的屏幕刷新率是60HZ(16.67ms刷新一次),因此目前的Android手機基本是這個配置,目前階段的最優解。github

爲何會卡頓丟幀?

 Android系統每16ms發出VSYNC信號,觸發GPU對UI渲染,若是你的耗時是20ms,系統在獲得VSYNC信號的時候因爲還沒準備好,就沒法進行更新任何內容,那麼用戶在32ms內看到的是同一幀畫面,就丟幀了,會有卡頓現象。性能優化

實操體驗

(1)實操環境

 Android Studio 4.0  Gradle version 6.1.1  Android API version 30markdown

(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
ide

(3)結果報表

 打開運行的systrace結果報表:oop

systrace卡頓Frames顯示

鍵盤快捷鍵
W :放大跟蹤時間軸
A :在跟蹤時間軸上向左平移
S :縮小跟蹤時間軸
D :在跟蹤時間軸上向右平移
E :以當前鼠標位置爲中定位跟蹤時間軸
M :高亮當前選區
post

界面管道顏色說明
灰色:正在休眠。
藍色:可運行(它能夠運行,可是調度程序還沒有選擇讓它運行)。
綠色:正在運行(調度程序認爲它正在運行)。
紅色:不可中斷休眠(一般在內核中處於休眠鎖定狀態)。能夠指示 I/O 負載,在調試性能問題時很是有用。
橙色:因爲 I/O 負載而不可中斷休眠。
性能

(4)單幀信息

systrace卡頓具體Frames詳情

 點擊單幀詳情,會提示卡頓的詳細信息以及建議。

小編的擴展連接

參考連接

荷花宮樣美人妝,荷葉臨風翠做裳

   ❤ 比心 ❤  

相關文章
相關標籤/搜索