从源码分析choreographer是如何实现vsync信号的请求及帧的刷新处理?(android q)
时间: 2023-12-27 22:01:13 浏览: 168
Choreographer是Android系统中用来协调View的绘制和动画的工具类之一。在Android Q中,Choreographer是如何实现vsync信号的请求及帧的刷新处理呢?让我们来从源码分析一下。
Choreographer类中有一个单例实例sInstance,它负责管理整个系统的动画和视图刷新。当一个View需要重绘或动画时,会向Choreographer发送vsync信号请求。这个请求会被传递到Choreographer对象的scheduleFrameLocked方法中。
在scheduleFrameLocked方法中,Choreographer会根据当前时间和下一帧的预期时间计算出下一帧应该何时开始绘制。然后,Choreographer会将刷新请求发送给所有注册过的Choreographer.FrameCallback回调。
Choreographer.FrameCallback是一个接口,用来监听下一帧应该开始绘制时的回调。这个回调会被注册到Choreographer的列表中,当下一帧到来时,Choreographer会依次调用所有注册的回调。
在回调中,系统会调用ViewRootImpl的doTraversal方法来触发视图的绘制和布局过程。这样,Choreographer就实现了vsync信号的请求及帧的刷新处理。
总的来说,Choreographer通过计算下一帧的绘制时间并注册一个回调来实现vsync信号的请求及帧的刷新处理。这个机制保证了视图的流畅绘制和动画效果。
相关问题
Choreographer::postCallbackDelayedInternal 源码分析
Choreographer::postCallbackDelayedInternal 是 Android 系统中一个非常重要的方法,用于将一个 Runnable 对象投递给 Choreographer ,以便在下一次 VSync 信号到来时执行该 Runnable 对象。该方法源码如下:
```java
private void postCallbackDelayedInternal(int callbackType, Runnable action, Object token, long delayMillis) {
synchronized (mLock) {
// 如果 Choreographer 已经停止工作,则直接返回
if (mCallbacks == null) {
return;
}
final long now = SystemClock.uptimeMillis();
final long when = now + delayMillis;
// 将任务封装成 ChoreographerCallback 对象
final CallbackRecord callbacks = obtainCallbackLocked(callbackType, action, token, when);
// 将 ChoreographerCallback 对象添加到任务队列中
addCallbackLocked(when, callbacks);
// 如果任务队列中的任务数量超过了阈值,则向 Choreographer 发送消息
if (mFrameScheduled || (mFrameScheduled = mLooper.getQueue().isPolling())) {
mTraversalScheduled = false;
mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
} else if (!mTraversalScheduled) {
mTraversalScheduled = true;
// 如果任务队列中的任务数量未超过阈值,则将提交遍历任务的操作延迟一段时间
mChoreographer.postCallbackDelayed(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null,
FRAME_TIMEOUT_MS - delayMillis);
}
}
}
```
该方法主要有以下几个步骤:
1. 判断 Choreographer 是否已经停止工作,如果已经停止,则直接返回。
2. 将任务封装成 ChoreographerCallback 对象。
3. 将 ChoreographerCallback 对象添加到任务队列中。
4. 判断任务队列中的任务数量是否超过阈值,如果超过则向 Choreographer 发送消息,否则将提交遍历任务的操作延迟一段时间。
其中,步骤 2 和步骤 3 的实现比较简单,这里不再赘述,主要介绍一下步骤 4。
在 Android 系统中,Choreographer 是一个用于协调应用程序 UI 绘制和动画的系统组件,它的主要作用是通过 VSync 信号来同步应用程序的 UI 绘制和动画,保证帧率的稳定性和流畅性。Choreographer 在初始化时会创建一个 Handler 对象,并且在 Handler 中注册了一个消息回调函数,当 Handler 接收到消息时,就会执行该消息回调函数。
在 Choreographer 中,有两个回调函数,一个是 CALLBACK_TRAVERSAL,另一个是 CALLBACK_COMMIT。其中 CALLBACK_TRAVERSAL 用于执行应用程序的 UI 绘制操作,CALLBACK_COMMIT 用于执行应用程序的动画操作。Choreographer 会根据任务队列中的任务类型来决定将任务添加到哪个回调函数中。
在步骤 4 中,如果任务队列中的任务数量超过了阈值,Choreographer 就会向 Handler 发送 CALLBACK_TRAVERSAL 消息,并执行 CALLBACK_TRAVERSAL 回调函数中的任务。如果任务队列中的任务数量未超过阈值,Choreographer 就会将提交遍历任务的操作延迟一段时间,并延迟执行 CALLBACK_TRAVERSAL 回调函数中的任务。这样做的目的是为了尽量保证应用程序的帧率稳定性和流畅性。
android Choreographer结束
Choreographer是Android平台上负责UI渲染的一个重要组件,它主要负责控制UI动画的渲染过程,确保UI的流畅性和稳定性。Choreographer的结束指的是UI动画的结束,也就是动画完成后的状态。
当一个UI动画结束时,Choreographer会根据动画的状态和属性的变化,重新计算UI的布局和绘制,确保UI元素的位置和状态与最终动画状态一致。同时,Choreographer还会释放动画相关的资源,如内存等,以便系统能够更好地处理其他任务。
总之,Choreographer的结束是UI动画完成后的一个重要步骤,它确保了UI的稳定性和流畅性。
阅读全文