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

Dan*_*eld 25 ios flutter jank

从 Flutter 1.12 开始(当 Flutter 从 OpenGL 切换到 Metal 渲染时),应用程序的第一次运行似乎会卡顿(更频繁地跳帧)。

Flutter 团队正在努力解决这个问题,但同时我能做什么?

Dan*_*eld 22

在任何事情之前:确保您看到的卡顿确实与此问题有关。如果您的应用程序在 iOS 中的 OpenGL 后端上已经出现问题,或者在 Android(实现了着色器缓存)上已经出现问题,那么您可能会遇到其他一些与性能相关的问题。尝试在 Flutter 中进行性能分析- 即记录一些时间线并分析框架工作负载中发生的事情。

编辑 2/23/2021

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

结束编辑

除此以外:

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

一点背景:

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

迁移到 Metal 有很多很好的理由。

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

我们曾短暂考虑过同时支持 OpenGL 和 Metal,但决定不支持。解决堆栈中该层错误的资源有限,我们已经知道 Metal 解决了许多与性能相关的问题。

  • 嘿 Dan - 现在是 2021 年 2 月。看起来有关此主题的大多数 github 问题都已关闭或已有几周没有任何活动。我们是否仍应期待 2021 年初(即 3 月底左右)修复? (9认同)
  • 谢谢你!对于我自己来说,我沿着 OpenGL 路线走了一段时间,但无法接受这种权衡,即我大约每 3 分钟就会得到一次非常长的重建,似乎是随机的。分析表明 OpenGL 代码中某些内容花费了太长的时间。回到 Metal 并发布了应用程序;我知道第一次运行会很卡顿,但我相信 Flutter 的未来更新将解决这个问题。 (4认同)
  • 希望Flutter团队尽快研究出解决方案。我们将开始使用 flutter 构建一个 IOS 应用程序,它将有很多动画 (2认同)