我们直接分析 Choreographer 。
1 Choreographer :
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
然后会调用 ViewRootImpl 的 mTraversalRunnable ,到 doTraversal()方法 。
Choreographer.CALLBACK_TRAVERSAL 是指什么 ?
/**
* Callback type: Traversal callback. Handles layout and draw. Runs
* after all other asynchronous messages have been handled.
* @hide
*/
public static final int CALLBACK_TRAVERSAL = 3;
首先 有5种 :
public static final int CALLBACK_INPUT = 0;
public static final int CALLBACK_ANIMATION = 1;
public static final int CALLBACK_INSETS_ANIMATION = 2;
public static final int CALLBACK_TRAVERSAL = 3;
public static final int CALLBACK_COMMIT = 4;
doFrame 依次调用上述的 5类 doCallbacks 。
什么是DisplayEventReceiver?:
DisplayEventReceiver :用来接受硬件的 vertical sync 事件 。
在构造函数中调用 jni的 nativeInit 。
jni: android_view_DisplayEventReceiver.cpp
何时回调 onVsync ?
在 jni的nativeInit中 ,创建了一个NativeDisplayEventReceiver, 并调用它的initialize()方法;
##########################以下分析都是Native代码####################################
什么是NativeDisplayEventReceiver?:
NativeDisplayEventReceiver 继承 DisplayEventDispatcher,
DisplayEventDispatcher解析:
native 端也有 一个 DisplayEventReceiver 类 :
DisplayEventReceiver 解析:
有一个变量mDataChannel, 这个是来自于调用 sf 的createDisplayEventConnection方法,
这个 mDataChannel 就是
EventThreadConnection::postEvent方法会发送事件到 mDataChannel 这个fd , ,
EventThread::dispatchEvent 调用 EventThreadConnection::postEvent ,
EventThread::threadMain 调用 EventThread::dispatchEvent ,
EventThread的 mPendingEvents表示还没有处理的事件,还没有发给客户端的事件,
EventThread 收到VSync事件的处理如下:
void EventThread::onVSyncEvent(nsecs_t timestamp, VSyncSource::VSyncData vsyncData) {
std::lock_guard<std::mutex> lock(mMutex);
LOG_FATAL_IF(!mVSyncState);
mPendingEvents.push_back(makeVSync(mVSyncState->displayId, timestamp, ++mVSyncState->count,
vsyncData.expectedPresentationTime,
vsyncData.deadlineTimestamp));
mCondition.notify_all();
}
就是往 mPendingEvents 插入一个 VSync事件 ,然后唤醒发送线程。
EventThread::onVSyncEvent 被谁调用?
被DispSyncSource::onVsyncCallback 调用
DispSyncSource::onVsyncCallback 被谁调用?
CallbackRepeater 的 callback 方法调用 。
其实是调用了 VSyncDispatch 的registerCallback 方法 。
VSyncDispatch 的子类有 VSyncDispatchTimerQueue:
最终是把这个方法放进去了 VSyncDispatchTimerQueue 的 mCallbacks 中 。
VSyncDispatchTimerQueue::timerCallback() 被谁调用?
TimeKeeper的 alarmAt 在指定时间执行callback 。
实现原理是创建了一个timerfd ,然后放入epoll 中 。
CallbackRepeater 解析:
VSyncCallbackRegistration 解析:
VSyncDispatch::CallbackToken mToken;
方法:
schedule :
cancel :
何时调用DisplayEventDispatcher::handleEvent 方法 ?:
handleEvent 是 LooperCallback 的方法 。
所以这个方法自然是looper所监听的fd有事件发生时调用的。