Flutter iOS 动画在第一个 运行 时很卡

Flutter iOS animations are janky on first run

自 Flutter 1.12 以来(当 Flutter 从 OpenGL 切换到 Metal 渲染时),应用程序的首次运行出现卡顿(更频繁地跳帧)。

Flutter 团队 working on this,但同时我可以做什么?

首先:确保您看到的卡顿确实与此问题有关。如果您的应用程序在 iOS 中的 OpenGL 后端上已经卡顿,或者在 Android(实现着色器缓存的位置)上卡顿,则您可能遇到其他一些与性能相关的问题。尝试完成 performance profiling in Flutter - 即记录一些时间线并分析框架工作负载中发生的情况。

编辑 2/23/2021

Metal 二进制归档工作被证明是一条死胡同。有关详细信息,请参阅 https://github.com/flutter/engine/pull/23914。这仍然是 Flutter 团队的高优先级项目,但目前尚不清楚修复的时间表。

结束编辑

否则:

  • 看看您是否可以使用更简单的着色器。例如,避免alpha混合,避免梯度计算,避免昂贵的剪辑等
  • 降级到 Flutter 1.12。
    • 这可能需要在您需要的其他修复中进行挑选。
    • 这可能需要降级某些软件包,或向后移植 1.12 不可用的软件包。
  • 使用带有 OpenGL 的定制引擎。
    • 参见说明 here
    • 这几乎肯定会为某些应用 and/or 设备引入 regressions。这些可能会或可能不会被您接受。 iOS 上的 OpenGL 不再受到 Flutter 团队的支持,修复错误的请求将被关闭,因为不会修复。
  • 等待 Metal 二进制归档实现。一旦发生这种情况,Shader Warmup 将在 Metal/iOS 上得到支持。 Flutter 和 Skia 团队正在积极致力于此(对它的基本支持已经到位,但还没有完全准备好用于一般用途)。我们的目标是在 2021 年初上市。

一点背景:

着色器是 Skia 从各种绘图命令创建的小程序,用于创建 GPU 可以执行以在屏幕上实际绘制像素的程序。编译它们可能会花费大量时间,并且不同的场景可能需要不同的着色器程序。 Flutter 的架构旨在缓存和复用已编译的着色器程序,以便它们在编译后可以复用。 Skia 中基于 OpenGL 的后端支持此功能,但仍在为基于 Metal 的后端开发(请参阅 https://skbug.com/10804)。

迁移到 Metal 有很多充分的理由。

  • Apple 正在弃用 OpenGL
  • 在 OpenGL 后端中观察到与内存和帧速率相关的问题,这些问题正迅速成为死胡同。由于弃用,Apple 的分析和调试工具现在全部面向 Metal。许多问题被观察到通过转移到 Metal 得到完全解决。
  • 据信已实现对 Metal 的核心支持。这包括基本渲染、跨上下文图像和平台视图支持。不幸的是,这不包括对着色器缓存的支持。

我们曾短暂地考虑过 supporting both OpenGL and Metal,但决定不这样做。解决该层堆栈中的错误的资源有限,我们已经知道 Metal 解决了许多与性能相关的问题。