WebAssembly, улучшенный рендеринг графики и ещё больше способов интегрировать искусственный интеллект

Привет, с вами Flutter-команда Surf с анонсом нового релиза Flutter 3.22! Мы его заботливо перевели, а вот тут рассказали о нашем свеженьком опыте использования. 

Добро пожаловать! На этот раз мы рады представить новый релиз Flutter 3.22. В этой версии мы вывели WebAssembly в стабильный канал, добавили полнофункциональный бэкенд Vulkan для Impeller на Android, постарались сделать графику более плавной и существенно повысить производительность.

Ещё мы оптимизировали рабочие процессы: добавили новые свойства состояния виджетов и динамическое масштабирование view, а также усовершенствовали валидацию ввода.

Но и это еще не все. Чтобы облегчить вам жизнь, мы включили в релиз возможность пакетировать ресурсы с учётом flavor, добавили превью Vertex AI для Firebase в Dart и обновили DevTools.

Кевин Чисхолм, технический программный менеджер Flutter и Dart

Всего за несколько месяцев с момента последнего обновления мы смёрджили целых 1595 пулл-реквестов от сообщества Flutter, а среди новых разработчиков 37 человек впервые внесли свой вклад во Flutter!

Давайте рассмотрим новые функции и улучшения, которые появились в новом релизе Flutter благодаря сообществу!

WebAssembly

С выходом Flutter 3.22 мы откроем доступ к Wasm в стабильном канале, что значительно повысит производительность. Во внутренних бенчмарк-тестах с Chrome на MacBook M1 рендеринг кадров в приложении Wonderous ускорился в среднем в 2 раза, а в наименее благоприятных сценариях — в 3 раза.

Cкомпилировано в Javascript             Скомпилировано в Wasm
Cкомпилировано в Javascript Скомпилировано в Wasm

В частности, это важное достижение для приложений с ресурсозатратными анимациями переходов, где необходимо поддерживать плавную частоту кадров. Wasm сокращает число «узких мест» производительности, чем обеспечивает более плавную анимацию. Как использовать Wasm у себя в веб-приложении Flutter, мы рассказываем в документации к Dart Wasm и документации к Flutter Wasm

Полноценный анонс — в посте «Flutter на Google I/O».

Движок

В версию Flutter 3.22 вошли масштабные обновления Impeller, графического движка, на котором работают ваши Flutter-приложения. Среди ярких обновлений:

  • полностью функциональный бэкенд Vulkan на Android, а значит, более плавная графика и высокая производительность; 

  • оптимизация эффектов размытия и трассировка сложных путей;

  • новый экспериментальный API для тестирования с Impeller.

Мы придерживаемся своего плана развития и согласно ему стремимся повысить качество и производительность Impeller, в том числе завершить переход iOS на Impeller и расширить поддержку для Android.

Impeller

Бэкенд Vulkan готов и работает на Android

В этом релизе бэкенд Vulkan для движка Impeller получает статус «feature complete» на Android. В частности, в течение последних нескольких месяцев команда усердно работала над возможностью объединять данные с fast advanced blends, а также над поддержкой кастомных фрагментных шейдеров с помощью FragmentProgram API, поддержкой PlatformView (хотя тут потребуется мигрировать небольшой API) и реализацией всех стилей размытия.

Превью на Android

В стабильной версии 3.19 мы дополнили бэкенд OpenGL для Impeller, а затем предложили пользователям опробовать Impeller на Android-устройствах с поддержкой Vulkan и без нее. Последние несколько месяцев мы изучали производительность бэкенда OpenGL и оценивали объем работ над Vulkan, и в результате решили в первую очередь сосредоточиться на подготовке Vulkan к выходу в прод.

Impeller устраняет лаги при компиляции шейдеров. Не говоря уже о том, что в наших бенчмарк-тестах он обходит старый движок по среднему времени кадра, а также в 90-м и 99-м процентилях. Поэтому мы считаем производительность Vulkan на Android приемлемой. 

В этом релизе (3.22) приложение, в котором используется Impeller, будет работать на Vulkan везде, где есть такая возможность. В следующей версии он станет опцией по умолчанию. Если приложение использует Impeller, но запускается на устройстве, не поддерживающем Vulkan, Flutter автоматически переключится на OpenGL ES и Skia. С вашей стороны не требуется никаких действий. В будущем, когда мы убедимся, что OpenGL ES готов к работе с Impeller в проде, Flutter будет автоматически переключаться на Impeller.

Так как превью Impeller на Android всё ещё доступно в стабильной версии 3.22, просим Flutter-разработчиков перейти на последнюю стабильную версию и сообщать о любых неполадках, замеченных на Impeller. На этом этапе ваши отзывы крайне важны для успешной работы Impeller на Android. Более того, без них мы не сможем с уверенностью назначить его графическим движком по умолчанию в одном из предстоящих релизов этого года. Аппаратная экосистема Android очень разнообразна. Поэтому, если вы хотите оставить максимально полезный отзыв об Impeller, укажите подробную информацию о конкретном устройстве и версии Android, на которой возникли проблемы.

Производительность размытия теперь выше

Размытие снова доступно с Impeller как на iOS, так и на Android. В частности, новый подход, аналогичный принципам Skia, сокращает время обработки размытий для CPU и GPU почти вдвое по результатам бенчмарк-тестов.

На приведенной ниже диаграмме показано наихудшее, 99%, 90% и среднее время растеризации кадров и время обработки кадров графическим процессором в миллисекундах на iPhone 11 в бенчмарк-тесте, предназначенном для оценки производительности размытия. После переработки размытий в Impeller, затраты ресурсов CPU и GPU на размытие фона сократились почти вдвое. Улучшения такого масштаба заметны и в обычных условиях, то есть в обычных приложениях.

99-й и 90-й процентиль и среднее время растеризации кадров, а также время обработки кадров GPU в миллисекундах на iPhone 11 в специальном тесте производительности размытия
99-й и 90-й процентиль и среднее время растеризации кадров, а также время обработки кадров GPU в миллисекундах на iPhone 11 в специальном тесте производительности размытия

Метод "Stencil-then-Cover"

Impeller как на iOS, так и на Android использует новую стратегию рендеринга по методу Stencil-then-Cover, описанному в главе "Drawing Filled, Concave Polygons Using the Stencil Buffer" ("Отрисовка заполненных вогнутых полигонов с помощью стенсил буфера") в OpenGL Redbook. На этот счёт уже есть обсуждения в issue # 123671 на GitHub, где метод применяют во Flutter.

Такой подход помогает в случае, где растровый поток тратит слишком много времени на вычисление тесселяций для сложных контуров на CPU, например, для SVG и анимаций в Lottie. После изменений общее время кадра (поток UI на CPU + растровый поток на CPU + работа GPU) значительно сократилось на кадрах со сложными контурами. Пользователи точно заметят, что анимации в Lottie и другие сложные контуры отрисовываются плавнее, меньше грузят процессор и немного больше грузят графический процессор.

(Слева) Анимация в Lottie. Раньше для рендеринга этой анимации Impeller тратил 64 мс/кадр в растровом потоке CPU на последнем iPhone(Справа) Та же анимация на том же устройстве, но с оптимизацией Stencil-then-Cover. Время растеризации сокращается почти в 10 раз
(Слева) Анимация в Lottie. Раньше для рендеринга этой анимации Impeller тратил 64 мс/кадр в растровом потоке CPU на последнем iPhone
(Справа) Та же анимация на том же устройстве, но с оптимизацией Stencil-then-Cover. Время растеризации сокращается почти в 10 раз

(Слева) Анимация в Lottie. Раньше для рендеринга этой анимации Impeller тратил 64 мс/кадр в растровом потоке CPU на последнем iPhone. (Справа) Та же анимация на том же устройстве, но с оптимизацией Stencil-then-Cover. Время растеризации сокращается почти в 10 раз.

Мы довольны прогрессом, но знаем, что работа на этом не кончается. Нам известно, что, помимо всего прочего, генерация ломаных линий — проблема, которую всё также легко заметить при профилировании CPU, и мы намерены изучить возможность переноса этой задачи на GPU.

Новый API

Flutter test уже принимает флаг --enable-impeller, который запускает Impeller на Vulkan, хоть это и экспериментальный элемент.

Фреймворки

Свойства WidgetState

Мы вынесли MaterialState из библиотеки Material и переименовали его в WidgetState, чтобы он стал доступен Cupertino, базовому фреймворку Flutter и авторам пакетов. Дополнительные сведения о переходе на новый WidgetState см. в руководстве по миграции.

Динамическое масштабирование view

Улучшенное динамическое масштабирование view поможет разработчикам адаптивных макетов, так как повысит адаптивность UI к экранам различных устройств.

Улучшена валидация ввода

Благодаря вкладу разработчика SharbelOkzan во Flutter 3.22 появились более адаптивные методы валидации ввода. С их помощью разработчики смогут сделать обработку пользовательского ввода безопаснее и удобнее для пользователей.

Коварианты в 2D API

Сократив потребность в приведении типов в API для 2D-графики, вы упростите процесс разработки и повысите производительность, что важно для игр и сложной анимации.

Пакетирование ресурсов с учетом flavor

Разработчики, использующие функцию flavors, теперь могут настраивать отдельные ресурсы таким образом, чтобы они включались только в сборку для определенного flavor. Дополнительная информация в разделе Пакетирование ресурсов для определённых flavor.

Преобразование ресурсов с помощью пакетов Dart

Теперь пользователи могут настраивать пакеты Dart таким образом, чтобы ресурсы приложения преобразовывались в процессе пакетирования. Дополнительная информация в разделе Преобразование ресурсов в процессе сборки.

Android

Диплинки

Диплинки могут существенно улучшить взаимодействие пользователя с вашим Flutter-приложением: легко перенаправить пользователей к определенному контенту в приложении, повысить клиентскую активность и стимулировать продажи. И хотя разработчикам настоятельно рекомендуют использовать Universal Link для iOS и App Link для Android, так как это безопасный и удобный в использовании метод, настроить их бывает непросто.

В последний стабильный релиз Flutter мы включили в DevTools валидатор диплинков, который поддерживает проверку веб-конфигураций Android-приложений. Мы добавили в эту версию новый набор функций, которые помогут верифицировать настройки в файлах манифеста ваших Android-приложений.

Дополнительная информация об использовании этого инструмента в разделе Валидация диплинков.

Предиктивный жест «назад»

Мы расширили поддержку новой фичи Android, предиктивного свайпа назад, во Flutter. С её помощью пользователь может посмотреть предыдущий экран или даже приложение, когда делает свайп назад. На устройствах Android эта функция по-прежнему под фича-флагом, но вы можете найти подробную информацию о том, как её опробовать, на GitHub.

Flutter tool обеспечивает соблюдение требований к версиям Gradle, AGP, Java и Kotlin

В этом релизе Flutter tool применяет политику в отношении поддерживаемых версий Gradle, Android Gradle Plugin (AGP), Java и Kotlin. Изначально он выдает только предупреждения.

В настоящее время поддерживаются следующие версии:

  • Gradle: полностью поддерживается с версии 7.0.2 до текущей, в противном случае — предупреждение

  • AGP: полностью поддерживается с версии от 7.0.0 до текущей, в противном случае — предупреждение

  • Java: полностью поддерживается с версии 11 до текущей, в противном случае — предупреждение

  • Kotlin: полностью поддерживается с версии 1.5.0 до текущей, в противном случае — предупреждение

В следующей мажорной версии предупреждения станут ошибками, которые можно будет переопределить с помощью флага --android-skip-build-dependency-validation. По большому счёту, предупреждение появляется как минимум за один релиз до того, как полностью прекратится поддержка (программа выдаст ошибку) определённой версии.

Подробнее политика описана в соответствующей дизайн-спецификации. Мы всегда рады комментариям и обратной связи.

Поддержка Gradle Kotlin DSL в скриптах сборки Gradle на Android

Gradle Kotlin DSL теперь поддерживается во Flutter в качестве альтернативы традиционному Gradle Groovy DSL. Он поможет облегчить работу с кодом благодаря автодополнению, быстрому доступу к документации, навигации по исходному коду и возможности контекстно-зависимого рефакторинга.

Изначально поддержку предоставил пользователь GitHub bartekpacia. Теперь разработчики могут переписать свои скрипты сборки Gradle на Kotlin и воспользоваться данными преимуществами, однако Flutter tool пока не позволяет выбирать Kotlin вместо Groovy при использовании flutter create.

Для получения более подробной информации ознакомьтесь с PR 140744 от bartekpacia.

Улучшения для нативных view

Внимание всем Flutter-разработчикам! Если с помощью Flutter вы пишете приложения, в которых используются нативные компоненты Android (карты, web view, некоторые элементы UI и т.д.), у нас есть важные новости.

Из-за бага в Android 14 приложения, написанные на предыдущих версиях Flutter, могут некорректно работать на устройствах с Android 14.

Мы устранили эту проблему во Flutter 3.22 и в целом повысили производительность нативных компонентов в приложениях под Android. Поэтому, для обеспечения бесперебойной работы приложения на всех устройствах Android, обязательно пересоберите и выпустите его на Flutter 3.22.

В обновление также вошли скрытые улучшения, цель которых — повысить надежность и производительность нативных view на Android.

Прекращаем поддержку KitKat

Минимальная поддерживаемая версия Android во Flutter теперь Lollipop (API 21). Начиная со стабильной версии Flutter 3.22, Flutter больше не будет работать на устройствах с Android KitKat (API 19). Для получения более подробной информации ознакомьтесь с нашим руководством по депрекации.

iOS

Производительность нативных view

Мы в курсе, что производительность нативных view на iOS была проблемой для многих Flutter-разработчиков. Особенно это было заметно в scroll view с нативными view.

Последние обновления непосредственно направлены на решение этих проблем и существенно облегчают жизнь в случаях, когда нужно, например, вставить в статью нескольких рекламных inline-баннеров. Вот несколько ключевых улучшений по результатам бенчмарк-теста:

  • Снизилась загрузка GPU: на 50%, что сократило энергопотребление и потенциально облегчило взаимодействие с пользователем.

  • Улучшен рендеринг кадров: среднее время отрисовки кадра сократилось на 1,66 мс (33%).

  • Минимизированы лаги: в наименее благоприятных сценариях время отрисовки кадра сократилось на 3,8 мс (21%).

Если раньше при использовании нескольких нативных view (например, рекламы, карт и т.д.) в режиме прокрутки у вас падала производительность, с этими оптимизациями процесс прокрутки станет более плавным и отзывчивым. Попробуйте и поделитесь с нами своими впечатлениями.

Средняя нагрузка GPU (чем ниже, тем лучше)
Средняя нагрузка GPU (чем ниже, тем лучше)
Время отрисовки кадра (чем меньше, тем лучше)

Экосистема

Релиз превью Vertex AI для Firebase Dart SDK

Превью Vertex AI для Firebase вышел в открытый доступ и включает в себя Dart SDK. С его помощью можно использовать Gemini API и создавать для своих Dart и Flutter-приложений генеративные AI фичи, держа в уме их коммерческое применение, производительность и корпоративные масштабы. Данный SDK интегрирован с Firebase App Check, который защищает вызовы API и серверную инфраструктуру от серьезных угроз вроде счетов от мошенников, фишинга и приложений, имитирующих пользователя.

Прочитайте «Начало работы с Dart», воспользуйтесь промокодом и получите доступ бесплатно.

Google AI Dart SDK остается в открытом доступе, но его рекомендуется использовать только для создания прототипов. Google AI доступен бесплатно (ограниченный и в доступных регионах) и по схеме с оплатой по факту. Если вы создавали прототипы с помощью Google AI Dart SDK и готовы перейти на Vertex AI для Firebase, ознакомьтесь с руководством по миграции.

Обновления DevTools

Мы продолжаем совершенствовать DevTools, набор инструментов для повышения производительности и отладки в Dart и Flutter. В этот релиз вошли улучшения производительности, разнообразные доработки и новые фичи, в том числе возможность посмотреть загрузку процессора на временной шкале, расширенные фильтры и поддержка импорта и экспорта снимков памяти.

Также мы внесли ряд важных улучшений для разработчиков расширений DevTools в пакеты devtools_extensions и devtools_app_shared. Теперь мы поддерживаем подключение расширений к новому Dart Tooling Daemon (DTD), с помощью которого расширения DevTools получат доступ к публичным методам, зарегистрированным другими клиентами DTD, к примеру IDE, а также доступ к минимальному API файловой системы для взаимодействия с проектом разработки.

Подробнее обо всех обновлениях, вошедших во Flutter 3.22, можно ознакомиться в информации о релизе DevTools 2.32.0, 2.33.0 и 2.34.1.

Google Mobile Ads SDK для Flutter

Для тех из вас, кто монетизирует свои Flutter-приложения с помощью рекламы, у нас есть отличная новость: Google Mobile Ads для Flutter только что обновилась до мажорной версии 5.0.1!

Расширена поддержка User Messaging Platform (UMP) SDK: В обновлении добавлена поддержка новейших API из Android UMP SDK версии 2.2.0 и iOS UMP SDK версии 2.4.0. UMP SDK незаменим для соблюдения правил конфиденциальности, так как упрощает получение согласия пользователя на персонализацию рекламы. В новой версии добавилось несколько новых API, которые упрощают получение согласия.

Расширен список партнеров-посредников: Мы расширили горизонты монетизации благодаря возможности интеграции с популярными рекламными партнерами, такими как Unity, Meta, AppLovin, Iron Source, Mintegral, Pan, DT Exchange, InMobi и Liftoff. Теперь вы можете максимизировать доход от приложения благодаря расширенным возможностям посредничества и его упрощенной реализации.

Рекомендуем опробовать новые функции в своих Flutter-приложениях и рассказать нам, каких партнеров-посредников нам стоит добавить в поддержку. Ваши отзывы очень важны — мы не прекращаем совершенствовать Google Mobile Ads SDK для Flutter.

Изменения без обратной совместимости и статус "Deprecated"

Удаляем Android v1

В настоящее время мы удаляем встроенную первую версию Android. Это, скорее всего, никак не повлияет на большинство приложений, так как:

  1. Вторая версия уже много лет используется по умолчанию.

  2. Flutter tool уже блокирует создание приложений первой версии, если намеренно не переопределить это флагом -- ignore-deprecation.

Эта версия полностью прекращает поддержку Flutter tool для приложений версии 1. Это действие больше нельзя переопределить.

Авторы плагинов, пожалуйста, обратите внимание: когда мы присвоили версии Android 1 статус «deprecated», для авторов плагинов был написан документ о миграции: https://docs.flutter.dev/release/breaking-changes/plugin-api-migration. В рамках миграции авторам плагинов рекомендовалось сохранить поддержку приложений со встроенной версией 1, включив в свой *Plugin.java метод с сигнатурой

public static void registerWith@NonNulll io.flutter.plugin.common.PluginRegistry.Registrar registrar)

Мы планируем полностью удалить возможность встроить Android v1 в следующем релизе, после чего плагины, в которых есть метод с такой сигнатурой, больше не будут компилироваться (поскольку он ссылается на тип из Android v1).

Первая версия стала бесполезной — новый релиз сломал приложения, в которые она встроена. Мы рекомендуем авторам плагинов как можно скорее выпустить обновленные версии своих плагинов и удалить из них код версии 1, чтобы избежать поломок в будущих версиях Flutter. В качестве примера ознакомьтесь с PR 6494, в котором были удалены плагины, поддерживаемые командой Flutter.

"Deprecated" сущности, которые мы удалили из версии 3.22

Изменения без обратной совместимости в этом релизе включают API, которые потеряли обратную совместимость в v3.19. Чтобы ознакомиться со списком API, а также с дополнительным контекстом и рекомендациями по миграции, см. руководство по "deprecated" сущностям в данном релизе. Многие из них поддерживаются Flutter fix, включая исправления в IDE. Массово исправления можно оценить и применить с помощью инструмента командной строки dart fix.

И как всегда, большое спасибо сообществу за тесты — они помогают нам выявлять изменения без обратной совместимости. Подробнее об этом в политике изменений Flutter.

В заключение

Основа успеха Flutter — вы, наше великолепное сообщество. Мы бы не смогли выпустить этот релиз без вашей безграничной помощи и преданности делу. От всего сердца благодарим вас.

Готовы познакомиться с Flutter 3.22? Прочитайте полную информацию о релизе и журнал изменений, заводите терминал и запускайте flutter upgrade. Нам уже не терпится увидеть, что вы соберёте!

Больше полезного про Flutter — в Telegram-канале Surf Flutter Team.

Кейсы, лучшие практики, новости и вакансии в команду Flutter Surf в одном месте. Присоединяйтесь.

Комментарии (1)