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 解决了许多与性能相关的问题。
自 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 解决了许多与性能相关的问题。