当前位置: 首页 > news >正文

Flutter的线程模型

      

        在Flutter框架中,Embedder层负责把Flutter嵌入到各个平台上去,其所做的主要工作包括线程设置、渲染Surface设置,以及插件等。因此, Embedder负责线程的创建和管理,并且提供Task RunnerEngine使用。Engine则是负责提供IsolateFramework和应用层进行多线程创建。

        Embeder主要包含四个Task RunnerPlatform RunnerUI RunnerGPU RunnerIO Runner。 其中,每个Flutter Engine都会有独立的UI RunnerGPU RunnerIO Runner,而Platform Runner在Engine间是共享的。

    Platform Runner之所以在多个Engine中之存在一份,主要由于Platform Runner运行在平台的Main Thread,负责执行Flutter Engine的代码和Native Plugin任务。如果在Platform Runner中运行耗时任务,会影响原生平台任务的正常执行。但是Platform Runner被阻塞后并不会导致页面卡顿。因为Platform Runner不负责Flutter的页面渲染。

        我们所写的Dart代码默认是运行在 Root Isolate中,而Root Isolate是运行在UI Runner上的。UI Runner负责创建管理Layer Tree最终绘制到屏幕上的内容,因此这个线程被阻塞会直接导致界面卡顿掉帧。

         IsolateDart平台对线程的实现方案。和普通Thread不同,Isolate 拥有独立的内存,由线程和独立内存构成。Isolate通过事件循环和消息队列来实现单线程异步并发,这比多线程要轻便的多,由于Dart基于单线程模型,所以开发过程中不需要关心线程安全问题。

        GPU Task Runner则被用于执行与设备GPU相关的调用。虽然GPU线程是一个独立线程,但由于UI的布局、绘制、渲染、上屏由CPU和GPU共同完成,因此,如果GPU Task Runner耗时太久,同样会造成Flutter应用的卡顿。所以在GPU Task Runner中,不能执行耗时操作。

        IO Runner主要功能是网络、文件等IO操作(比如从后台请求网络数据,或者从磁盘中读取压缩的图片格式,将图片数据进行处理为GPU Runner的渲染做好准备)。之所以将IO操作设计为在独立线程中运行,主要是就是为了避免对UI刷新造成不利影响。        

        问题:如果我们在Dart代码中执行网络请求、文件读取等使用Future来进行异步,会不会导致UI卡顿?

        答案是否定的。原因是网络请求、文件读取等耗时操作当运行到系统IO接口时,会将IO任务交给系统线程处理,并将异步任务加入到事件队列,然后Root Isolate回到事件循环,获取事件队列中的下一个任务进行处理。

        而执行大量高CPU的运算类耗时任务,如耗时计算,编解码等,即便代码是异步执行,由于所有代码都运行在Root Isolate中,所以仍然会导致Root Isolate没法及时处理其他异步任务,从而导致UI卡顿。所以对于高CPU耗时任务,应该使用新的Isolate去执行。

        总结:平时我们做UI卡顿相关优化, 主要关注UI Runner和GPU Runner即可。

        在UI Runner主要是要注意避免不必要的UI的更新和重建, 将复杂的CPU操作另启一个新的线程处理;而对于GPU Runner,主要是要尽可能降低页面布局层级、减少透明视图的使用,进而降低GPU渲染的复杂度。

相关文章:

  • Gitlab 安装部署
  • Backend - 日志记录
  • 美摄科技实时语音数字人解决方案
  • 20240304金融读报:票据贴现数据挖掘与新质生产力信贷创新
  • STM32启动过程及反汇编
  • 设计模式——外观模式
  • Webpack配置与运行基础教程
  • 初学者学习51还是STM32
  • 猴子吃桃问题(python版)
  • (学习日记)2024.03.03:UCOSIII第五节:常用汇编指令+OS初始化+启动任务+任务切换
  • 算法:动态规划
  • SAP PP学习笔记04 - BOM2 -通过Serial来做简单的BOM变式配置,副明细,BOM状态,BOM明细状态,项目种类,递归BOM
  • 在java java.util.Date 已知逝去时间怎么求年月日 数学计算不用其他方法
  • 命名空间(namespace)
  • nginx使用详解--动静分离
  • 每天学习2小时——黑客(网络安全)技术
  • [LeetBook]【学习日记】寻找链表相交节点
  • day57 集合 List Set Map
  • 服务器git安装python包失败,如何手动下载github项目包并安装到虚拟环境中(简单易懂)
  • 【JavaScript 漫游】【029】GlobalEventHandlers 接口总结
  • 贵州赤水被指“整改复耕”存形式主义,当地部署耕地流出整改“回头看”
  • 乌克兰关切有中国人在俄军中服务,外交部:坚决反对无端指责
  • 金地集团:保交楼为经营的首要任务,将根据融资性现金流恢复程度等进行投资决策
  • 门票在“缩水”,古镇怎么办
  • 都市文化·商业演剧·海派艺术:早期上海话剧商演发展新探索
  • 蔚来第三品牌萤火虫上市:对标宝马MINI,预期贡献10%销量