前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >10分钟了解Flutter跨平台运行原理!

10分钟了解Flutter跨平台运行原理!

作者头像
腾讯云开发者
发布于 2021-09-28 01:41:34
发布于 2021-09-28 01:41:34
7.1K0
举报

导语 | 本文将从选型、简介和运行原理三大部分为你介绍Flutter的相关概念,希望能站在框架设计和实现原理的高度,带领大家去理解Flutter区别其他跨平台解决方案的关键所在。

一、为什么选择Flutter

随着无线时代的来临,怎么样用最标准化的手段能够让更多的人开发这个页面、怎么样能够提供像H5一样标准的页面,成为大前端时代开发者们最关心的事情。

我们把时间线拉长,来看看移动端跨平台技术经过了一个怎样的发展史:下面主要介绍在这个发展过程中跨平台技术有了哪些进步或者做了哪些优化。

Ionic/Cordova(Hybrid): 在技术原理上的核心是,将原生的一些能力通过JSBridge封装给Web来调用,扩充了Web应用能力。但是这种方法有两个不足,一是依赖客户端,二是在性能和体验上都非常依赖于Web端。因此,整体上的体验不可预知。目前这个技术还经常被应用到,例如,当前App内会提供白名单域名和可调用的JSBridge方法,由此来增强H5与客户端交互能力,从而提升App内H5的灵活性。

React Native/Weex: 在原来的Hybrid的JSBridge基础上进行改进,将JavaScript的界面以及交互转化为Native的控件,从而在体验上和原生界面基本一致。但因为是JIT模式,因此需要频繁地在JavaScript与Native之间进行通信,从而会有一定的性能损耗影响,导致体验上与原生会有一些差异。

Flutter: 取长补短,结合了之前的一些优点,解决了与Native之间通信的问题,同时也有了自渲染模式(框架自身实现了一套UI基础框架,与原来的渲染模式基本一致)。从而在体验和性能上相对之前的两种框架表现都较好。

选择Flutter并不是为了代替iOS或者Android,而是做一个技术互补,比如,Flutter负责业务功能,而iOS和Android则负责部分的底层交互提供服务给到Flutter应用,这里大胆预测一下未来跨端技术团队的组成: 

二、Flutter简介

Flutter是一款移动应用程序跨平台框架,使用一种语言(Dart)编写的同一份代码可以生成iOS和Android两个高性能、高保真的应用程序。

Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。兼容滚动行为、排版、图标等方面的差异。那么Flutter是如何编译成原生app的呢?

Flutter不借助原生的渲染能力,而是自己实现了一套与Android和iOS一样的渲染原理,从而在性能上与原生平台保持基本一致。不过这里由于目前 Flutter只是一个UI框架,因此在原生功能方面还是需要依赖原生平台,这也是它存在的一些问题。

三、Flutter运行原理

如前面已提到的那样,Flutter是重写了一整套包括底层渲染逻辑和上层开发语言的完整解决方案。这样不仅可以保证视图渲染在Android和iOS上的高度一致性(即高保真),在代码执行效率和渲染性能上也可以媲美原生App的体验(即高性能)。那Flutter是怎么运行的呢?

我们从图像显示的基本原理说起。

在计算机系统中,图像的显示需要CPU、GPU和显示器一起配合完成:CPU负责图像数据计算,GPU负责图像数据渲染,而显示器则负责最终图像显示。

CPU把计算好的、需要显示的内容交给GPU,由GPU完成渲染后放入帧缓冲区,随后视频控制器根据垂直同步信号(VSync)以每秒60次的速度,从帧缓冲区读取帧数据交由显示器完成图像显示。

操作系统在呈现图像时遵循了这种机制,而Flutter作为跨平台开发框架也采用了这种底层方案。下面有一张更为详尽的示意图来解释Flutter的绘制原理。

可以看到,Flutter关注如何尽可能快地在两个硬件时钟的VSync信号之间计算并合成视图数据,然后通过Skia交给GPU渲染:UI线程使用Dart来构建视图结构数据,这些数据会在GPU线程进行图层合成,随后交给Skia引擎加工成GPU数据,而这些数据会通过OpenGL最终提供给GPU渲染。

在进一步学习Flutter之前,我们有必要了解下构建Flutter的关键技术,即Skia和Dart。

备注

  1. Skia是一款用C++开发的、性能彪悍的2D图像绘制引擎,Skia保证了同一套代码调用在Android和iOS平台上的渲染效果是完全一致的。
  2. Dart是一个专注于前端(mobile/web)UI(用户交互)开发的强类型语言。

在了解了Flutter的基本运作机制后,我们再来深入了解一下Flutter的实现原理。

首先,我们来看一下Flutter的架构图。我希望通过这张图以及对应的解读,你能在开始学习的时候就建立起对Flutter的整体印象。

注:此图引自Flutter System Overview

Flutter架构采用分层设计,从下到上分为三层,依次为Embedder、Engine和Framework。

Embedder是操作系统适配层,实现了渲染Surface设置、线程设置以及平台插件等平台相关特性的适配。从这里我们可以看到,Flutter平台相关特性并不多,这就使得从框架层面保持跨端一致性的成本相对较低。

Engine层主要包含Skia、Dart和Text,实现了Flutter的渲染引擎、文字排版、事件处理和Dart运行时等功能。Skia和Text为上层接口提供了调用底层渲染和排版的能力,Dart则为Flutter提供了运行时调用Dart和渲染引擎的能力。而Engine层的作用,则是将它们组合起来,从它们生成的数据中实现视图渲染。

Framework层则是一个用Dart实现的UI SDK,包含了动画、图形绘制和手势识别等功能。为了在绘制控件等固定样式的图形时提供更直观、更方便的接口,Flutter还基于这些基础能力,根据Material和Cupertino两种视觉设计风格封装了一套UI组件库。我们在开发Flutter的时候,可以直接使用这些组件库。

接下来,以界面渲染过程为例,介绍Flutter是如何工作的

页面中的各界面元素(Widget)以树的形式组织,即控件树。Flutter通过控件树中的每个控件创建不同类型的渲染对象,组成渲染对象树。而渲染对象树在Flutter的展示过程分为三个阶段:布局、绘制、合成和渲染。

(一)布局

Flutter采用深度优先机制遍历渲染对象树,决定渲染对象树中各渲染对象在屏幕上的位置和尺寸。在布局过程中,渲染对象树中的每个渲染对象都会接收父对象的布局约束参数,决定自己的大小,然后父对象按照控件逻辑决定各个子对象的位置,完成布局过程。

为了防止因子节点发生变化而导致整个控件树重新布局,Flutter加入了一个机制——布局边界(Relayout Boundary),可以在某些节点自动或手动地设置布局边界,当边界内的任何对象发生重新布局时,不会影响边界外的对象,反之亦然。

(二)绘制

布局完成后,渲染对象树中的每个节点都有了明确的尺寸和位置。Flutter会把所有的渲染对象绘制到不同的图层上。与布局过程一样,绘制过程也是深度优先遍历,而且总是先绘制自身,再绘制子节点。

以下图为例:节点1在绘制完自身后,会再绘制节点2,然后绘制它的子节点3、4和5,最后绘制节点6。

可以看到,由于一些其他原因(比如,视图手动合并)导致2的子节点5与它的兄弟节点6处于了同一层,这样会导致当节点2需要重绘的时候,与其无关的节点6也会被重绘,带来性能损耗。

为了解决这一问题,Flutter提出了与布局边界对应的机制——重绘边界(Repaint Boundary)。在重绘边界内,Flutter会强制切换新的图层,这样就可以避免边界内外的互相影响,避免无关内容置于同一图层引起不必要的重绘。

重绘边界的一个典型场景是Scrollview。ScrollView滚动的时候需要刷新视图内容,从而触发内容重绘。而当滚动内容重绘时,一般情况下其他内容是不需要重绘的,这时候重绘边界就派上用场了。

(三)合成和渲染

终端设备的页面越来越复杂,因此Flutter的渲染树层级通常很多,直接交付给渲染引擎进行多图层渲染,可能会出现大量渲染内容的重复绘制,所以还需要先进行一次图层合成,即将所有的图层根据大小、层级、透明度等规则计算出最终的显示效果,将相同的图层归类合并,简化渲染树,提高渲染效率。

合并完成后,Flutter会将几何图层数据交由Skia引擎加工成二维图像数据,最终交由GPU进行渲染,完成界面的展示。

四、总结

咱们从各种业界主流跨端方案与Flutter的对比开始,到Flutter的简要介绍以及Flutter的运行机制,并以界面渲染过程为例,从布局、绘制、合成和渲染三个阶段讲述了Flutter的实现原理。相信大家对Flutter已经有一个整体认知,赶快一起上手操作起来吧!

 作者简介

宾俊文

腾讯IEG直播业务部 前端工程师

腾讯IEG直播业务部前端工程师。正在为成为极具影响力的工程师而努力!

 推荐阅读

如何在C++20中实现Coroutine及相关任务调度器?(实例教学)

拒绝千篇一律,这套Go错误处理的完整解决方案值得一看!

10个技巧!实现Vue.js极致性能优化(建议收藏)

为什么WebAssembly不是JavaScript的终结者,而是它的“助推器”?


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
所以,最成功的跨平台开发方案其实是依托于浏览器控件的Web。浏览器保证了99%的概率下Web的需求都是可以实现的,不需要业务将就“技术”。不过,Web最大的问题在于它的性能和体验与原生开发存在肉眼可感知的差异,因此并不适用于对体验要求较高的场景。
JavaEdge
2023/07/09
5770
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
Flutter区别于其他技术的关键是什么?
上一篇文章中我们了解到,跨端方案经历了三个阶段,第一阶段是混合开发的Web容器时代,第二阶段是以RN和Weex为代表的泛Web容器时代,第三阶段就是以Flutter为代表的自绘引擎时代。
拉维
2019/08/12
2.8K0
Flutter区别于其他技术的关键是什么?
Flutter技术与实战(2)
Flutter开发起步 Flutter开发起步 深入理解跨平台方案的历史发展逻辑 跨平台方案的三个时代 选择哪一类跨平台方案 Flutter区别于其他方案的关键技术 Flutter如何运转 Flutter如何完成组件渲染 Skia是什么 为什么Dart作为Flutter的开发语言 Flutter的原理 以界面渲染为例,介绍Flutter如何工作 学习Flutter需要掌握哪些知识 Flutter代码如何运行在原生系统 工程结构 工程代码(Flutter模板代码) 深入理解跨平台方案的历史发展逻辑
八归少年
2022/06/29
1.5K0
Flutter技术与实战(2)
flutter跨平台原理
React Native 最终渲染工作交还给了系统,虽然同样使用类HTML+JS的UI构建逻辑,但是最终会生成对应的自定义原生控件,以充分利用原生控件相对于WebView的较高的绘制效率。
老马的编程之旅
2022/06/22
2K0
flutter跨平台原理
当 Flutter 遇见 Web,会有怎样的秘密 ?
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 前言 腾讯 OED 的客户端团队在 2019 年上半年 ,就已经把 Flutter 落地到 企鹅辅导 的业务中了。今年我们又一起去上海参加了 2019 年谷歌开发者大会,遇见了更多的 Flutter 开发者,这次体验比第一次去的时候感觉熟悉了很多。希望未来有机会把他们邀请来深圳,进行一些 Flutter 的技术分享。此次开发者大会又恰逢 Flutter to Web 也已经正式合入 Mas
用户1097444
2022/06/29
7590
当 Flutter 遇见 Web,会有怎样的秘密 ?
Flutter 高性能原理浅析
Flutter是Google用以帮助开发者在Ios和Android两个平台开发高质量原生应用的全新移动UI框架.我开始认识Flutter时,经历了三个Flutter重要历史版本.
Rouse
2019/08/09
2.4K0
Flutter 高性能原理浅析
Flutter 实现原理及在马蜂窝的跨平台开发实践
在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如 WebView 和 React Native,来提升开发效率和用户体验。但这两种方式也带来了新的问题。
马蜂窝技术
2019/09/06
2K0
Flutter 实现原理及在马蜂窝的跨平台开发实践
跨平台技术演进
随着移动互联网的普及和快速发展,手机成了互联网行业最大的流量分发入口。以及随着5G的快速发展,未来越来越多的“端”也会如雨后春笋般快速兴起。而“快”作为互联网的生存之道,为了占领市场,企业也会积极跟进,快速布局。同一个应用,各个“端”独立开发,不仅开发周期长,而且人员成本高。同时,作为技术人员,也不应该满足于这种重复、低能的工作状态。在这样的形势下,跨平台的技术方案也受到越来越多人和企业的关注。接下来,我将从原理、优缺点等方面为大家分享《跨平台技术演进》。
用户2356368
2019/04/03
2.5K0
跨平台技术演进
跨平台技术演进及Flutter未来
移动互联网发展十余年,伴随着 Android、iOS 等智能手机的不断普及,移动端已逐步取代 PC 端,成为兵家必争之地。正所谓“得移动端者得天下”,移动端已成为互联网领域最大的流量分发入口,一大批互联网公司正是在这大趋势下崛起。
程序亦非猿
2019/11/09
2.1K0
跨平台技术演进及Flutter未来
跨平台解决方案的技术分析
近 20 年是中国互联网蓬勃发展的时代,以 2010 年为界限,前 10 年是 PC 互联网时代,PC 互联网时代培养了国民上网冲浪的用户习惯,为后 10 多年的以智能手机为终端的移动互联网时代带来丰厚的人口红利,而在移动互联网时代,以智能手机为依托的软硬件也就成为各大互联网公司争夺流量的焦点战场。
程序员海军
2021/11/12
1.5K0
跨平台解决方案的技术分析
关于移动互联网的跨平台技术演进
随着移动互联网的普及和快速发展,手机成了互联网行业最大的流量分发入口。以及随着5G的快速发展,未来越来越多的“端”也会如雨后春笋般快速兴起。而“快”作为互联网的生存之道,为了占领市场,企业也会积极跟进,快速布局。同一个应用,各个“端”独立开发,不仅开发周期长,而且人员成本高。同时,作为技术人员,也不应该满足于这种重复、低能的工作状态。在这样的形势下,跨平台的技术方案也受到越来越多人和企业的关注。接下来,我将从原理、优缺点等方面为大家分享《跨平台技术演进》。
Android技术干货分享
2019/05/21
1.8K0
关于移动互联网的跨平台技术演进
跨平台解决方案的技术分析
近 20 年是中国互联网蓬勃发展的时代,以 2010 年为界限,前 10 年是 PC 互联网时代,PC 互联网时代培养了国民上网冲浪的用户习惯,为后 10 多年的以智能手机为终端的移动互联网时代带来丰厚的人口红利,而在移动互联网时代,以智能手机为依托的软硬件也就成为各大互联网公司争夺流量的焦点战场。
winty
2021/08/24
1.2K0
跨平台解决方案的技术分析
Flutter 简介
Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发,
Yif
2019/12/26
1.1K0
自绘引擎时代,为什么Flutter能突出重围?
如上图所示,与2019年1月相比,全球使用互联网的人数已增加到45.4亿,增长了7%(2.98亿新用户)。
腾讯云开发者
2020/08/17
8.2K0
自绘引擎时代,为什么Flutter能突出重围?
Flutter
在Flutter中和Widgets一起协同工作的还有另外两个伙伴:Elements和RenderObjects;由于它们都是有着树形结构,所以经常会称它们为三棵树。
愤怒的小鸟
2021/10/26
2K0
Flutter 核心原理与混合开发模式
在 「Fan 直播」的 Flutter 混合开发实践中,我们总结了一些 Flutter 混合开发的经验。本文第一篇章将从 Flutter 原理出发,详细介绍 Flutter 的绘制原理,借由此在第二章来对比三种跨端方案;之后再进入第三篇章 Flutter 混合开发模式的讲解,主要是四种不同的 Flutter 混合模式的原理分析;最后的第四篇章,简单分享一下混合工程的工程化探索。 “唯有深入,方能浅出”,对于一门技术,只有了解的深入,才能用最浅显、通俗的话语描述出。在此之前,我写过一些 Flutter 的文
QQ音乐技术团队
2020/07/06
2.4K0
为什么那么多公司钟爱 Flutter ?
各公司都开始关注和使用跨端方案【包括大厂阿里巴巴以及腾讯】目前主流的跨端方案主要分为两种:一种是将 JavaScriptCore 引擎作为虚拟机的方案,代表框架是 React Native;另一种是使用非 JavaScriptCore 虚拟机的方案,代表框架是 Flutter。【其中还有一种是使用 Webview 的方案-待会也会讲解到】
逆锋起笔
2021/02/26
2K0
为什么那么多公司钟爱 Flutter ?
Flutter的原理及美团的实践
Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件。自从2017年5月发布第一个版本以来,目前Flutter已经发布了近60个版本,并且在2018年5月发布了第一个“Ready for Production Apps”的Beta 3版本,6月20日发布了第一个“Release Preview”版本。
美团技术团队
2019/04/04
3.3K0
Flutter的原理及美团的实践
为什么flutter可以跨平台
团队开发的第一款flutter app即将上线了,也是职业生涯第一个正式的flutter app,现在回过头来,再来回顾下,为什么flutter可以实现跨平台,也算是为我自己解惑,解答这个问题,还是要看flutter的架构设计
韦东锏
2022/11/07
2.7K0
为什么flutter可以跨平台
从渲染原理剖析如何提高 Flutter 应用性能
1. Flutter 性能概述 1.1 Flutter 基本渲染原理 在我们讨论如何对 Flutter 进行性能优化之前,首先得掌握 Flutter 的渲染原理,这样才能更好的对症下药。本文将主要讲讨论 UI 线程中的性能优化,由于 GPU 线程涉及底层 Skia 图形引擎的调用,相较于 UI 线程而言更加繁琐,对其感兴趣的同学可以观看 Google 官方的《深入了解 Flutter 的高性能图形渲染》。 渲染流程图.png 根据上图,我们可知 Flutter 的主要渲染流程:在初次渲染时,我们会根据
QQ音乐前端团队
2021/04/07
1.5K0
相关推荐
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档