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 动画在第一次运行时很卡顿的主要内容,如果未能解决你的问题,请参考以下文章