颤振应用程序缓慢

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 线程中运行,它也会影响其他的。

【讨论】:

以上是关于颤振应用程序缓慢的主要内容,如果未能解决你的问题,请参考以下文章

使用 MVC 和颤振颤振网站和应用程序如何连接后端?

颤振:第一次运行我的颤振应用程序时出现 gradle 错误

错误:当我在颤振验证器之后运行应用程序时,颤振中出现意外的空值

如何从颤振应用程序中投射屏幕?

如何从 url 打开颤振应用程序?

运行时无法执行颤振应用程序