Flutter是google开源的高效跨平台UI解决方案。在Flutter之前,跨平台UI解决方案有:
- 内嵌浏览器。
- 跨平台游戏引擎:如cocos2dx。这些,包括Flutter,它们在实现思想上有相同点。甚至可以说神似。 google为什么要出一个Flutter?为什么不是利用原有技术?为什么选择Dart语言?
1. google 为什么要出Flutter?
根本原因是移动端的崛起。
开发者苦跨平台开发久已。从以前pc的独步天下,到现在pc、android、ios,至少可以说三足鼎立。以及以后会有更多终端类型平台出现。基本的功能适配、UI统一、开发语言统一等等,无不让开发者焦头乱额。多一个平台多一份代码。这其中是大量的人力与物力的浪费。
2. 为什么不利用原有技术?
对google来说,应该是没有理由,仅仅是因为他能,所以他做了。也可能是现在的跨平台开发,没有达到他们想要的效果以及像其它像授权等等方面的考虑。
3. 为什么选择Dart语言?
选择语言要根据要做的事情来决定。跨平台UI开发,核心是要解决UI的表现与统一。 如果不选Dart语言,我们先来看看google可选哪些语言。
- c/c++。编译型语言。内存管理复杂。使用难度大。
- java。一种很好的备选语言。不使用的原因应该有版权方面的考量,可参考android开发中java版权的问题。
- go。google自己的亲儿子语言。多线程支持好,高效。
为什么不选?如果选用,则界面要如何写?如果写在go语言中,则由于是编译后的。则必须由开发者自己全权来处理UI,开发难度很大。最终可能走回了无Flutter时的开发状况,并无显著改善跨平台开发体验。如果使用配置的方式来布局,类似android,也可以。 最终没有选用,原因也不清楚。至于以后会不会选用,可能性应该不大。因为现在Flutter已经够用,并且效果还不错。 - lua。高效的脚本语言。小众的原因?
- python。脚本语言,丰富的类库。gc?原因不知。
最终Flutter选择Dart,可能就是由于该语言本身的特性决定的。
- Flutter有大量对象创建与释放的频繁操作,这是由Flutter设计思想决定的。
因此适合Flutter的这种高效内存管理就成了Flutter选择语言的一个重要方面。 Dart使用分代垃圾回收机制,满足Flutter的要求。dart垃圾回收分两代:年轻代与年老代。年轻代对象分为两个区域,假设命名为A,B。所有对象先分配在A中,当垃圾回收时,将A中不能释放的对象移到区域B中;A区域清空;哪此互相循环。年老代保存年轻代中达到一定生命周期的长久对象;会遍历对象,标记仍在使用的对象 回收未标记的对象,然后清除所有标记。年轻代的使用能满足大量频繁的对象的创建和释放。同时,Flutter还可以在空闲时(60fps,16ms-Flutter处理时间,剩下的时间可垃圾回收),通知dart进行垃圾回收,从而减少垃圾回收对app流畅性的影响。 - Dart的isolates拥有自己的私有堆,彼此独立,每个isolates运行在单独的线程中。 只要保证isolates数小于等于cpus核心数,理论上是没有线程间切换执行的影响。因此每个ioslates的垃圾收集事件不影响其它isolates的性能,所以isolates可以避免UI出现卡顿和很好的进行频繁的回收操作。
- Dart可以AOT(ahead of time)编译,也可以JIT编译。
开发时,使用JIT编译,发布时使用AOT编译。开发周期快,亚秒级状态重载;发布后,运行快,性能好。很好地解决了开发与发布过程中的痛点问题。 - Dart使用单线程isolate,各个isolate通过消息通信。
isolate执行过程中无锁。可在没有锁的情况下进行对象分配与垃圾回收。 - 可编译成本地代码,无需到native的缓慢的桥梁调用,速度快。
- Dart使Flutter不需要单独的声明式布局语言,如XML,或单独的可视化界面编译器。
Dart的声明式编程布局易于阅读,而且亚秒级的热加载,基本相当于所视及所得,很方便的进行UI布局。