南阳哪里做网站比较好,广州网站推广排名,优秀的设计,阿里能帮做网站吗Android编舞者类Choreographer小结
作用
编舞者类的作用主要是控制绘制节奏#xff0c;用于发起一次vsync垂直同步信号的监听#xff0c;当垂直同步信号来的时候会回调注册的Runnable或者FramCallback
Choreographer对象获取
Choreographer对象是通过它的getInstance方法…Android编舞者类Choreographer小结
作用
编舞者类的作用主要是控制绘制节奏用于发起一次vsync垂直同步信号的监听当垂直同步信号来的时候会回调注册的Runnable或者FramCallback
Choreographer对象获取
Choreographer对象是通过它的getInstance方法获取实例虽然看名字是单例但是它是保存在ThreadLocal中每个线程都会有一个唯一的实例而不是全局单例
同步信号请求过程 在ViewRootImpl的scheduleTraversals方法中会先设置一个同步屏障然后调用编舞者类的postCallback方法发起一次请求同步信号 postCallback和postFrameCallback的区别主要在于请求的垂直同步信号的类型不同postFrameCallback请求的类型是animation回调的对象类型是FrameCallback而postCallback可以自定义传入任何类型的垂直同步信号执行的回调对象类型是Runnable 编舞者类会把这个Callback根据类型和时间的先后顺序保存到队列中队列的实现方式是单链表结构Callback的类型有五种input、animation、inserts_animation、traversal、commit 然后判断当前线程是否主线程如果不是的话则通过Handler发送消息到主线程去执行如果是主线程则立刻调用native方法发起一次同步信号请求 当垂直同步信号来的时候会回调响应的方法最后会调用doFrame方法去处理垂直同步信号 在doFrame方法里面 先根据当前时间减去垂直同步信号的时间计算时间差判断有没有跳帧如果有跳帧并且超过30帧则打印Log并且会重新计算当前帧的绘制时间 如果计算后当前帧的时间小于上一次帧绘制时间则会重新发起一次垂直同步信号请求 接着从五个队列中依次取出各个Callback并调用相应方法Runnable调用run方法FrameCallback调用doFrame方法 接着ViewRootImpl就开始调用doTraversal-performTraversal-performMeasure-performLayout-performDraw开始绘制 问答
Q: 我们都知道Android的刷新频率是60帧/秒这是不是意味着每隔16ms就会调用一次onDraw方法
A: 不是只有当界面需要刷新并且编舞者请求的垂直同步信号到达时才会调用 Q: 如果界面不需要重绘那么还16ms到后还会刷新屏幕吗 A: 会的但是刷新的是旧的数据 Q: 我们调用invalidate()之后会马上进行屏幕刷新吗 A: 不会的需要等待下一次垂直同步信号才会刷新 Q: 我们说丢帧是因为主线程做了耗时操作为什么主线程做了耗时操作就会引起丢帧 A:因为垂直同步信号是由底层发出的而且发出的时间间隔是一样的如果主线程做了耗时操作会导致编舞者类接收到垂直同步信号的时间比较晚界面就不能及时刷新从而引起丢帧和界面卡顿 Q: 如果在屏幕快要刷新的时候才去OnDraw绘制会丢帧吗 A: 不会屏幕刷新也是跟着垂直同步信号走的当垂直信号到了的时候才会触发onDraw方法绘制跟丢帧没有关系