首先 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 在性能和跨端方面更有优势,但是,它学习成本会略高一些,同时对应它的不支持官方热更新(因为热更新二进制文件是违规的),不支持小程序,混合开发成本更高等等。

Unity

最后 unity 就是大家熟知的3D游戏引擎,它本身主要是用于游戏场景,有时候也会被运用于 AR 或者地图导航的场景,使用它开发 App 的可能性很低,当然也有人开发了 UnityTech/UIWidgets 用于结合 Flutter 的理念,但是本质上它更多是运用于游戏领域的。

总结:

  • uni-app 更适合前端开发,利用 vue 的能力构建简单场景的 app 或者小程序。
  • Flutter 更贴近原生开发的需求,拥有更好的性能和跨端能力。