同样是自带引擎绘制,flutter对比uni-app和unity有什么优劣势?
同样是自带引擎绘制,flutter对比uni-app和unity有什么优劣势? 首先 uni-app 和 Flutter 还有 unity 本身就不属于一个底层应用场景 ,说 uni-app 自带引擎绘制本身就不正确。uni-app
uni-app 是内置了 JSCore 用于运行 JS 代码,然后通过 WebView 进行渲染,同时内部内置了一个基于 Weex 改进的桥接框架,从而可以实现把 JS 代码转为平台原生的控件去渲染,利用了原生渲染能力。
所以 uni-app 利用的是 WebView 或者原生控件的桥接,本身并不实现渲染引擎,它的 mpvue 、Weex 、JSCore 都是其他的第三方开源框架,而 uni-app 实现了集成化平台,所以它的优势就是在于对前端开发而言,只要学会 vue ,就可以通过它简单开发 App ,同时它还能帮你转译成小程序,另外因为是 JS 文本代码,支持 code-push 这种热更新也不算违规。
当然,上限也很明显,JSCore 的性能上限和复杂场景的渲染支撑瓶颈,还有多平台下的兼容问题,因为如果你需要更好的性能就需要使用 Weex 模式,而 Weex 模式依赖于原生平台的控件,所以不同系统之间原生控件的差异,同个系统的不同版本在控件上的属性和效果差异,组合起来在后期开发过程中就是很大的维护成本。
Flutter
Flutter 本身自带了渲染引擎,所以 Flutter 作为 UI 框架, react-native 、 weex 不同 Flutter 的控件不是通过原生控件去实现的渲染,而是由 Flutter Engine 提供的平台无关的渲染能力,也就是 Flutter 的控件和平台没关系。
简单来说,原生平台提供一个Surface作为画板,之后剩下的只需要由 Flutter 来渲染出对应的控件,而这个过程最终是打包成 AOT 的二进制完成,从这个角度上不严谨地说, Flutter 更像是一个类 unity 的轻度游戏引擎,不过它提供的是 2D 的控件。
所以 Flutter 有很不错的跨平台能力,同时性能也有很大提升,因为 Flutter 不需要转译成原生控件再渲染,没有中间层的消耗,现阶段 Flutter 在 Android 、iOS 、Web 上都已经进入稳定版本,在 Linux 、Win、MacOS 也进入了 beta 版本,所以 Flutter 在性能和跨端方面更有优势,
但是,它学习成本会略高一些,同时对应它的不支持官方热更新(因为热更新二进制文件是违规的),不支持小程序,混合开发成本更高等等。
关于 Flutter 的更多疑问以前写过,感兴趣的直接看就可以了:
带你全面了解 Flutter,它好在哪里?它的坑在哪里? 应该怎么学?解读 Flutter 全平台开发的误解与偏见最后 unity 就是大家熟知的3D游戏引擎,它本身主要是用于游戏场景,有时候也会被运用于 AR 或者地图导航的场景,使用它开发 App 的可能性很低,当然也有人开发了 UnityTech/UIWidgets 用于结合 Flutter 的理念,但是本质上它更多是运用于游戏领域的。
所以总结来说,它们的应用场景不一样:
uni-app 更适合前端开发,利用 vue 的能力构建简单场景的 app 或者小程序。Flutter 更贴近原生开发的需求,拥有更好的性能和跨端能力。(国内大厂在移动端跨平台的框架接入分析)unity 主要是服务于游戏和3D渲染需求。
uni app是自带引擎绘制吗?应该不是吧
不确定了,那我想主要区别就是uni app尽量兼容web的那些东西,html,js,css这些,但是这样做,最大的问题是渲染的性能上不去,就是html,css这些置标语言,以及js这些脚本语言,这些东西的性能啊,是一个大问题
google为什么做flutter啊,一个很重要原因,就是他们原来这些做web渲染的组啊,做不下去了,于是就换了dart,重新做,然后一测试,wow,比原来快了21倍哦,这个你可以看eric的访谈,里面有说到,这个应该就是flutter跟uni app最大的区别点,当然因此你就不可能随便兼容web的那些东西了,比如前端的一些库,那就不行了,这就是一个trade off,你用不了web上的那些库,但是随之而来的,是性能的大幅提升,那就看你愿意不愿意交换了
所以后来测试的时候,发现flutter可以达到120fps的渲染效率,那这个很自然地,就打开了游戏的大门,所以你这里也把unity给弄上去了
当然这个效率,很大程度上是aot带来的,一些渠道,它也有aot的要求,比如app store,原则上苹果希望你能将你的app,编译成native,然后才给你上架,但是它是人工审核,所以这里面有灰色地带,但是原则上苹果希望你做成native,那要将web那些东西,编译成native,前面说了,Google都没做成
那理论上说,web那一套能不能编译成native实现跟flutter,unity什么一样的渲染效率呢?理论上可以,但实际上,你可以尝试一下,你会发现,嗯,Google都搞砸的东西,我看也没几个人能搞出来,当然你也可以去指望一下graal或者facebook之类的,但是目前看,似乎不太现实,像graal.js,我们跟es4x的paulo交流后发现,也做不到aot,但这个对于后端而言,并非必需,完全可以不这么干,但如果是vert.x自身就可以编译成native了
扯远了,这是flutter跟uni app的主要区别
然后是flutter和unity,这个其实是广义的gui和游戏引擎两者的差异
这两个都可以编译成native,也都有图形引擎,底层渲染也都是通过metal这些东西
那这两个的差异很明显,就是,gui提供了一大堆控件,button,label,textfield之类的,并且提供了很多对这些控件装饰的方法,你可以比较方便滴对这些控件做各种装饰,比如边框怎么调啊这些,gui就特别擅长这个东西,但是反过来,游戏引擎这一块就非常糟糕
游戏引擎擅长什么呢?擅长的就是对图片,模型的处理,还有一些碰撞检测,精灵之类的,这些游戏引擎都会提供,而且缺省会提供gameloop,shader的入口之类的,那这些东西,gui是不提供的
所以你看,游戏引擎和gui,分别有擅长的部分,那现在是这样,小孩子才做选择题,成年人肯定是我全都要
全都要做得比较好的应该是苹果了,我们可以观察一下苹果的gui,游戏引擎这些的现状,就可以推测出,flutter以及包括java等将来的走向了
苹果的gui叫做swiftui,苹果也有一个游戏引擎,叫做sprite kit,2d的游戏引擎,基本上你想要的游戏引擎的要素,sprite kit都有,然后苹果还有一个3d的渲染的管道,叫做metal
那么sprite kit(sk)和metal,都有一种嵌入模式,也就是embedded mode,sk提供skview,metal提供mtkview,作为一种view,可以嵌入到swiftui里面去,作为swiftui的view的一种,swiftui的基本组成单元就是view嘛,那这样就可以同时利用上gui(swiftui)以及游戏引擎(sk)还有渲染管道(metal)的特性了,也就是说,你可以在你的gui里面,嵌入游戏,这样你可以同时利用上gui以及游戏引擎了,这样开发起来是不是就很方便了?
那flutter的发展方向,大概率也是这样,当然这个官方还没有提供,现在有很多第三方的供应商,提供了2d的游戏引擎,比如flame,然后我看flutter官方的招聘信息,我感觉,flutter的下一步重点,就是强化ffi,因为flutter的招聘,也就是Google的招聘信息里面,对该职位的功能性描述就是,希望招进来,做一些ffi的工作,不仅仅是jni了,当然java自己也在做panama,这个是外话,但是flutter在强化ffi这一块,应该是可以看得出来,那ffi就是调用c等native的api的接口,那这个做好了的话,其实类似苹果的metal的mtkview也就可以做出来了,当然我相信这个还需要几年时间
也就是说,flutter以及flutter的生态,正在慢慢形成一种,做成游戏引擎的超集的这么一个生态,不仅有gui,同时也有游戏引擎(2d或者3d都有)
unity本身也不是微软做的嘛,我相信flutter的生态圈里面,将来也会出现类似unity一样的公司,或者干脆就是谷歌自己做了,苹果就是自己做,苹果不仅提供gui,也提供游戏引擎,就前面说的sk和metal,都是苹果官方的东西,那谷歌做不做我并不清楚,但是不管谷歌做不做,flutter的生态里面,就已经开始出现这种游戏引擎了,这是件好事,我们可以拭目以待将来的发展 别的不知道,unity做app的话,由于3d引擎的渲染机制,会导致耗能变高。
普通ui都是用操作系统的gdi实现的,偶尔才有可能用GPU加个速。
unity的ui根本上就是3d世界渲染一个2d纸片投射到相机上,每一帧都在按3d渲染流程跑。每一帧都要用gpu计算。
一个不怎么用gpu,一个天天用gpu。功耗上就不是一个等级的了。 fl和u3d本质是一样的,不过2d3d区别,3d能耗就大了。uniapp和reactnative差不多,和xamarin以及未来的.net android ios有相似点,桥接uikit和androidUI的原生api,只是js只能异步原生api,不是所有原生api都能用的爽,说白了java oc不可避免。 uniapp单纯拿来做app的话,还是有很多局限的,官方也写过一篇和flutter的对比,还能说出flutter不少缺点
不过unity3d做界面的话会比较有意思,游戏嘛,本来就要做2d界面的,但是这些2d界面不一定要在一个平面内,所以可以组成三维空间中的2d界面,比别人吹了半天看不到的3d强多了,这是大部分普通ui工具都不具备的,他们最多2d里嵌入点3d,3d里就不方便嵌入更多2d了,即便能嵌入,也不方便3d操作
不过u3d的界面控件不怎么强大,还是主要靠第三方插件,但是很有潜力啊,u3d应该做好基本的容器控件,让各种2d插件可以再统一的界面容器内统一,也许将来可以将maui嵌入呢,那就神奇了
页:
[1]