Анимация Flutter для iOS дергается при первом запуске
Начиная с Flutter 1.12 (когда Flutter переключился на рендеринг металла из OpenGL), первые запуски приложения кажутся прерывистыми (чаще пропускаются кадры).
Команда Flutter работает над этим , но пока что я могу сделать?
1 ответ
Прежде всего: убедитесь, что наблюдаемый вами мусор действительно связан с этой проблемой. Если ваше приложение уже не работает на бэкэнде OpenGL в iOS или работает на Android (где реализовано кеширование шейдеров), у вас, вероятно, есть другая проблема, связанная с производительностью. Попробуйте выполнить профилирование производительности во Flutter, то есть запишите некоторые временные рамки и проанализируйте, что происходит в рабочих нагрузках фреймов.
РЕДАКТИРОВАТЬ 23.02.2021
Работа с металлическими бинарными архивами зашла в тупик. См. Https://github.com/flutter/engine/pull/23914 для получения более подробной информации. Это по-прежнему высокий приоритет для команды Flutter, но сроки исправления пока неизвестны.
конец править
Иначе:
- Посмотрим, можно ли использовать более простые шейдеры. Например, избегайте альфа-смешивания, избегайте вычислений градиента, избегайте дорогих клипов и т. Д.
- Перейти на Flutter 1.12.
- Для этого может потребоваться сбор вишни в других необходимых вам исправлениях.
- Это может потребовать понижения версии определенных пакетов или обратного переноса пакетов, которые недоступны в 1.12.
- Используйте специально созданный движок с OpenGL.
- Подождите, пока будут реализованы двоичные архивы Metal. Как только это произойдет, Shader Warmup будет поддерживаться на Metal / iOS. Команды Flutter и Skia активно работают над этим (базовая поддержка уже существует, но не совсем готова для общего использования). Мы нацелены на доступность в начале 2021 года.
Немного предыстории:
Шейдеры - это небольшие программы, которые Skia создает из различных команд рисования для создания программы, которую GPU может выполнять для рисования пикселей на экране. Их компиляция может занять нетривиальное количество времени, а для разных сцен могут потребоваться разные шейдерные программы. Архитектура Flutter предназначена для кэширования и повторного использования скомпилированных программ шейдеров, чтобы их можно было повторно использовать после компиляции. Поддержка этого существует в бэкэнде на основе OpenGL в Skia, но все еще работает над бэкэндом на основе Metal (см. Https://skbug.com/10804 ).
Было много веских причин перейти на металл.
- Apple прекращает поддержку OpenGL
- В бэкэнде OpenGL наблюдались проблемы, связанные с памятью и частотой кадров, которые быстро заходили в тупик. Все инструменты Apple для профилирования и отладки теперь ориентированы на Metal из-за устаревания. Было замечено, что многие проблемы были полностью решены путем перехода на Metal.
- Считалось, что основная поддержка Metal достигнута. Это включало базовый рендеринг, кросс-контекстные изображения и поддержку представления платформы. К сожалению, это не включало поддержку кеширования шейдеров.
Мы кратко рассматривали возможность поддержки как OpenGL, так и Metal, но решили не делать этого. Ресурсы для устранения ошибок на этом уровне стека ограничены, мы уже знали о ряде проблем, связанных с производительностью, которые решила Metal.