Анимация 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.
    • См. Инструкции здесь .
    • Это почти наверняка приведет к регрессу для некоторых приложений и / или устройств. Они могут быть приемлемыми или неприемлемыми для вас. OpenGL на iOS больше не поддерживается командой Flutter, и запросы на исправление ошибок в нем будут закрыты, так как не исправят.
  • Подождите, пока будут реализованы двоичные архивы 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.

Другие вопросы по тегам