您当前的位置: 首页 >  性能优化

Kevin-Dev

暂无认证

  • 0浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android -- 性能优化】绘制优化

Kevin-Dev 发布时间:2017-07-04 15:27:24 ,浏览量:0

不断学习,做更好的自己!💪

视频号CSDN简书欢迎打开微信,关注我的视频号:程序员朵朵点我点我

绘制性能的好坏主要影响:Android 应用中的页面显示速度。其实质就是页面的绘制时间。我们优化的方向主要是:1.降低 View.onDraw() 的复杂度;2.避免过度绘制。

卡顿原因
  • 布局Layout过于复杂,无法在16ms内完成渲染。
  • 同一时间动画执行的次数过多,导致CPU或GPU负载过重。
  • View过度绘制,导致某些像素在同一帧时间内被绘制多次。
  • UI线程中做了稍微耗时的操作。
优化方案
  1. 降低 View.onDraw() 的复杂度
  • onDraw()中不要创建新的局部对象
  • 避免onDraw()执行大量 & 耗时操作
  1. 避免过度绘制 过度绘制 会导致屏幕显示的色块不同,具体如下: 过渡绘制.png

我们要尽可能避免过度绘制:

  • 尽可能地控制 过度绘制的次数 = 2 次(绿色)以下,蓝色最理想
  • 尽可能避免 过度绘制的粉色 & 红色情况
  • 不允许 3 次以上的过度绘制(淡红色)面积 超过 屏幕大小的 1/4

方案:

  • 移除默认的 Window 背景
	// 方式1:在应用的主题中添加如下的一行属性
    @android:color/transparent
    
    @null

	// 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除
    getWindow().setBackgroundDrawable(null);
    
    getWindow().setBackgroundDrawableResource(android.R.color.transparent);
  • 移除 控件中不必要的背景
  • 减少布局文件的层级(嵌套)
  • 自定义控件View优化:使用 clipRect() 、 quickReject()
  1. 其他优化方案 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnWA49n2-1646969558581)(https://upload-images.jianshu.io/upload_images/9134822-f207a2c23d6ca736.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
工具 1. Traceview

TraceView是Android SDK中自带的数据采集和分析工具。一般来说,通过TraceView我们可以得到以下两种数据:

  • 单次执行耗时的方法。
  • 执行次数多的方法。

1. 使用 Traceview 要分析Traceview,则首先要得到一个trace文件,trace文件的获取有两种方式,分别是在 DDMS 中使用和在代码中加入调试语句,下面分别对这两种方式进行介绍。

DDMS中使用 1.首先我们要打开Android Studio的Tool中的Android Device Monitor,并连接手机。 2.选择相应的进程,并单击Start Method Profiling按钮。 3.对应用中需要监控的点进行操作。 4.单击Stop Method Profiling按钮,会自动跳到TraceView视图。

代码中加入调试语句 如果开发中出现不好复现的问题,则需要在代码中添加TraceView监控语句,代码如下所示。

Debug.startMethodTracing();
...
Debug.stopMethodTracing();

在开始监控的地方调用startMethodTracing方法,在需要结束监控的地方调用stopMethodTracing方法。系统会在SD卡中生成trace文件,将trace文件导出并用SDK中的Traceview打开即可。当然不要忘了在manifest中加入 权限。

2. 分析Traceview 为了分析Traceview,我们来举一个简单的例子来生成trace文件,这里采用第二种方式:代码中加入调试语句。代码如下所示。

public class CoordinatorLayoutActivity extends AppCompatActivity {
    private ViewPager mViewPager;
    private TabLayout mTabLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab_layout);
        Debug.startMethodTracing("test");//1
        initView();
   ...
    }
    private void initView() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        Debug.stopMethodTracing();
    }
}

在注释1处调用了startMethodTracing方法开始监控,其中test是生成的trace文件的名称。在initView中我们特意调用sleep方法来做耗时操作。在onStop方法中我们调用了stopMethodTracing方法结束监控。这时会在SD卡根目录生成test.trace文件,我们将该文件导出到桌面,用Traceview来分析test.trace文件,我们在cmd中执行如下语句。 cmd.png

关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0497s