前面講到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