CPU与GPU工作流程
CPU的任务繁多,做逻辑计算外,还要做内存管理、显示操作,因此在实际运算的时候性能会大打折扣,在没有GPU的时代,不能显示复杂的图形,其运算速度远更不上今天复杂三维游戏的要求。即使CPU的工作频率超过2GH或更高,对它绘制图形提高也不大,这时GPU的设计就出来了。结构图对比如下:
黄色:Control控制器,用于协调控制整个CPU的运行,包括取出指令、控制其他模块的运行等;
绿色:ALU(Arithmetic Logic Unit),是算术逻辑单元,用于运行数学、逻辑运算;
橙色:Cache和DRAM分别为缓存和RAM,用于存储信息。
从结构图可以看出,CPU的控制器较为复杂,而ALU数量较少,因此CPU擅长各种复杂的逻辑运算,但不擅长数学尤其是浮点运算。
结合到Android的UI绘制流程可以简单的理解为如下关系:
CPU计算画图的方法得到矢量图,而GPU通过像素填充,将矢量图转为位图,绘制显示出来。这个过程就是栅格化。
矢量图:又叫向量图,是用一系列计算机指令来描述和记录一幅图,一幅图可以理解为一些列由点、线、面等组成的子图,它所记录的是对象的几何形状、线条粗细和色彩等
位图:位图又叫点阵图或像素图,计算机屏幕上的图像是由像素构成的,每个点用二进制数据来描述其颜色与宽度等信息,这些点是离散的,类似于点阵,多个像素的色彩组合形成了图像,称之为位图
60Hz刷新频率的由来
- 12fps:由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约10~12帧的时候,就会认为是连贯的
- 24fps:有声电影的拍摄及播放帧率均为美秒24帧,对一般人而言已经算可接受
- 30fps:早期的高动态电子游戏,帧率少于美秒30帧的话就会显得不连贯,这是因为没有动态模糊使流畅度降低
- 60fps:在与手机交互的过程中,如触摸和反馈 60帧以下是能感觉出来的,60帧以上不能察觉变化
- 当帧率低于60fps时感觉画面有卡顿迟滞现象
Android系统每隔16ms发出VSYNC信号(1000ms/60=16.66ms),触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着计算渲染的大多数操作都必须在16ms内完成。这里只是简单的提一下,有个初步的认识,后续会专门用一篇文章来详细分析Android的屏幕刷新机制。
Layout Inspector
- Android studio 自带工具
- 查看视图层级结构
- Tools—> Layout Inspector
Choreographer 检测丢帧(卡顿)
- 获取FPS,线上使用,具备实时性
- API 16之后
- Choreographer.getInstance().postFrameCallback
public class MainActivity extends AppCompatActivity {
private long mStartFrameTime = 0;
private int mFrameCount = 0;
private static final long MONITOR_INTERVAL = 160L; //单次计算FPS使用160毫秒
private static final long MONITOR_INTERVAL_NANOS = MONITOR_INTERVAL * 1000L * 1000L;
private static final long MAX_INTERVAL = 1000L; //设置计算fps的单位时间间隔1000ms,即fps/s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFPS();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void getFPS() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
return;
}
Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
if (mStartFrameTime == 0) {
mStartFrameTime = frameTimeNanos;