android布局渲染,布局渲染流程与优化.md

# 布局渲染与优化

## CPU与GPU

> CPU:擅长各种复杂的逻辑运算,不擅长数学尤其是浮点运算。

>> Control>用于协调控制真个CPU运行,包括去除指令、控制其他模块的运行等;

>> ALU>算术逻辑单元,用于进行数学逻辑运算;

>> Cache>缓存,储存信息;

>> DRAM>RAM,储存信息;

> GPU: 为了帮助CPU分担绘制图形压力而设计出来

## Xml布局显示到屏幕的流程

Xml布局=>LayoutInflater加载进内存=>CPU计算Xml的属性信息=>处理为多维向量图形=>CPU将图形交给GPU=>GPU绘制图形

* 栅格化:将向量图形格式表示的图像转换成位图以用于显示器

CPU将UI对象转换成多维图形=>通过openGL调用GPU=>GPU对图形进行栅格化=>如果在16ms内完成则显示器直接显示/如果超过16ms则垂直同步等待下一帧完成

## FPS

> 60Hz刷新频率的由来

12fps:由于人眼的特殊生理结构,如果所看画面之帧率高于每秒约10-12帧的时候就会认为u是连贯的

24fps:有声电影的拍摄及播放帧率均为24帧,对一般人而言又算可以接受

30fps:早期的高动态电子游戏,帧率小于30帧/秒的话会显得不连贯,这是因为没有动态模糊是流畅度降低

60fps:在与手机交互过程中,如果触摸和反馈60帧以下是忍能感觉出来的。60帧以上不能察觉变化

Android系统每隔16ms发出VSYNC信号(1000ms/60≈16ms),触发对UI进行渲染,如果每次渲染都成功这样就能够达到流畅的画面所需要的60fps,

为了能够实现60fps,计算渲染的大多数操作都必须在16ms内完成

## 卡顿原理分析

> 当一帧画面渲染时间超过16ms的时候,处置同步机制会让显示器硬件等待GPU完成栅格化渲染操作

这样会让这一帧画面多停留了16ms甚至更对,这样就造成了用户看起来画面停顿

1. 16ms主要被两件事占用

+ 将UI对象转换成多边形和纹理

+ CPU传递数据到GPU,GPU进行绘制

2. 如何减少这两部分时间

+ CPU减少xml转换成对象的时间(层级不要太深)

+ GPU减少重复绘制

## 过度绘制

> 1. GPU根据CPU传递的指令来进行绘制,CPU让GPU画什么GPU就画什么,16ms画一次;

这样就造成有些图像被其他图像覆盖,底下以及上面的图象都要绘制,造成没有必要的浪费。

> 2. 过度绘制的几种情况:

+ 布局层级太深,用户看不到的区域也会被绘制

+ 自定义控件中,onDraw方法醉了过多的绘制

## 过度绘制查看工具

> 在手机的开发者选项中=>调试GPU过度绘制

+ 蓝色: 过度绘制一次 无过度绘制

+ 淡绿: 过度绘制2次

+ 淡红: 过度绘制3次

+ 深红: 过度绘制4次

## 优化

1. 不重复设置背景色()

2. 裁剪被遮挡的图片()

## 总结

> + 布局中的背景是否有必要

> + 是否可以删除多余布局

> + 自定义View是否进行了裁剪

> + 布局是否足够扁平化

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值