颤振应用程序缓慢
Posted
技术标签:
【中文标题】颤振应用程序缓慢【英文标题】:Flutter app slow 【发布时间】:2018-10-19 16:09:32 【问题描述】:我正在试用 Flutter,我的应用在模拟器和真实设备上的响应都非常缓慢。我收到这样的警告
跳过了 51 帧!应用程序可能在其上做太多工作 主线程。
我知道 Dart 是一种单线程编程语言,在 android 中,我曾经使用用于异步的旧 new Thread();
块来解决这个问题。我正在尝试在 Flutter 中应用相同的内容,并且我阅读了 Future
await
async
等等,但是当您从 Internet 读取数据时,这些示例似乎正在解决。在这个阶段,我的应用程序没有在线阅读任何内容,当我的屏幕有进度对话框时,当我打开一个新的屏幕/页面时,以及应用程序上的每个动画时,我都会跳过 x 帧。这是我遇到问题的课程示例:
_buildContent()
return new Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new InkWell(
onTap: ()
Navigator.push(context, new MaterialPageRoute(builder:
(context) => new LoginScreen()));
,
child: new Container(
height: 150.0,
width: 150.0,
child: new Image.asset("images/logo.png", fit: BoxFit.cover,),
),
),
new Container(
margin: const EdgeInsets.all(16.0),
child: new CircularProgressIndicator(
value: null,
strokeWidth: 1.0,
valueColor: new AlwaysStoppedAnimation<Color>(
Colors.white
)
),
)
],
);
我假设跳过的 x 帧警告是由进度对话框引起的?我有另一个屏幕(登录屏幕),它在打开时将小部件设置为动画,动画移动得非常慢,我可以从字面上看到正在渲染的每一帧。是否有在线教程可以帮助解决这个问题或只是理解 Dart 的异步编程?
【问题讨论】:
性能应该在发布版本flutter build apk --release
中检查。众所周知,动画小部件中的较大图像会导致性能问题。
Future
不是一个不同的线程
@spongyboxx 此对话框不应导致性能问题。你很可能在其他地方有一些花费你很多的东西。尝试使用Observatory
来追踪花费这么多的东西。
请记住,期货不在特定线程上。它们只是稍后在主线程上执行。因此,如果您在 Future
中进行昂贵的计算,它会冻结您的应用
Gunter 和 Remi 都提到过,Future
is not a thread。
【参考方案1】:
iOS 模拟器
如果您在Xcode 模拟器 中的特定(较新)设备上遇到缓慢、低 FPS、延迟滚动,这是因为 Apple 放弃了对 OpenGL 的支持并且 Flutter SDK 不支持新的 Metal API 在模拟器中。
不过官方的稳定支持很快就会推出,如果你需要 60 FPS,在终端运行这个切换到 Flutter SDK 的主通道并重建你的应用程序:
flutter channel master
来源:
ios Simulator gradually becomes very slow & unusable
Investigate enabling Metal on iOS simulators above version 13.0.
Will Flutter use Metal on iOS Simulators?
【讨论】:
【参考方案2】:flutter 中有一个已知问题,您必须先“预热”图形 api (SkSL)。第三次运行后,通常动画会变得流畅。
问题发生在 iOS 和 Android 中。
对于 iSO,Metal api 通常会出现延迟,因为苹果放弃了对 OpenGL 的支持,而这通常是实现skia 图形引擎的地方。
解决方法和临时解决方案可在此页面上找到。
Extreme jank on iOS/Android the first time any kind of animation or transition runs (release build) - skia shader compilation #61450
【讨论】:
【参考方案3】:我的应用在某些 android 设备上运行缓慢,可能对其他设备也有一些性能影响。罪魁祸首是图像资产。提供正确的图片尺寸后,
mdpi = 1x
hdpi = 1.5x
xhdpi = 2.0x
xxhdpi = 3.0x
xxxhdpi = 4.0x
到我的资产文件夹并更新 pubspec.yaml 性能变得更好,
assets:
- assets/images/
- assets/images/1.5x/
- assets/images/2.0x/
- assets/images/3.0x/
- assets/images/4.0x/
【讨论】:
【参考方案4】:调试版本存在一些性能问题,因为在发布版本中会发生许多断言和其他验证。 发布构建比调试构建快得多。
在发布版本中运行应用程序可能会有所帮助。 尝试在发布模式下运行
flutter run --release
【讨论】:
【参考方案5】:调试模式
启动很慢 启动时闪烁 应用大小很大。因为带有热重载的调试模式。
当你创建发布 apk https://flutter.io/docs/deployment/android
你可以找到
快速启动 发射过程中不眨眼 应用体积小(但比普通安卓应用大)编辑
https://flutter.io/docs/testing/ui-performance#debug-flags
调试模式会启用不在配置文件或发布版本中运行的额外检查(例如断言),并且这些检查可能很昂贵。 调试模式也以不同于发布模式的方式执行代码。调试版本在应用程序运行时“及时”(JIT)编译 Dart 代码,但配置文件和发布版本在应用程序加载之前预编译为本机指令(也称为“提前”或 AOT)设备。 JIT 可能会导致应用暂停以进行 JIT 编译,这本身可能会导致卡顿。
https://github.com/flutter/flutter/wiki/Flutter%27s-modes
设备上的调试模式(包括模拟器、模拟器):打开世界上所有的断言,包括所有调试信息,启用所有调试器辅助工具(例如天文台)和服务扩展。针对快速开发/运行周期进行了优化。不针对执行速度、二进制大小或部署进行优化。由颤振运行使用。使用 sky/tools/gn --android 或 sky/tools/gn --ios 构建。有时也称为“检查模式”或“慢速模式”。
【讨论】:
【参考方案6】:尝试在终端中使用flutter run --release
以发布模式运行您的应用。
【讨论】:
【参考方案7】:您应该查看Flutter performance Profiling 指南。您可以尝试不同的配置来诊断您的问题是否在
平台线程 UI 线程 GPU 线程或 I/O 线程。即使你的 Dart 代码只是在 Ui 线程中运行,它也会影响其他的。
【讨论】:
以上是关于颤振应用程序缓慢的主要内容,如果未能解决你的问题,请参考以下文章