文章插图
quickReject
上面的示例图中显示了一个自定义的View,主要效果是呈现多张重叠的卡片 。这个 View 的 onDraw 方法如下图所示:
protected void onDraw(Canvas canvas) { super.onDraw(canvas);if (mDroids.length > 0 && mDroidCards.size() == mDroids.length) { // 过度重绘代码 int i; for (i = 0; i < mDroidCards.size(); i++) { // 每张卡片都放在前一张卡片的右侧 mCardLeft = i * mCardSpacing; drawDroidCard(canvas, mDroidCards.get(i), mCardLeft, 0); } } invalidate();}打开「开发者选项」中的「显示过度渲染」,可以看到我们这个自定义的 View 部分区域存在着过度绘制 。
下面的代码显示了如何通过 clipRect 来解决自定义 View 的过度绘制,提高自定义 View 的绘制性能:
protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mDroids.length > 0 && mDroidCards.size() == mDroids.length) { int i; for (i = 0; i < mDroidCards.size() - 1; i++) { // 每张卡片都放在前一张卡片的右侧 mCardLeft = i * mCardSpacing; // 保存 canvas 的状态 canvas.save(); // 将绘图区域限制为可见的区域 canvas.clipRect(mCardLeft, 0, mCardLeft + mCardSpacing, mDroidCards.get(i).getHeight()); drawDroidCard(canvas, mDroidCards.get(i), mCardLeft, 0); // 将画布恢复到非剪切状态 canvas.restore(); } // 绘制最后没有剪裁的卡片 drawDroidCard(canvas, mDroidCards.get(i), mCardLeft + mCardSpacing, 0); } invalidate();}避免使用不支持硬件加速的 APIAndroid 系统中图形绘制分为两种方式,纯软件绘制和使用硬件加速绘制 。
大家可以查看 美团技术团队 - Android 硬件加速原理与实现简介 这篇文章了解下硬件加速的实现原理 。
简单来说在 Android 3.0(API 11)之前没有硬件加速,图形绘制是纯软件的方式,DisplayList 的生成和绘制都需要 CPU 来完成 。之后加入的硬件加速(默认开启)将一部分图形相关的操作交给 GPU 来处理,这样大大减少了 CPU 的运算压力 。
今年金九银十我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【安卓】,我会把我收录整理的资料都送给大家,帮助大家更快的进阶 。
【找出Android卡顿的元凶——渲染性能优化】
推荐阅读
- android6.0系统Healthd深入分析
- win10下搭建flutter android应用开发环境
- Android曝重大安全漏洞:允许攻击者录制视频、监听通话
- 如何在 Linux 中找出内存消耗最大的进程
- 深入理解 Android 9.0 Crash 机制 读懂底层原理 看清表面逻辑
- 几款实用的Android Studio 插件给你推荐一下
- Android Studio Debug 的 9 个小技巧
- android Flutter 工程结构和资源文件分辨率相关的图片文件放哪儿
- Android开发者,是时候了解LeakCanary了
- 11个促进Android应用开发的工具