APP性能优化-CPU

作者: code_balance | 来源:发表于2019-11-21 22:32 被阅读0次
APP性能优化-Memory
APP性能优化-稳定性(crash率)
APP性能优化-包体压缩
APP性能优化-CPU
APP性能优化-UI
APP性能优化-流畅度
前言

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成;但是如果主线程执行一些太耗时操作,或者主线程短时间内需要执行太多任务,操作周期超过16ms,就会导致丢帧,32ms内看到的是同一帧。为了流畅度就不能让CPU太过于繁忙。

优化思想

1.少做、提前做、分散做、延迟做、异步做
2.提升硬件功率

优化工具

TraceView:停留在Eclipse时代的工具;两种触发方式:1.DDMS触发;2.代码中开始点写上Debug.startMethodTrace() ,结束点写上Debug.stopMethodTrace(),运行应用后,导出生成在存储卡根目录的trace文件,然后在DDMS里面打开

CPU Profiler:Android Studio集成工具,自定义分析范围

CPU Profiler优化CPU

假设用户点击跳转视频播放页面,播放器页面可能会涉及到以下操作

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        initVideoSdk();
        startPlayVideo();
        initScreenOrientation();
        initAudioChange();
        reqeustPageData();
        reqeustComments();
        requestRecommendVideo();
    }
    //初始化视频sdk
    public static void initVideoSdk(){
        try {
            //模拟视频SDK初始化时间
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //开始播放视频
    private void startPlayVideo(){
        try {
            //模拟拉起视频播放耗时
            Thread.sleep(30);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //请求页面数据
    private void reqeustPageData(){
        try {
            //模拟页面刷新耗时
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //请求评论数据
    private void reqeustComments(){
        try {
            //模拟评论适配器刷新耗时
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //请求推荐视频
    private void requestRecommendVideo(){
        try {
            //模拟推荐视频刷新耗时
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //监听屏幕旋转
    private void initScreenOrientation(){
        try {
            //模拟监听屏幕旋转初始化耗时
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //监听生命周期释放、获取音频权限
    private void initAudioChange(){
        try {
            //模拟音频监听初始化耗时
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

上面是通过伪代码模拟各个操作的耗时,profiler一下当时CPU的情况

image.png
image.png
页面的初始化就耗费了1s,这里只是伪代码,实际情况可能更差,同时CPU使用出现了抖动,那实际反馈给用户的就是页面打开慢,而且在这段时间内响应不了用户操作,这样给用户的体验不是很好,对以上步骤稍作调整

1.initVideoSdk():完全可以提前初始化,比如application或其他合适时机

2.除reqeustPageData()外,reqeustComments()、requestRecommendVideo()这种在页面实际是由上到下的列表展示方式,可以按照顺序改成串行执行,或者delay执行,

3.initScreenOrientation()、 initAudioChange()一开始没有必要初始化,几乎没人会在进页面1s就进行转屏操作,这类可以延迟初始化

关于CPU的优化只是抛砖引玉,这里只是给出个思路,更多优化需要针对具体业务以及页面结构进行具体优化

提升硬件功率(Hardcoder

部分厂商会针对部分APP做一些小改动,其中比较典型的就是“暴力提频”。系统在识别到目标APP启动,页面切换等场景时,会粗暴地提高 CPU 频率,从而提升 APP 运行的性能。Hardcoder需要跟厂商合作,需要申请权限,加入白名单,感兴趣的可以去研究下 http://github.com/Tencent/Hardcoder.git

相关文章

网友评论

    本文标题:APP性能优化-CPU

    本文链接:https://www.haomeiwen.com/subject/qvfnvctx.html