美文网首页
Kevin Learn Android:绘制优化

Kevin Learn Android:绘制优化

作者: Kevin_小飞象 | 来源:发表于2021-11-25 09:18 被阅读0次
每日一图.jpg

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

卡顿原因

  • 布局Layout过于复杂,无法在16ms内完成渲染。
  • 同一时间动画执行的次数过多,导致CPU或GPU负载过重。
  • View过度绘制,导致某些像素在同一帧时间内被绘制多次。
  • UI线程中做了稍微耗时的操作。

优化方案

  1. 降低 View.onDraw() 的复杂度
  • onDraw()中不要创建新的局部对象
  • 避免onDraw()执行大量 & 耗时操作
  1. 避免过度绘制
    过度绘制 会导致屏幕显示的色块不同,具体如下:
    过渡绘制.png

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

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

方案:

  • 移除默认的 Window 背景
    // 方式1:在应用的主题中添加如下的一行属性
    <item name="android:windowBackground">@android:color/transparent</item>
    <!-- 或者 -->
    <item name="android:windowBackground">@null</item>

    // 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除
    getWindow().setBackgroundDrawable(null);
    <!-- 或者 -->
    getWindow().setBackgroundDrawableResource(android.R.color.transparent);
  • 移除 控件中不必要的背景
  • 减少布局文件的层级(嵌套)
  • 自定义控件View优化:使用 clipRect() 、 quickReject()
  1. 其他优化方案
    优化方案.png

工具

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中加入 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>权限。

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

优质文章:

相关文章

网友评论

      本文标题:Kevin Learn Android:绘制优化

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