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

Posted

技术标签:

【中文标题】Flutter iOS 动画在第一次运行时很卡顿【英文标题】:Flutter iOS animations are janky on first run 【发布时间】:2021-04-05 16:50:57 【问题描述】:

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

Flutter 团队是 working on this,但与此同时,我能做什么?

【问题讨论】:

【参考方案1】:

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

2021 年 2 月 23 日编辑

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

结束编辑

否则:

看看是否可以使用更简单的着色器。例如,避免 alpha 混合、避免梯度计算、避免昂贵的剪辑等。 降级到 Flutter 1.12。 这可能需要在您需要的其他修复中挑选樱桃。 这可能需要降级某些软件包,或反向移植不适用于 1.12 的软件包。 使用带有 OpenGL 的定制引擎。 请参阅说明here。 这几乎肯定会为某些应用程序和/或设备引入regressions。这些可能会或可能不会被您接受。 Flutter 团队不再支持 iOS 上的 OpenGL,对其进行错误修复的请求将被关闭,因为不会修复。 等待实施 Metal 二进制存档。一旦发生这种情况,Metal/iOS 将支持 Shader Warmup。 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 解决了许多与性能相关的问题。

【讨论】:

谢谢!就我自己而言,我在 OpenGL 路线上走了一段时间,但无法接受权衡,那就是我会每 3 分钟进行一次极长的重建,似乎是随机的。分析表明在 OpenGL 代码中花费了太长时间。回到 Metal 并发布了应用程序;我知道第一次运行很麻烦,但我相信 Flutter 未来的更新会解决这个问题。 Hey Dan - 现在是 2021 年 2 月。看起来关于这个主题的大多数 github 问题都已关闭或几周没有任何活动。我们是否还应该期待在 2021 年初(即 3 月下旬左右)得到修复? 我希望 Flutter 团队尽快制定解决方案。我们将开始使用 Flutter 构建一个 IOS 应用,它会有很多动画 这个问题解决了吗? @LatheeshVMVilla 不,它还没有修复,可以在链接的 Github 问题中找到信息。

以上是关于Flutter iOS 动画在第一次运行时很卡顿的主要内容,如果未能解决你的问题,请参考以下文章

Android clipPath导致卡顿

ui框架组件中的过渡动画卡顿

Flutter,2个动画控制器导致错误

华为快应用在setInterval中绘制canvas动画卡顿,怎么破

MappedByteBuffer 在初始运行时很慢

2020年度第一个稳定版本:Flutter 1.17,你想了解吗?