有没有实践过 Flutter 的开发者 , 为什么说它是原生性能呢 ?

2019-12-16 12:15:56 +08:00
 maomaomao001

昨天看了半天 flutter 写了 hello world。 最大的感受就是 Android 虚拟机在 windows 系统上终于飞快了啊,感觉和真机差不多了速度 。

然后,具体到 flutter 的话 ->

  1. 不是说它的性能媲美原生应用吗 ? 然而,我实践的结果是 最简单的 slider (滑动条) 联动,它有时候好像也跑不到 60 帧啊, 性能检测工具经常飘红 , 所以它是不是真的能有和原生一样的体验 ?

  2. 后来我返回去看了看它的架构 , 感觉明明就是翻版 canvas 呀 ?(也许我理解错误) ,react native 好呆也是调用原生控件才会说自己能用原生性能 ,flutter 明明就只是全新的画板(感觉有点类似游戏开发中的渲染引擎),而且实现还不全 (只支持 Android,ios, 最近好像 web 版本和 mac 版本在测试中 ,windows/linux 版本没看到消息) , 能不能说说他们做一个全新画板的意义在哪里?

  3. 语言用的 Dart , 这个感觉用起来问题不大 , 可是 为什么他们用这个语言呢 ? AOT 编译的话 , 以后 typescript 的最严格模式有没有可能会做到 类似呢 ? 可以 JIT + VM, 开发完了,AOT 编译到指定平台 ?

  4. 你们看好 flutter 吗?

大家能讲讲自己在 flutter 实践中遇到的问题(坑,或者好的方法之类的) 吗?

6368 次点击
所在节点    问与答
41 条回复
maomaomao001
2019-12-16 12:20:39 +08:00
还有这个,嵌套写法大家怎么看呢 ? 你们觉得以后会出 类似 jsx 的 dsx 之类的吗?

第 8 分钟开始
bilibili
av79096823
hst001
2019-12-16 12:33:08 +08:00
类似游戏引擎,暴露 API 给上层,现在地球上都是这样,原生也是。至于慢的问题试试在 release 下跑跑看效果。
optional
2019-12-16 12:40:54 +08:00
现在就两个端。flutter 优势并不明显(节约了一个平台的开发量,但是需要踩两个平台兼容性的坑,还要对一些原生功能做取舍)
morethansean
2019-12-16 12:41:16 +08:00
按你的说法,所有 ui 都是 canvas,原生 ui 也是 canvas...
maomaomao001
2019-12-16 12:42:45 +08:00
而且,我觉得是个极其基础的功能 (配置保存 , 类似 Android 开发里的 sharedpreference 之类的),也才最近才出官方库的样子 ...
maomaomao001
2019-12-16 12:44:52 +08:00
@morethansean 额,从某种角度,这么说好像也没什么问题 ,but (他们为什么不试试在现有的 canvas 上做这些功能呢... )
WildCat
2019-12-16 12:49:11 +08:00
@maomaomao001 嵌套很容易重构为更小的 component,在 VSCode 和 IntelliJ 里都很容易直接 extract widget。把 flutter 应用到实际项目里避免不了这样的重构。真正用的时候并不会存在这个问题。

性能的话,根据个人感知,iOS 上优化反而差一些。Android 性能比较好。
maomaomao001
2019-12-16 12:51:32 +08:00
@hst001

我昨天是用了差不多这样的联动滑动条 (没试 relese 版本) ,就是 Android studio ( flutter plugin )自带的那个看帧数的工具 , 真的是一大段红 (渲染耗时 超过 16ms )

```
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}

class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);

final String title;

@override
_MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
double s = 0;

void _incrementCounter() {
setState(() {
_counter++;
});
}

void setSVal(double v) {
setState(() {
s = v;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
Slider(
min: 0,
max: 100,
value: s,
onChanged: setSVal,
),
CupertinoSlider(
min: 0,
max: 100,
value: s,
onChanged: setSVal,
),
Text('$s'),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}


```
maomaomao001
2019-12-16 12:53:11 +08:00
@WildCat 可能真的是 relese 出来真的很快吧 , 不过,我的直观感受,flutter 明显比 react native 不流畅...
Kilerd
2019-12-16 12:54:29 +08:00
你要知道最开始 flutter 就是为了推广 Dart 服务的。 你说 ts 能不能做到 Dart 这样,肯定可以,但是其中的因由和利益关系决定了 Dart 应该不会换。
hst001
2019-12-16 13:10:01 +08:00
@maomaomao001 #6 这是做 UI,又不是通用游戏引擎,就算游戏引擎也有很多厂商选择自研,底层服务设计主要还是看上层需求。要考虑状态、结构管理,可能包括栅格化等,这里的需求就是我们看到的 flutter 框架那一套规则了。

如果你不是发 debug 包出去,简单应用性能问题不是问题,复杂应用则需要对 flutter 有深入一些的了解,知道如何避免一些低性能的处理方法(我感觉说了一句废话,哪门语言不是这样子)。
souths
2019-12-16 13:58:49 +08:00
可以这么理解,开发时跑的是网页,慢,上线跑的是二进制文件,快。但是这个其实是 UI 框架非 UI 部分还是需要原生支持
ai277014717
2019-12-16 14:03:51 +08:00
1 Release/AOT 才是性能优化的版本
2 绘制引擎从底层统一 UI 差异比 RN 更彻底,面向未来嵌入式系统
3 自带类型,推导方便,优化方便。ts 应该能达到同样效果
4 中立
wangxiaoaer
2019-12-16 14:04:19 +08:00
@maomaomao001 #1 你说的 canvas 是不是想表达类似 java swing 那样每个组件都自己重新绘制?
lagoon
2019-12-16 14:15:34 +08:00
借用大佬的话,瞬间明白。

Android -> Skia -> CPU/GPU。
Flutter -> Skia -> CPU/GPU。
React Native -> Android -> Skia -> CPU/GPU。

说完了。
maomaomao001
2019-12-16 14:16:15 +08:00
@wangxiaoaer 可能算吧 ,我的点在于
以前的 react native -> 写 js 代码 -> 通过桥去生成操作原生控件 , 比如 rn 写的按钮,出来的就是平台本身的按钮

但是 flutter
flutter -> 写 dart 代码 -> 用 skia (canvas) 画出组件 , 比如 flutter 写按钮,这完全和平台没关系了感觉 , 可能是为了,以后跨更多平台吧
maomaomao001
2019-12-16 14:17:46 +08:00
@lagoon 这就不太对吧 ?
Android -> Skia -> CPU/GPU

android1 原生也会用 skia 绘制控件 ? 那可就真的厉害了
maomaomao001
2019-12-16 14:20:15 +08:00
@lagoon 刚刚查了一下,skia 好像还真是 android 渲染层框架
lagoon
2019-12-16 14:22:14 +08:00
@maomaomao001
有什么问题? Skia 本来就用在 Android 上,又不是为 Flutter 搞的。
在 Flutter 都还没有的是的,Skia 就是 Android 的图像引擎啊。

当然,更细致的分析,得有大佬回答,我的水平也就说成这样了。
TimLang
2019-12-16 14:23:48 +08:00
觉得嵌套问题的,建议用 ide,比如 android studio,这都不是事,而且 dart 非常好学,比 oc 或是 swift 简单多了,前端上手

应该没什么问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/629425

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX