前面讲到Flutter Dart层面的显示Image的逻辑,其中咱们能够看到ui.instantiateImageCodec(bytes)的方法,咱们今天就从这里入手带你们看看Flutter-engine内部对于获取Image数据以后作了什么。ui
instantiateImageCodec对应在Flutter-engine里面的方法是InstantiateImageCodec,里面的逻辑其实就是获取从Dart层的各个参数,根据不一样的参数生成了一个Codec句柄,这个Codec句柄上面有分别有实现了MultiFrameCodec或者SingleFrameCodec的ui_codec,而后再返回到Dart层。线程
其中MakeFromData(buffer) 是关键方法,它里面其实就是获取了收集到的image数据去分析而后返回了不一样的Codec。 3d
咱们能够在Dart层调用的时候看到了一句_nextFrame = await _codec.getNextFrame(); 那么getNextFrame是怎样走呢?咱们能够看到getNextFrame方法是属于MultiFrameCodec的。其实方法里面看起来是很简单的,里面作了几个事情。 1.先获取UI Task线程。 2.获取当前Skia处理的Queue 3.获取上下文 4.切换到IO线程中运行GetNextFrameAndInvokeCallbackcode
GetNextFrameAndInvokeCallback 里面分为了三个步骤cdn
作的事情大体就是获取下一帧的SkImage数据,而且保存了上一帧的关键数据。这里咱们能够看到有屡次Copy的操做,因此这些操做都是在IO线程中的。 blog
这里作的事情大概就是获取刚刚从GetNextFrameImage中拿到的SkImage,而且将它塞到了FrameInfo的结构体里面,而且改变下一帧的index。而后在UI线程中Callback回去。图片
这里作的事情其实就是选择Codec而后解析图片,而后整个流程都是在IO线程中处理的。get
谢谢阅读it