下图为flutter源码部分摘要:
源码链接
Engine::Engine(Delegate& delegate,
const PointerDataDispatcherMaker& dispatcher_maker,
DartVM& vm,
fml::RefPtr<const DartSnapshot> isolate_snapshot,
TaskRunners task_runners,
const WindowData window_data,
Settings settings,
std::unique_ptr<Animator> animator,
fml::WeakPtr<IOManager> io_manager,
fml::RefPtr<SkiaUnrefQueue> unref_queue,
fml::WeakPtr<SnapshotDelegate> snapshot_delegate)
void Engine::ScheduleFrame(bool regenerate_layer_tree) {
animator_->RequestFrame(regenerate_layer_tree);
}
void Animator::RequestFrame(bool regenerate_layer_tree) {
if (regenerate_layer_tree) {
regenerate_layer_tree_ = true;
}
public class VsyncWaiter {
new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
Binding.dart
void Animator::BeginFrame(fml::TimePoint frame_start_time,
fml::TimePoint frame_target_time) {
TRACE_EVENT_ASYNC_END0("flutter", "Frame Request Pending", frame_number_++);
Binding.dart
void drawFrame() {
void Animator::AwaitVSync() {
void VsyncWaiter::AsyncWaitForVsync(const Callback& callback) {
if (!callback) {
return;
}
// |VsyncWaiter|
void VsyncWaiterAndroid::AwaitVSync() {
Choreographer.getInstance()
.postFrameCallback(
new Choreographer.FrameCallback() {
上面为VSYNC注册流程图
Engine.ScheduleFrame Vsync doFrame
下面为Engine层绘制
import android.view.Choreographer;
public final class Choreographer {
@FastNative
private static native void nativeScheduleVsync(long receiverPtr);
// static
void VsyncWaiterAndroid::ConsumePendingCallback(
shared_this->FireCallback(frame_start_time, frame_target_time);
RuntimeController::RuntimeController(
bool RuntimeController::BeginFrame(fml::TimePoint frame_time) {
void Window::BeginFrame(fml::TimePoint frameTime) {
Framework层绘制
packages/flutter/test/scheduler/scheduler_tester.dart
SchedulerBinding.instance.handleBeginFrame(duration);
SchedulerBinding.instance.handleDrawFrame();
}
@override
FrameCallback get onBeginFrame => _window.onBeginFrame;
@override
set onBeginFrame(FrameCallback callback) {
_window.onBeginFrame = callback;
}