【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

简介: 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

文章目录

一、 背景设置产生的过度绘制

二、 Android 系统的渲染优化

1. 透明组件数据传递

2. GPU 存储机制

3. Android 7.0 之后的优化机制

三、 自定义布局渲染优化





一、 背景设置产生的过度绘制


1. 背景设置产生的过度绘制 :



① 组件背景 : 每个组件每设置一次背景 , 该组件的区域就会增加一层绘制 , 如 LinearLayout 线性布局设置背景颜色 , TextView 设置背景颜色 , 都会增加该组件区域内的过渡绘制 ;


② 布局背景 : 布局文件总的背景 , 会增加一次 GPU 绘制 ;


③ 主题背景 : Activity 界面的主题背景 , 会增加一次 GPU 绘制 ;




2. 组件背景设置策略 : 不要随便为组件添加背景 , 添加一次背景 , 就增加一次 GPU 绘制 ;


不要随意给布局中的 UI 组件设置背景 , 能不设置背景的就不设置背景 , 如 ImageView 组件 , 设置一张图片 , 会增加一次绘制 , 如果再给该 ImageView 组件设置背景颜色 , 那么又会增加一次绘制 , 那么该 ImageView 组件肯定过渡绘制了 ;






二、 Android 系统的渲染优化


在 【Android 性能优化】布局渲染优化 ( CPU 与 GPU 架构分析 | 安卓布局显示流程 | 视觉与帧率分析 | 渲染超时卡顿分析 | 渲染过程与优化 ) 博客中分析了图像渲染的 16 毫秒过程中


CPU 渲染

CPU 传递数据到 GPU

GPU 渲染

是三大耗时操作 , 上述分析的背景过渡绘制 , 是从减少 GPU 渲染时间角度出发 , 降低图像渲染时间 ;



CPU 传递数据给 GPU 非常耗时 ;



下面分析是从 降低 CPU 传递数据到 GPU 时间 角度出发 , 进行的优化 , 这部分优化是由 Android 系统完成的 ;




1. 透明组件数据传递


Android 系统做了如下自动优化操作 , 当组件的背景是透明的 , 那么 CPU 将该组件转为多维向量图片 ( 多边形和纹理组成 ) 时发现该组件是透明的 , 该组件的图像信息就不会传递给 GPU 进行渲染 , 从而减少了 CPU 向 GPU 传递的数据大小 ; 之前讲到过 , CPU 向 GPU 传递数据也是一个非常耗时的操作 , 因此该优化 , 也降低了组件渲染的时间 ;



透明组件摆放处理 : CPU 不传递这些组件到 GPU 中 , 但是在布局中仍然正常摆放 ;




2. GPU 存储机制


1. GPU 存储纹理机制 : GPU 中的显存可以存储纹理资源 , 即多维向量图形资源 , 在渲染时 , 可以直接使用该存储的资源 , 不用每次都让 CPU 传递数据过来 ;



2. CPU 传递主题资源给 GPU 机制 : 传递主题资源是一次性传递 , 主题中的 背景 , 颜色 , 图片 ( Bitmap , Drawable ) 等资源都打包存储在了多维向量图形 ( 多边形 和 纹理 ) 中 , 传递给 GPU 进行渲染 , GPU 每次进行渲染时直接从存储区域取出这些资源 , 进行渲染 , 不再依赖 CPU 实时传递 ;


这种变化较少的资源 , 适合一次性加载 , 应用或界面的主题资源基本不会改变 ;



3. 普通的 UI 组件资源 : 如果是普通的 UI 组件 , 那么就不能只加载一次了 , 需要每次渲染时 , CPU 都要将组件加载到内存 , 并转成的多维向量图形 , 最后传递给 GPU ;




3. Android 7.0 之后的优化机制


Android 7.0 之后的优化机制 :



① 7.0 系统优化前 : Android 7.0 之前调用 UI 组件的 invalidate 方法 , 组件会回调 onLayout , onMeasure 和 onDraw 方法 ;


② 7.0 系统优化后 : Android 7.0 之后调用 UI 组件的 invalidate 方法 , 组件不会回调 onLayout 和 onMeasure 方法 , 只会调用 onDraw 方法 ;


③ 7.0 系统优化后工作机制 : 在 GPU 中缓存 UI 组件对应的多维向量图形 ( 纹理 ) , 当该组件位置或颜色等外观发生变化时 , 就会通知 CPU , 重新进行加载 , 如 onLayout 摆放 , onMeasure 测量 , 并转为多维向量图 ( 纹理 ) , 传递给 GPU 进行渲染 ; 如果没有发生变化 , 调用 invalidate 方法 , 只会在 GPU 中重新渲染 ; 不会重新 摆放 ( onLayout ) 与 测量 ( onMeasure ) ;






三、 自定义布局渲染优化


1. 自定义组件过度绘制问题描述 : 自定义控件 , 在自定义的 onDraw 方法中 , 绘制多张图片 , 如果图片之间产生重叠 , 重叠绘制的部分就出现了过度绘制 ;




2. 自定义组件绘制原则 :



① 两张图片 : 图片 A AA 和 图片 B BB ;

image.png



② 图片覆盖 : 当图片 A AA 被图片 B BB 覆盖时 , 只绘制图片 A AA 显示的部分区域 , 图片 A AA 被图片 B BB 覆盖的部分不再绘制 ;


image.png


③ 图片 A AA 只绘制没有被覆盖的部分 : 只在图片 A AA 显示的区域绘制图片 A AA 的区域 , 如下图黄色框中的区域 ;


image.png




3. 实现上述图片 A AA 在 Canvas 画布上绘制部分图片方式 :



① 完整画布 : onDraw 函数中的 Canvas canvas 参数是完整的画布 ;


② 取出图片 A AA 绘制部分的 Canvas 画布 : 这部分画布就是上图中 , 被黄色框框起来的画布 , 传入的四个参数是黄色矩形框的左上右下参数 , 注意剪切之前先保存画布 ;


// 剪切画布前 , 先保存画布 , 之后还要恢复回去
canvas.save();
// 剪切画布
canvas.clipRect(left, top, right, bottom);


③ 在剪切后的画布中绘制图片 A AA : 在剪切后的画布中 , 绘制图片 A AA , 注意绘制完成后 , 恢复画布 ;


// 在剪切后的画布中 , 绘制图片 A
canvas.drawBitmap(...);
// 绘制完毕后 , 恢复画布
canvas.restore();


④ 绘制效果 : 上述代码的绘制效果大概就是绘制了部分图片 A AA , 下图中的下面的部分图片 A AA 展示 ;


image.png



3. clipRect 函数原型 : 剪切画布 , 获取 Canvas 完整画布的子画布 , 传入左 , 上 , 右 , 下 , 四个值 , 将画布剪切出来 ;


 

public boolean clipRect(float left, float top, float right, float bottom) {
        return nClipRect(mNativeCanvasWrapper, left, top, right, bottom,
                Region.Op.INTERSECT.nativeInt);
    }


相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
目录
相关文章
|
9月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
602 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
484 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
200 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
5月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
410 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
5月前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
160 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
9月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
424 65
Android自定义view之网易云推荐歌单界面
|
9月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
781 84
|
9月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
272 3
|
XML 前端开发 Android开发
android 前端常用布局文件升级总结(二)
android 前端常用布局文件升级总结(二)
156 0
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖