Flutter framework engine源碼初探

下圖爲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;
  }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章