Start Debugging

Flutter 3.47 делает Impeller рендерером по умолчанию в Windows, Linux и macOS

Стабильный Flutter 3.47.0 переводит десктопные приложения со Skia на Impeller, не меняя ни строки в коде вашего runner. Что именно меняется, как отключить Impeller на каждой платформе и почему такое отключение временное.

Flutter 3.47.0 вышел в стабильном канале 2026-08-12 и принёс с собой Dart 3.13.0. Основное внимание достаётся отдельным пакетам material_ui и cupertino_ui версии 1.0, которые продолжают разделение, начатое в Flutter 3.44. Изменение, которое на самом деле влияет на то, как ваше приложение отрисовывается, гораздо тише: Impeller стал рендерером по умолчанию в Windows, Linux и macOS.

В вашем проекте не меняется ничего, и в этом вся проблема

Десктопный runner представляет собой сгенерированный код, который лежит в вашем репозитории, поэтому легко предположить, что смена рендерера придёт в виде диффа шаблона, который можно просмотреть. Этого не происходит. В Flutter 3.44 точка входа для Windows выглядит так, и никакого выбора рендерера в ней нет:

flutter::DartProject project(L"data");

std::vector<std::string> command_line_arguments = GetCommandLineArguments();
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));

ImpellerSwitch в SDK 3.44 не встречается нигде. Обновление до 3.47 оставляет windows\runner\main.cpp побайтово тем же и меняет значение по умолчанию под ним. Если сборка под Windows или Linux после обновления начала показывать визуальные регрессии, проверять в первую очередь нужно рендерер, а не дерево виджетов.

Как отключить, по платформам

Для локальной отладки один флаг покрывает все три десктопные платформы:

flutter run --no-enable-impeller

Для разворачиваемой сборки придётся править runner. Windows, файл windows\runner\main.cpp:

flutter::DartProject project(L"data");
project.set_impeller_switch(flutter::ImpellerSwitch::Disabled);

Linux, файл linux/runner/my_application.cc:

g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_enable_impeller(project, FALSE);

macOS, в корневом <dict> файла Info.plist:

<key>FLTEnableImpeller</key>
<false />

Относитесь ко всем трём вариантам как к временной мере. Документация Impeller прямо говорит, что возможность отключения будет удалена в одном из будущих релизов, тем же путём уже прошли iOS и Android. Используйте переключатель, чтобы разблокировать релиз, а затем заведите баг по отрисовке.

Что даёт переход

Impeller ориентируется на Metal в macOS и на Vulkan в Windows и Linux вместо прохода через OpenGL-путь Skia. Конкретный выигрыш касается шейдеров: Impeller компилирует их заранее, во время сборки, а не при первом использовании, и именно это убирает подтормаживание при первом запуске, на которое пользователи десктопа и мобильных устройств жалуются годами. Flutter 3.47 также включает рендеринг через поля знаковых расстояний для текста и векторных кривых в macOS, Linux и Windows, поэтому края глифов и кривые получаются чётче, а широкий цветовой охват в macOS включён по умолчанию.

Остальное из 3.47, что стоит прочитать перед обновлением

Полный список есть в заметках о выпуске Flutter 3.47.0 и в анонсе. Если вы выпускаете десктопное приложение на Flutter, прогоните набор визуальных регрессионных тестов до того, как вливать обновление SDK.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад