Android Performance Patterns: In
当你更新view的时候,要记住Android在你的设备上绘制图像前,都会将XML文件,转化为CPU可以接受的文件,然后进行屏幕渲染。这要借助一个内部对象,它叫显示列表(Display List)。
image.png
显示列表基本上包含了所有用户GPU渲染的所需信息。它包含了一个列表,里面有任何可能用到的CPU资源。还有一个列表,包含了渲染时执行OpenGL所需的所有命令,在首次进行视觉渲染时,会生成一个列表,当我们需要渲染屏幕上的视图时,我们通过提交绘图命令至GPU来执行显示列表。
如果将来还想再次渲染这个视图,比如仅在屏幕上变换了位置时,我们只需要再次执行显示列表,但是,在将来,视图的某些部分会改变,之前的显示列表可能不再有效,因此我们需要返回并重新生成显示列表,并再次执行,从而在屏幕上更新。
但是请记住,每次视图绘制内容更改时,它都会重复显示列表的生成过程,并且在屏幕上再次执行,它的性能也各不相同,要根据视图的具体复杂度来定。
根据视图的可视化变化,对渲染途径也会产生影响。
例如,一个文字框突然增大了一倍,导致父容器必须在更新自己大小前,重新摆放兄弟视图,这种情况下,我们更新了一个视图,它将其他需要改动的工作进行了串联。这些类型的可视化更改要求出现渲染途径的额外阶段。
当你的视图的大小更改时,衡量阶段会开始,它会浏览你视图的层级,要求每一个视图提供新的大小,如果你改变了物体的位置,要进行布局要求,或者如果一个群组重置了它的子集,布局阶段也会启动,并穿过层级。计算出每个图形应该被放置在何处。
一定要注意,这些阶段都需要时间来运行的,它们独立运行是可能不会有太大影响,但是当大量视图变无效或更改时,这就造成巨大的性能损耗了,也就是说想要提升渲染系统的整体性能,布局失效最小化(Minimize These)是一个不错的开端。
image.png
当然,你需要一些方法,来获得更加详细的信息,了解你的问题都表现在何处。
首先你可以打开设备的GPU配置渲染工具,以便更好了解你的渲染管道,看看它出现了什么问题,这能帮你便捷快速的了解你的渲染通道,以及它的生产,执行及处理的比例。
GPU配置渲染工具
其次,你可以初步了解你的应用中出现了什么类型的失效,通过开启显示GPU视图更新选项,任何时候,你的应用出现失效的话,你都会看见失效部分短暂的变成红色,这可以帮你了解屏幕的哪些部分变无效了,操作就是这么简单。
开启显示GPU视图更新选项
第三,要保证你经常使用Hierarchy Viewer,检查你的视图层次,尽量保持它的平整。试着移除多余的视图,这会帮你减少布局支出,并且能在其出现是衡量阶段。
Hierarchy Viewer
搬运:Android Performance Patterns: Invalidations, Layouts, and Performance