布局渲染笔记
cpu 处理逻辑计算和内存管理,显示操作。
gpu cpu无法显示复杂的图形,gpu用于显示复杂图形,分担cpu的任务
xml布局到屏幕的显示流程:xml 通过 layoutinflater 加载到内存中,然后经过cpu计算处理为多维图形,在通过 opengl 调用gpu,gpu对图形进行栅格化显示到屏幕上,此时如果上面流程在16毫秒内完成,则直接显示到显示器,如果没能完成,则垂直同步等待下一帧完成。
由于人类的眼睛看到画面之帧率高于每秒约10-12帧的时候,就会认为是连贯的;
对于有声电影的拍摄和播放帧率均为每秒24帧,对人是可以接受的,但是早期的高动态电子游戏帧率如果少于每秒30帧的话就会不连贯,因为没有动态模糊使流畅度降低,在于手机交互的过程中,如果触摸反馈60帧以下人是可以感觉出来的,60帧以上不能察觉变化,当手机上帧率低于60fps的时候会感觉画面的卡顿和迟滞现象;
android系统每隔16ms发出信号,触发对ui进行渲染,如果每次渲染都成功,就能达到流程的画面所需要的60fps,为了能够实现60fps,这意味着计算渲染的太多数操作都必须在16ms内完成。
当一帧画面渲染时间超过16ms的时候,垂直同步机制(每隔16ms刷新帧率)会让显示器硬件等待gpu完成栅格化渲染操作,这样会让一帧画面多停留16ms甚至更多,这样就造成了用户看起来画面停顿。
优化:
cpu 减少xml转换成对象的时间,比如减少层级
gpu 减少重复绘制
gpu的绘制过程根据cpu传递的指令来绘制,16ms绘制一次,指令来了就绘制,哪怕是同样的绘制指令,如果层次太深,用户看不到的区域也会被绘制,以及自定义控件中,ondraw方法做了过多的绘制。
android手机开发者选项中,打开gpu过度绘制调试,蓝色 表示绘制了一次,淡绿色表示两次,淡红色表示三次,深红色表示四次。
注意:android的theme-主题中,是自带背景的,可以设置windowbackground为null