Android性能优化——渲染

Android渲染性能优化探究 请根据应用的具体情况选择适合的优化方法,并结合相应的源代码示例进行实践。记住,在进行性能优化时,始终进行测试和评估,以确保优化措施的有效性和稳定性。良好的渲染性能可以提高应用的响应速度和流畅度,为用户提供更好的体验。本文将探讨一些优化渲染性能的方法,并提供相应的源代码示例。优化布局层次可以减少视图层次的复杂性,提高布局的渲染速度。-使用异步任务(AsyncTask):异步任务是Android提供的一个方便的工具,用于在后台执行耗时的操作,并在主线程更新UI。优化绘制可以减少不必要的绘制操作,提高渲染性能。 阅读详情

Android性能优化之渲染

原Udacity视频链接

1. 为什么渲染性能很重要

现在有不少App为了达到很华丽的视觉效果,会需要在界面上层叠很多的视图组件,但是这会很容易引起性能问题。如何平衡Design与Performance就很需要智慧了。

2. Defining ‘Jank’

渲染功能 Rendering 是应用程序最普遍的功能,一方面设计师要求为用户展现可用性最高的体验,另一方面那些华丽的图片和动画,并不是在所有的设备上都能流畅运行,所以我们首先得了解一下什么是渲染性能。

Android系统每16ms重新绘制一次activity,也就是说你的应用必须在16ms内完成屏幕刷新的全部逻辑操作,这样才能达到每秒60帧。

这个每秒的帧数参数实际来源于手机硬件,现在大多数手机屏幕刷新率大概在60赫兹,这意味着你有60ms的时间去完成每一帧的绘制逻辑操作。一帧可以看做是一张的独立图片,60帧每秒就意味着:16ms=1000/60Hz,相当于60fps。这就是上面说的16ms,这也是为什么Android系统每隔16ms就会发出一次VSYNC信号触发对UI进行渲染,如果这16ms内我们没有完成对视图的绘制,那么就会出现丢帧的情况。


安卓系统尝试在屏幕上绘制新的一帧,但是这一帧还没有准备好,所以画面就不会刷新,所以用户盯着同一张图看了32ms而不是16ms,丢帧状况下运行的任何动画,用户很容易察觉出卡顿感,如果出现多次掉帧,用户就会开始抱怨,如果此时用户正和系统进行交互,例如侧滑列表或者输入数据,那么卡顿感就会更加明显,这样造成的后果便会是用户毫不留情的卸载APP,

3. CPU和GPU


Android系统的渲染管线分为两个关键组件CPU和GPU,两者共同工作在屏幕上绘制图片,必须遵守特定的规则才能达到效果。

CPU方面,最常见的性能问题是不必要的布局,这些内容必须在视图层次结构中进行测量、清楚并重新创建,造成这个的原因有两个,一是重建显示列表的次数太多,二是花费太多时间作废视图层次,并进行不必要的重绘。这两个原因在更新显示列表或者其他缓存GPU资源时导致CPU工作过度。

第二个主要问题出在GPU上面。就是我们所说的透支(overdraw),通常是在色素着色过程照中、通过其他工具进行后期着色时,浪费了GPU处理时间。

4. Android UI 和 GPU

那些复杂的xml布局文件是如何转换成用户能看懂的图像的呢,实际上,这是由格栅化操作完成的。格式化将诸如字符串、按钮、路径或者形状的一些高级对象(Button,Shape,Path,String,Bitmap),拆分到不同的像素上在屏幕上进行显示,格栅化是一个非常耗时的过程,手机有一块特殊的硬件,就是为了加速这个过程,也就是GPU。GPU使用一些指定的基础指令集,主要是多边形和纹理,也就是图片,CPU在绘制图线前,会向GPU输入这些指令,这一过程通常使用的api就是Android的OpenGL ES

这就是说。在屏幕上绘制UI对象时,不管是按钮、路径或者复选框,都需要在CPU中首先转换为多边形或者纹理(Textures),然后再传递给GPU进行格栅化,一个UI对象转化为多边形和纹理的过程非常耗时,从CPU传数据给GPU也相当耗时,所以要尽可能的减少传递的次数,OpenGL ES API 允许数据上传到GPU后,可以对数据进行保存,当你下次绘制一个按钮的时候,只需要在GPU存储器引用它然后告诉OpenGL如何绘制即可。

所以说渲染性能优化就是,尽可能快的上传数据到GPU,然后尽可能长的在不修改的条件下保存数据。在Android Honeycomb (3.0)之后渲染系统性能方面有很多改进,Android系统在降低、重新利用GPU资源方面做了很大改进,例如,任何主题提供的资源(BitMap、Drawable等)都是一起打包到统一的纹理当中,然后使用网格工具上传到GPU例如Nine Patches,这样每当需要绘制这些资源的时候,他们已经存储在GPU中了,大大加快了这类视图的显示,

5. Overdraw

Overdraw(过度绘制)意指屏幕上某个像素在同一时间内被绘制了多次,在多层重叠的UI结构里面。如果不可见的UI也在做绘制操作,会导致某些像素区域被绘制了多次,这样会造成大量的CPU和GPU以及资源

当设计更华丽的效果的时候,我们就很容易采用复杂的多层次重叠视图。这很容易导致大量的性能问题,为了获得最佳性能,我们必须减少overdraw的发生。

我们可通过以下步骤查看Overdraw情况。

1. Go to Settings > Developer Options 
2. Turn on Debug GPU Overdraw. 
3. In the popup, choose Show overdraw areas.

蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

6. 修复overdraw

通过查看xml文件我们可以看到有好几处非必需的background,移除非必需的background,可以显著减少布局的过度绘制

其中一个比较有意思的地方是:针对ListView中的ImageView的设置,在getView的代码里面,判断是否获取到对应的Bitmap,在获取到图像之后,把ImageView的Background设置为Transparent,只有当图像没有获取到的时候才设置对应的Background占位图片,这样可以避免因为给Avatar设置背景图而导致的过度渲染。

总结一下,优化的步骤如下:

  • 移除window默认的background
  • 移除非必需的background
  • 按需显示占位背景图片

7. 关于overdraw的另一件事

对于有些过度绘制对于运行性能可能是必要的,也可能是可以接受的,比如ActionBar

8. clipRect 和 quickReject

Android知道,过度绘制是个麻烦,所以Android会设法避免在最终图片中不显示UI组件,这种优化类型叫做clipping,他对UI性能非常重要。

但是不幸的是这一技术无法应对复杂的自定义view,系统无法检测onDraw具体会执行什么操作。

针对这一情况,我们可以使用具有一些特别方法的Canva类识别被遮挡不需要绘制的部分,最有用的方法是Canvas.clipRect(),他可以帮助你识别给定View的图片边界,边界区域之外的任何绘制会被忽视,我们可以使用Canvas.quickReject方法,判断给定区域是否完全在剪辑矩形之外。

9. 练习使用

这是一个呈现多张重叠的卡片View,下面是onDraw方法

打开开发者选项后显示过度渲染。

10. 使用Canvas修复

上面代码显示了如何解决自定义View的过度绘制问题。

优化后的效果

11. Layouts, Invalidations and Perf

为了在屏幕上绘制某个东西,Android通常将高级xml文件转换为GPU能够识别的对象,然后显示在屏幕上,这个操作时在DisplayList的帮助先完成的,

DisplayList 持有所有要交给GPU绘制到屏幕上的数据信息、包含GPU要绘制的全部对象的信息列表、和执行绘制操作的OpenGL命令列表。

在某个view第一次需要被渲染时,DisplayList会因此被创建,当这个View要显示到屏幕上时,我们将绘制指令提交给GPU来执行DisplayList。

当下次渲染这个View时,比如说位置发生了变化,我们仅需要执行DisplayList就可以了,但是如果修改了View的某些可见组件的内容,那么之前的DisplayList就无法继续使用了,这时我们要重建一个DisplayList,重新执行渲染指令并更新在屏幕上。

需要注意的是,任何时候View的绘制内容发生变化时,都会重新创建DisplayList,更新到屏幕上等一系列操作。这个表现性能取决于你的View的复杂程度、View的状态变化以及渲染管道的执行性能。

举个例子,如果某个Button的大小需要增大到目前的两倍,在增大之前,需要通过父View重新计算并摆放其他子View的位置,修改View的大小会触发HierarchyVIew的重新计算大小的操作,如果是修改View的位置,则会重新计算其他View的位置,如果布局很复杂,这就会很容易导致性能问题。

12. Hierarchy Viewer

Hierarchy Viewer可以显示布局的层次关系,我们可以通过红黄绿三种不同的颜色来区分布局的measure、layout、executive的相对性能如何。

现在Google已经不推荐使用层次结构查看器。如果使用的是Android Studio 3.1或更高版本,推荐使用Layout Inspector在运行时检查应用程序的视图层次结构。

https://developer.android.com/studio/profile/hierarchy-viewer

13. 嵌套层次结构和性能

提升布局性能的关键点是尽量保持布局层级的扁平化,避免出现重复的嵌套布局。例如下面的例子,有2行显示相同内容的视图,分别用两种不同的写法来实现,他们有着不同的层级。


下图显示了使用2种不同的写法,在Hierarchy Viewer上呈现出来的性能测试差异。

14. 优化布局

下图举例演示了如何优化ListItem的布局,其主要通过RelativeLayout替代旧方案中的嵌套LinearLayout来优化布局。

数学文化赏析MOOC笔记【2023】 深圳大学UOOC课程《数学文化赏析》课程笔记 阅读详情

相关推荐

银河麒麟V10SP1系统盘瘦身指南:如何制作一个只含必需软件的轻量级安装镜像

本文详细介绍了银河麒麟V10SP1系统盘瘦身的完整流程,从依赖分析到最小化镜像构建,帮助用户创建只含必需软件的轻量级安装镜像。通过智能包筛选、KickStart定制和性能优化,显著减少ISO体积和部署时间,适用于服务器批量部署等场景。

weixin_26765287的博客 404

【Android开发】Android界面性能优化

Android系统要求每一帧都要在 16ms 内绘制完成,那么1秒的帧率就是约 60 帧每秒( 1秒 / 0.016帧每秒 = 62.5帧/秒 ),那为什么要以 60 Fps来作为 App 性能的衡量标准呢?这是因为人眼和大脑之间的协作无法感知到超过 60 Fps的画面更新。市面上绝大多数Android设备的屏幕刷新频率是 60 HZ。当然,超过 60 Fps 是没有意义的,人眼感知不到区别。

2401_84519907的博客 699

微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)

本文详细介绍了如何通过Python解密微信图片.dat文件并转换为PNG格式的完整教程。文章深入解析了微信.dat文件的异或加密原理,提供了自动检测密钥的Python脚本,并分享了批量解密和性能优化的实用技巧,帮助用户轻松恢复和整理微信聊天图片。

weixin_29096377的博客 464

Android 渲染性能优化——你需要知道的一切!

本文将分以下几个部分来分析和总结渲染性能:帧率和渲染性能问题、渲染性能问题产生的原因、渲染性能优化方法、分析工具。

卜大爷的博客 2万+

基于Arduino与脑电模块的意念控制LED灯环实现

脑机接口(BCI)技术通过采集和处理脑电信号,实现人脑与外部设备的直接交互。其核心原理是利用传感器捕捉大脑活动产生的微弱电信号,经过放大、滤波和特征提取,转换为可识别的指令。这项技术在医疗康复、神经反馈训练和人机交互等领域具有重要价值。本文聚焦于一个具体的工程实践:使用消费级NeuroSky TGAM模块采集专注度与放松度数据,通过Arduino平台解析信号,并驱动WS2812B LED灯环实现实时可视化反馈。项目涵盖了硬件选型、电路搭建、数据解析和光效映射等关键环节,为脑机接口入门和嵌入式开发提供了完整的

weixin_28721917的博客 277

线性代数 --- 置换矩阵 (Permutation matrix)

置换矩阵 - permutation matrix

松下J27录放机 3万+

Android性能优化-Render篇

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34354173的博客 516

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

weixin_45735391的博客 6万+

Android页面渲染效率优化实践

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!扫描下方二维码免费领取为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

m0_56255097的博客 741

零基础做完YOLOv8船只检测系统:HRSC2016数据集 + 完整UI,稳过答辩

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

FJN110的博客 108

微信开发 - 最新第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

redirect_uri参数错误,微信第三方登录,没有服务器时的测试方法,微信开放平台的回调域名怎么设置为本地域名IP,微信登录微信支付每次调试都需要放到服务器上怎么办,微信登录支付业务在本地调试不了怎么办,在本地怎么测试微信支付和登录,微信第三方登陆本地测试,怎么在本地进行测试,微信回调域怎么设置为本地IP,微信扫码登录redirect_uri参数错误,微信开放平台,微信开放平台开发的第三方登录和支付,vue2,nuxt2,vue3,nuxt3,uniapp,微信开放平台,公众号,微信支付,微信登录授权,

🏆 前端领域优质创作者 8791

Android性能优化之渲染篇

Android性能优化之渲染篇 下面是渲染篇章的学习笔记,部分内容和前面的性能优化典范有重合,欢迎大家一起学习交流! 1)Why Rendering Performance Matters 现在有不少App为了达到很华丽的视觉效果,会需要在界面上层叠很多的视图组件,但是这会很容易引起性能问题。如何平衡Design与Performance就很需要智慧了。 2)Defining ‘Jank’ 大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有办法把这一帧的任务执行完毕,就会

大话程序员 427

高通开发系列 - System之FOTA/DFOTA包制作和升级

高通开发系列 - System之FOTA/DFOTA包制作和升级

fulinux的博客 4222

【Android】性能优化:渲染

Google在Udacity上发布了《Android Performance》的在线课程,介绍了如何通过工具识别和和修复性能问题。课程分为四节:渲染,计算,内存,耗电。比较系统,难度不高,学完大概6~8个小时。有些内容可能稍有过时(后文会提到官方推荐的新的工具及库),但整体还是非常推荐的。性能是软件最基本的需求之一,每个开发人员都应该学一定的性能优化知识。 刷新率&丢帧 有关渲染最基本...

小魏的修行路 3597

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android性能优化之UI渲染

ANR全名Application Not Responding, 也就是"应用无响应".当操作在一段时间内系统无法处理时, 系统层面会弹出ANR对话框.Hierarchy Viewer可以很直接的呈现布局的层次关系,视图组件的各种属性。我们可以通过红,黄,绿三种不同的颜色来区分布局的Measure,Layout,Executive的相对性能表现如何。使用步骤?

程序员Android 299

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android UI性能优化(渲染)

是的开发者学会如何去识别、诊断、解决安卓应用开发中所存在的性能问题。

潘安的博客 646

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android 渲染性能优化——技能图

Android 渲染性能优化——技能图 以上是渲染性能优化技能概览图,详细内容请看: 《Android 渲染机制——原理篇(显示原理全过程解析)》 《Android 渲染性能优化——你需要知道的一切!》 还有更多、更多。。。–> 《Android 性能优化》 ...

卜大爷的博客 2万+

Android性能优化之UI渲染优化

跳过Measure/Layout阶段,直接生成渲染树。:层级从5层减至2层,测量时间减少60%:减少CPU开销30%,降低驱动开销。:避免在硬件加速View中使用。:开启开发者选项中的。

JMY_2016的博客 1388

Android性能优化-如何避免过度渲染?

1)Why Rendering Performance Matters 现在有不少App为了达到很华丽的视觉效果,会需要在界面上层叠很多的视图组件,但是这会很容易引起性能问题。如何平衡Design与Performance就很需要智慧了。 2)Defining ‘Jank’ 大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有办法把这一帧的任务执行完毕,就会发生丢帧的现象。...

weixin_45136073的博客 692

Android 性能优化渲染篇

Android性能优化之渲染篇 APR 11TH, 2015 | COMMENTS Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化性能,这些课程是Google之前在Youtube上发布的Android性能优化典范专题课程的细化与补充。 下面是渲染篇章的学习笔记,部分内容和前面的性能优化典范有重合,欢迎大家...

影音视频技术 636

Android性能优化之渲染

Android性能优化之渲染篇 APR 11TH, 2015 | COMMENTS Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化性能,这些课程是Google之前在Youtube上发布的Android性能优化典范专题课程的细化与补充。 下面是渲染篇章的学习笔记,部分内容和前面的性能优化典范

chenglei_56的专栏 361

Unity安卓项目性能优化:从渲染管线到资源管理的完整调优指南

在移动应用开发中,性能优化是确保流畅用户体验的核心技术环节,尤其对于图形密集型应用。其原理在于通过合理配置硬件资源与软件架构,平衡视觉质量与运行效率,从而提升应用响应速度并降低功耗。这一过程的技术价值在于最大化硬件潜力,避免性能瓶颈,对于用户留存和产品竞争力至关重要。在Unity引擎的安卓开发场景下,性能调优涉及渲染管线选择、资源压缩、内存管理及代码优化等多个层面。例如,采用URP渲染管线能更好地适配移动端,而ASTC纹理压缩和IL2CPP脚本后端则是提升运行效率与包体管理的有效手段。本文聚焦于Unity安

weixin_30247307的博客 403

Android渲染时间 太长,Android性能优化之渲染篇

1)基本概念在一个典型的显示系統中,一般包括CPU、GPU、display三個部分, CPU负责計计算数据,把计算好数据交給GPU,GPU会对图形数据进行渲染,渲染好后放到buffer里存起來,然后display(有的文章也叫屏幕或者显示器)负责把buffer里的数据呈現到屏幕上。很多時候,我們可以把CPU、GPU放在一起说,那么就是包括2部分,CPU/GPU 和display(本文主要按后面这种...

weixin_29419279的博客 1641

【Android性能优化】-页面渲染优化

内存抖动 内存抖动一般指在很短的时间内发生了多次内存分配和释放,严重的内存抖动还会导致应用程序卡顿。内存抖动出现原因主要是短时间频繁的创建对象(可能在循环中创建对象),内存为了应对这种情况,也会频繁的进行GC,因此综合起来就产生了内存抖动,产生了如上图般的锯齿状。 ...

zhujohnle的专栏 9238
上一篇: AndroidStudio3.x 打开Android Device Monitor正确做法
下一篇: Android性能优化——内存
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值