Flutter-engine 显示Image逻辑

前言

前面讲到Flutter Dart层面的显示Image的逻辑,其中咱们能够看到ui.instantiateImageCodec(bytes)的方法,咱们今天就从这里入手带你们看看Flutter-engine内部对于获取Image数据以后作了什么。ui

正文

InstantiateImageCodec

instantiateImageCodec对应在Flutter-engine里面的方法是InstantiateImageCodec,里面的逻辑其实就是获取从Dart层的各个参数,根据不一样的参数生成了一个Codec句柄,这个Codec句柄上面有分别有实现了MultiFrameCodec或者SingleFrameCodec的ui_codec,而后再返回到Dart层。线程

其中MakeFromData(buffer) 是关键方法,它里面其实就是获取了收集到的image数据去分析而后返回了不一样的Codec。 3d

GetNextFrame

咱们能够在Dart层调用的时候看到了一句_nextFrame = await _codec.getNextFrame(); 那么getNextFrame是怎样走呢?咱们能够看到getNextFrame方法是属于MultiFrameCodec的。其实方法里面看起来是很简单的,里面作了几个事情。 1.先获取UI Task线程。 2.获取当前Skia处理的Queue 3.获取上下文 4.切换到IO线程中运行GetNextFrameAndInvokeCallbackcode

GetNextFrameAndInvokeCallback 里面分为了三个步骤cdn

GetNextFrameImage

作的事情大体就是获取下一帧的SkImage数据,而且保存了上一帧的关键数据。这里咱们能够看到有屡次Copy的操做,因此这些操做都是在IO线程中的。 blog

InvokeCallback

这里作的事情大概就是获取刚刚从GetNextFrameImage中拿到的SkImage,而且将它塞到了FrameInfo的结构体里面,而且改变下一帧的index。而后在UI线程中Callback回去。图片

总结

这里作的事情其实就是选择Codec而后解析图片,而后整个流程都是在IO线程中处理的。get

谢谢阅读it

相关文章
相关标签/搜索