предисловие
представить вамDevTools
На это есть несколько основных причин 🚀 :
- прежде всего
DevTools
сам по себеFlutter
Официально рекомендуемый инструмент отладки. -
DevTools
используетсяFlutter
Написано, очень своеобразно 🖼 . - Он имеет очень полную функцию отладки, которая может удовлетворить потребности в оптимизации разных размеров и аспектов ⚙️.
DevTools
Прежде всего, большое знакомство с сегодняшним главным героем: DevTools 👏
Введение на официальном сайте:
DevTools is a suite of performance and debugging tools for Dart and Flutter. It’s currently in beta release, but is under active development.
переводить:
DevTools
даDart
а такжеFlutter
Набор инструментов производительности и отладки. В настоящее время он находится в стадии бета-тестирования, но находится в активной разработке.
установить 🔌
нужно использоватьDevTools
Прежде всего, предпосылка всего, должна быть, чтобы установить его,yes
, этот, казалось бы, простой шаг на самом деле занял у меня довольно много времени. Я надеюсь, что у вас будет гладкая установка, я познакомлю вас с четырьмя видами открытыхDevTools的方法
.
Android Studio / Intellij
Друзья, которые используют два вышеуказанных средства разработки, смотрите сюда 🙋♂️, открывайте на такие средства разработкиDevTools
Есть три шага
- Установить
Flutter
Плагин:
Сначала убедитесь, что вы установили инструменты разработкиFlutter
Плагин (его еще никто не устанавливал, нет 👀 )
- Начать отладку приложения 🔩
Да, буквально, проект проекта, который позволяет отлаживать (рекомендуется использоватьProfile
модель). дружеское напоминание:Profile
Режим может работать только на реальном устройстве 📱.
- оказаться
DevTools
Вход
фактическиDevTools
Вход не очень бросается в глаза, но найти его все равно легко, на панели инструментов внизу мы часто используемhot reload
Сбоку просто нажмите кнопку 🔘, чтобы начать проектDevTools
.
(P.S. Сам пользуюсьAndroid Studio
, но у меня так не получалось, так было всегдаInstalling DevTools...
, если знаете причину, подскажите пожалуйста в комментариях, Али Гадо 🤗 )
VS Code
- Установить
Flutter
Плагин:
Сначала убедитесь, что вы установили инструменты разработкиFlutter
,Dart
плагин (такой же, какAndroid Studio
)
-
в
VS Code
Откройте корневой каталог вашего проекта (содержащийpubspec.yaml
) и нажмитеRun > Debugging
(F5
), чтобы начать сеанс отладки. -
Запустить программу развития
- Когда сеанс отладки активен и приложение открыто 🏃🏻 , затем
VS Code
Панель команд покажетDart: Open DevTools
- При первом запуске (и при обновлении SDK в будущем) вам будет предложено активировать или обновить
DevTools
.
Командная строка
- Установить инструменты разработчика
Если в вашей переменной окруженияPATH
имеютpub
, бежать 🚀:
pub global activate devtools
Если переменная окруженияPATH
имеютflutter
, бежать 🚀:
flutter pub global activate devtools
- Запустите службу инструментов разработчика
Далее запускаем локальныйweb server
сервис для запуска инструментов разработчика. Запустите одну из двух команд ниже.
pub global run devtools # If you have `pub` on your path.
flutter pub global run devtools # If you have `flutter` on your path.
После запуска этих двух строк кода в командной строке должен появиться такой вывод:
An Observatory debugger and profiler on iPhone X is available
at: http://127.0.0.1:50976/Swm0bjIe0ks=/
at
позадиDevTools
адрес, вы можете использовать его напрямуюChrome
Просто откройте его. Открывшаяся веб-страница требует заполнить ссылку, то есть проект, который нужно отлаживатьDebug service
Адрес прослушивания, откуда взялся этот адрес 🤔 ?
3. Начнитеapp
Приходитьdebug
Фактически, указанный выше адрес ссылки 🔗 — это место, где мы обычно запускаем проект.Log
середина. Каждый запускает проект, вы можете найти его в первых нескольких строках лога.Debug service
адрес, как показано на рисункеlistening on
В следующей части заполните ссылку на веб-странице, которую мы открыли на втором этапе, и вы сможете войти в соответствующий проект нашего проекта.DevTools
среди.
Насильственно открыть
Вышеупомянутые три являютсяFlutter
Способы установки и открытия, представленные на официальном сайте, к сожалению, у меня не открывались успешно 🤯 , либо устанавливались постоянно, либо открывалась очень старая версияDevTools
, он должен быть с моимDart SDK
Конфигурация пути связана, поэтому после моих исследований я нашел очень удачный метод открытия 🤫 (в настоящее время я не знаю, каковы недостатки).
- оказаться
Flutter
Адрес папки.
Это зависит от человека к человеку, вы должны знать о своем компьютереflutter
путь, например, я положил его в моем личномdevelopment
Под содержанием:
/Users/tys/development/flutter
- оказаться
DevTools
Это ключ к жестокому открытию, о котором я говорю здесь 🔑 , я нашел..., этоDevTools
, кажется, тихо разместилиFlutter
середина.
/Users/tys/development/flutter/.pub-cache/bin/devtools
В указанном выше каталоге вы можете найти его напрямую, дважды щелкнуть, чтобы открыть его, и перейти прямо к хорошему парню 💡
Wuhu ~ Перейти непосредственно к последнему шагу, открытому с помощью командной строки выше. И это то, что вы сейчас используетеFlutter
Последняя доступная версия, соответствующая версииDevTools
!
Использование DevTools 🕵🏻♂️‘
Я буду представлять каждую функцию одну за другой в порядке панели инструментов в верхней части DevTools 🤓.
Flutter inspector
- Введение:Функция этой части в основном является интерфейсным модулем для вас.Во-первых, он будет отображать ваше общее дерево чертежа макета🌲.Нажав на каждый узел дерева, вы увидите более подробную информацию о макете с правой стороны🐳, и в то же время , на информации о макете Вы можете увидеть информацию о визуальном представлении и выполнить некоторые простые операции выбора.Эта часть функции имеет две основные цели в официальных словах:
1. Разобраться с существующим макетом.
2. Диагностика проблем макета.
Давайте рассмотрим содержимое этого модуля в порядке, отмеченном красным на рисунке ниже 🔍
Select widget mode
На самом деле это вид выбора, это видят всеTab
Соответствующее на самом деле все ваше дерево рисования 🌲, и структурная сложность такого дерева обычно связана со сложностью вашей страницы. Если это сложная структура страницы, дерево будет очень большим и будет выглядеть размытым. Чтобы мы могли лучше видеть подробную структуру в дереве, мы можем щелкнуть узел на дереве, чтобы просмотреть его в области , Подробности о части дерева 🔮 .
Detail Tree
Как следует из названия, здесь представлена подробная информация о только что выбранном узле.На самом деле фактическая информация может натолкнуть на размышления ❤️. Посмотрите на картинку, я выбрал одинContainer
узел ,Container
Вам будут предложены следующие неназначенные свойства, такие какbg
цвет фона и т.д. Если на вашей странице есть цвета, цветные оверлеи и т. д., через них это будет хорошо видно 🔬 .
Layout Explorer
Это удивительно, это браузер макета вашего текущего выбранного узла. Например, как видите, я выбрал этоContainer
Подробная структура пакета показана ниже, включая каждыйWiget
Границы даже показывают рассчитанную высоту и ширину 📏 (в соответствии со стандартным размером разрешения).
Layout Explorer
Не только позволяет просматривать весь интерфейс макета, но и позволяет выполнять некоторые простые динамические операции, позволяя уточнить проблемы или дефекты макета без изменения кода (пожалуйста, смотрите анимацию ⬇️ ).
Slow Animations
При нажатии на эту кнопкуApp
Все анимационные эффекты в пределах скорости, почувствуйте0.5
Волшебный мир двойной скорости 🤩 , сказано тутAnimations
Включая, но не ограничиваясь вашим переходом на интерфейс,Hero
Например, анимация системного уровня, лично я считаю, что эта часть функции имеет две основные функции.
1. Если ваша анимация не имеет задержек в этом режиме, это означает, что ваша анимация идеальна и может улучшить взаимодействие с пользователем 👍 .
2. Разрешить некоторым аниматорам видеть свои анимационные кривые и траектории 🕳 .
Debug Paint
Добавлены визуальные подсказки по отладке при рендеринге, чтобы показать границы, отступы, выравнивание и интервалы. Отобразит общий макет на вашем эмуляторе, включая общее направление рендеринга и базовые классы компонентов.
Paint Baselines
Заставляет каждый RenderBox рисовать линию на каждой из его базовых линий текста. Это зеленая линия на картинке ниже ⬇️
Repaint Rainbow
Включите эту функцию, когда ваш интерфейс будет перерисован, он изменит цвет границы в перерисованной части 🎆. Например, у вас естьbanner
,интервал1s
Смени картинку, потом каждую секунду своюbanner
Цвет вокруг графика изменится на случайный цвет. Лично цель состоит в том, чтобы позволить нам увидеть часть текущей страницы, которая рисуется или перерисовывается.
Хронология 🌟
Пожалуйста, используйте фактическое устройство для отладки при выполнении отладки производительности. Skia имеет два очень разных бэкэнда: Flutter использует чисто процессорный бэкэнд в симуляторе iOS, а аппаратный ускоренный бэкенд на GPU обычно используется в реальных устройствах, поэтому характеристики производительности сильно различаются.
TimeLine
даDevTools
Более практичная и содержательная часть. позволяет реально увидетьAPP
существующийUI
проблема илиGPU
вопрос. Далее я возьму вас, чтобы научиться анализировать себяFlutter APP
исполнение рисунка 🩺 .
Сначала вы можете увидеть, что верхняя часть на картинке выше — это столбчатая диаграмма 📊. Эта часть является схемой состояния операции, которую вы только что сделали.По легенде справа вы также можете понять смысл.Вот я поясню это для вас.
Пользовательский интерфейс, Растр, Джанк
Посмотрите на гистограмму, есть красный и синий, а светло-синийUI
Рисунок ветки, темно-синий это ваша ветка растеризации(GPU
нить). Красный означает, что ваш рисунок застрял. Как правило, мыFlutter
Здесь мы определяем Caton: если время рендеринга кадра превышает16ms
, будет считаться, что этот кадр задержан, чтобы добиться частоты рендеринга кадров на60 FPS
(кадров в секунду), время рендеринга на кадр должно быть меньше или равно16 ms
. Если эта цель не будет достигнута, вы обнаружитеUI
Не плавные и не выпадающие кадры 📌 .
Timeline Event
Что мы можем видеть в средней части всего интерфейсаTimeline Event
, что на самом деле соответствует деталям карты ситуации, которую мы нарисовали выше, и является событием в процессе рисования. Мы можем использовать его, чтобы увидеть причины нашего отставания в деталях. Давайте выберем один из застрявших кадров и внимательно его проанализируем 🧮 .
Как вы можете видеть на картинке нижеTimeline Event
, по-прежнему делится на две части, верхняя частьUI Event
, нижняя частьRaster Event
. В этот период времени мы отчетливо ощущаем, что нашаUI Event
Это заняло очень много времени ⏰ . чтобы каждый могTimeLine Event
Значение имеет лучшее понимание, здесь настоящим включено посредством ссылки:
Вкладка графика пламени используется для отображения выбранных событий кадра,
CPU
образец информации. На графике показана информация о стеке вызовов сверху вниз, то есть кадр стека выше вызывает кадр стека ниже. Ширина каждого кадра стека представляетCPU
продолжительность исполнения. потребление кадров стекаCPU
Чем он длиннее, тем больше вероятность, что мы сможем улучшить производительность.
Мы можем видеть верхний в информации о стеке вышеEvent
ВызовVsyncProgressCallback
, на изображении ниже мы видим внизу, что этот стек занимает до40.6ms
, почти недопустимо 🚽 . На самом деле, после того, как мы щелкнем по гладкому кадру, мы обнаружим, что там также будетVsyncProgressCallback
. Так почему же этот кадр необычайно длинный и вызывает заикание?
Итак, чтобы глубже понять, почему, нам нужно копать дальше, нам нужно больше информации.
- Более подробный график пламени 🔥 (
CPU Flame Chart
)
Здесь находится подробная информация, которая вам нужна, в том числе ситуация, требующая много времени для конкретного внутреннего стека. ЗачемVsyncProgressCallback
так долго. Какие подробности внутренних операций, тут понятно 🐮 . Здесь мы видим, что долгое времяVsyncProgressCallback
по сравнению с коротким временемVsyncProgressCallback
Еще несколько частей. ясноVsyncProgressCallback
После получения информации о внутреннем стеке мы можем целенаправленно проанализировать внутренний трудоемкий стек. переключиться на наш второйTab
.
Связанный
Flutter
серединаVsync
Снимок рекомендуется чтение:Механизм рендеринга Flutter — поток пользовательского интерфейса🔗 .
- дерево вызовов
Эта часть ближе нашим разработчикам, мы можем посмотреть в деталяхVsyncProgressCallback
Какие функции вызываются конкретно, а какие занимают много времени. Давайте снова объединим приведенную выше картинку.Здесь находится работа, которую мы делаем больше в рамках Caton, или функция, которую мы вызываем больше.performRebuild
, нажмите на конкретный вызов функции, мы можем обнаружить, что эта функция была вызвана в цикле. Это прямо здесьperformRebuild
По сути, это процесс обхода вашего дерева рисования 🌲, что означает, что вы обновили огромное дерево рисования в текущем кадре, а также перерисовали несколько дочерних узлов в дереве. Так что мы должны проверить, в какой части интерфейса мы вызываем перерисовку нескольких компонентов, или в какой части интерфейса.view_mode
, который управляет таким процессом перерисовки, нет ли ненужных перерисовок. Это улучшает производительность рендеринга 😆.
В приведенном выше разделе объясняется нашаUI
Часть причин блокировки потока и методы устранения неполадок, если этоGPU
Шерстяная ткань? Точно так же мы выбираем кадр, типичный дляGPU
Трудоемкая операция, в этой информации стека мы можем увидеть нашуGPU
Метод действительно занимает много времени ⏳, опять жеGPURasterizer::Draw
Почему определенный кадр такой длинный?
на самом делеDevTools
изRaster
В виде эта часть не может быть отображена очень четко. Но есть и другой способ понять, почему. Вы можете заполнить перед открытием напрямуюDevTools
ссылка на. если тыprofile
режим, вашlog
Вы можете найти эту ссылку в 🔗.
Нажмите на эту ссылку, в средней части этой страницы мы можем найтиtimeline
Инструменты (на схеме я отметил их красными прямоугольниками).
перейти в этот разделtimeline
После этого вот самая подробная информация о каждом кадре 📌 . Вы можете выбрать область с помощью мыши, и конкретные вызовы функций выбранной области будут выводиться ниже. Включая имя функции, общее время, количество вызовов каждый раз и отношение визуальной гистограммы 📊. С одного взгляда. СвязанныйGPU
Некоторые вызовы функций требуют каждогоFlutter Engine
Исходный код имеет относительно высокое понимание, чтобы решить проблему целенаправленно. Связанный стек вызовов очень сложен.
Официальное заявление займет много времениskia
вызов функции:
saveLayer
: очень много времени, каждый вызов должен перераспределять буфер рисования в ЦП и сообщатьGPU
Переключите цель рисования. Особенно на старых устройствах.clipPath
: требует много времени, каждый вызов будет влиять на каждую последующую команду рисования.Когда команда рисования сложная, она будет выполнять несколько иclipPath
операция пересечения, положить вclipPath
Другая часть удаляется.
Можно сказать, что эта часть функции почти не используется в программировании 🤯 , но на самом деле они широко распространены в нашем общемWidget
и его свойства. Хорошая новостьFlutter Team
В прошлых итерациях обновлений было устранено множество ненужных трудоемких операций, подобных описанным выше 🐳 . Так что, когда каждый в своемtimeline
После обнаружения подобных трудоемких операций вWidget
Гораздо проще, чем раньше, анализировать и находить источник исходного кода компонента.
На приведенной выше диаграмме ситуации с вызовом функции короткая длительная операция не означает, что она вряд ли вызовет зависание. Скорее всего, вы нашли
saveLayer
вызов, но не так много времени, как ожидалось. На самом деле, потому что: серверная часть GPU Skia получаетsaveLayer
После команды будет выполнена простая предварительная обработка, и она сразу же вернется, что создаст иллюзию того, что она не занимает много времени. Но фактический последующий асинхронный процесс также вызоветSkCanvas::Flush
вызывают много времени. Целью асинхронной обработки здесь является упаковка нескольких предварительно обработанных сообщений 📦 и отправка их вGPU
рисовать.
заключительные замечания
оFlutter
Производительность отрисовки интерфейса во введении представлена здесь. Надеюсь, эта статья может вам в какой-то степени помочь 🤪, я продолжу представлять ее позже.Flutter
Для связанного управления памятью и других связанных знаний, следите за обновлениями 🧸 .
Ссылаться на:DevTools