Android UI卡顿原因及解决办法

Android UI卡顿原因及解决办法,第1张

渲染机制介绍

为了分析UI卡顿,我们有必要理解一下渲染机制,这厅备敬套渲染机制适用于绝大部分的屏幕渲染,其中包括Android手机等众多屏幕设备。

渲染的一些重要参数:

屏幕刷新理想的频率(硬件的角度):60Hz

理想的一秒内绘制的帧数,帧率(屏幕刷新的角度):60fps

这两个参数都是理想值,指代的都是同一个概念。实际情况中难免会比它们低。在60fps内,系统会得到发送的VSYNC(垂直刷新/绘制)信号去进行渲染,就会正常地绘制出我们需要的图形界面。Android手机进行绘制的时候,GPU帮助我们将UI组件等计算成纹理Texture和三维图形Polygons,同时会使用OpenGL---会将纹理和Polygons缓存在GPU内存里面。

其中,VSYNC:有两个概念

Refresh Rate:屏幕在一秒时间内刷新屏幕的次数----有硬件的参数决定,比如60HZ,即屏幕每秒刷新60次

Frame Rate:GPU在一秒内绘制 *** 作的帧数,比如:60fps,

基本结论

要达到60fps,就要求:每一帧只能停留16ms。(大概就是1000ms/60 ~= 16ms刷新一次)

内存抖动是因为大量的对象被创建又在短时间内马上被释放。

 瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个 *** 作有可能会影响到帧率,并使得用户感知到性能问题。

Android里面是一个三级Generation的内存模型,最近分配的对象会存放在Young Generation区域,当这个对象在这个区域停留的时间达到一定程度,它会被移动到Old Generation,最后到Permanent Generation区域。

Android每个16ms就会绘制一次Activity,通过上述的结论我们知道,如果由于一些原因导致了我们的逻辑、CPU耗时、GPU耗时大于16ms( 应用卡顿的根源就在于16ms内不能完成绘制渲染合成过程,16ms需要完成视图树的所有测量、布局、绘制渲染及合成 ),UI就无法完成一次绘制,那么就会造成卡顿。

比如说,在16ms内,发生了频繁的GC:

在第一个16ms内,UI正常地完成了绘制,那么屏幕不会卡顿。

在第二个16ms内,由于某些原因触发了频发的GC,UI无法在16ms内完成绘制,就会卡顿。

UI卡顿外部和内部常见原因

下面总结一些常见的UI卡顿原因:

  1.内存抖动的问题

 2.方法太耗时了(CPU占用)

    1) CPU计算时间,CPU的测量、布局时间

     2)CPU将计算好的Polygons和Texture传递到GPU的时候也需要时间。OpenGL ES API允许数据上传到GPU后可以对数据进行保存,缓存到display list。因此,我们平移等 *** 作一个扮慎view是几乎不怎么耗时的 。

    3) GPU进行格栅化

当我们的布局是用的FrameLayout的时候,我们可以把它改成merge,可以避免自己的帧布局和系统的ContentFrameLayout帧布局重叠造成重复计算(measure和layout)。

使用ViewStub:当加载的时候才会占用。不加载的时候就是隐藏的,仅仅占用位置。

CPU优化建议

针对CPU的优化,从减轻加工View对象成Polygons和Texture来下手:

View Hierarchy中包涵了太多的没有用的view,这些view根本就不会显示在屏幕上面,一旦触发测量和布局 *** 作,就会拖累应用的性能表现。那么我们就需要利用工具进行分析。

如何找出里面没用的view呢?或者减少不必要的view嵌套。

我们利用工具:Hierarchy Viewer进行检测,优化思想是:查看自己的布局,层次是否很深以及渲染比较耗时,然后想办法能否减少层级以及优化每一个View的滚腔渲染时间。

我们打开APP,然后打开Android Device Monitor,然后切换到Hierarchy Viewer面板。除了看层次结构之外,还可以看到一些耗时的信息:

三个圆点分别代表:测量、布局、绘制三个阶段的性能表现。

1)绿色:渲染的管道阶段,这个视图的渲染速度快于至少一半的其他的视图。

2)黄色:渲染速度比较慢的50%。

3)红色:渲染速度非常慢。

GPU优化建议就是一句话:尽量避免过度绘制(overdraw)

一、背景经常容易造成过度绘制。

手机开发者选项里面找到工具:Debug GPU overdraw,其中,不同颜色代表了绘制了几次:

网络的问题。win10系统ui框架卡住,多数是网络连接异常导致。

1、首先打开电脑检查网络。

2、其次打开win10系统进行测试网络连接是否异丛漏枯常。

3、最后等待网络连接搜雹正常后,在win10系统重新点击ui框架即可解渗洞决。

前面几篇文章都已经将一些iOS图像显示的原理梳理好了,这回正式进入到标题所讲。

相关知识背景:页面滑动的流畅性是60fps,即1s有60帧的画面更新才可以让人感到画面流畅。

如上图所示,在规定的时间内,即16.7ms内(按照1s完成60帧来计算),由CPU和GPU共同协作产生一阵喊兄御数据。CPU在做UI布局,文本计算,图片解码以及绘制等工作占用时间过长,导致郑岩留给GPU的时间就非常少,GPU要想把图层合成和纹理渲染准备完毕,所需的总时间就可能会超过16.7ms,这样在当下这一帧vsync信号到来之前,没有准备好当下这一帧的画面,就产生了掉帧现象,我们肉眼看到的效果就是滑动的卡顿现象。

总结一句话来说,在规定的16.7ms内,在下一个vsync信号到来之前,CPU和GPU配合下并没有完成下一帧图像的完成,就会出现滑动的卡帧记图像的掉帧。

原因知道了,就可以尘世提出相应的优化方案了。可以从CPU和GPU做以下优化:

CPU:

1)对象创建、调整、销毁。

2)预排版(布局计算、文本计算)。

3)预渲染(文本等乙部绘制、图片解码等)。

将以上3点 *** 作放到子线程里做。

GPU:

1.纹理渲染

1)避免离屏渲染。

2)依托于CPU的异步绘制机制来减轻GPU的压力。

2.视图混合

1)如果多个view层层叠加,GPU既要做每个视图的合成,合成每一个像素点的像素值,需要进行大量计算,所以尽量减轻视图的复杂性,大大减轻GPU的压力。

2)也可以采用CPU的异步绘制,使得提交的位图本身就是一个层级很少的视图,也能减轻GPU的压力。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12460473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存