【问题标题】: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

标签: dart flutter


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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-01-05
                • 2021-03-20
                • 1970-01-01
                • 2018-08-11
                • 2020-08-10
                • 2018-11-07
                • 2020-12-13
                相关资源
                最近更新 更多