Трассировка событий в приложении Windows Presentation Foundation
Содержание
Введение Если вы хотите понять рабочие показатели приложения Windows Presentation Foundation (WPF), полезно будет воспользоваться его функцией трассировки событий для Windows (Event Tracing for Windows или ETW). По умолчанию WPF генерирует массив интересных событий, которые можно использовать для отслеживания выполнения приложения на уровне платформы. Данный документ содержит некоторые сведения о событиях трассировки событий в WPF, которые помогут прояснить, что происходит в приложении и что можно сделать, чтобы повысить его производительность. Что такое трассировка событий в Windows? Трассировка событий в Windows (ETW) предоставляет разработчикам приложений возможность запускать и останавливать сеансы отслеживания событий, настраивать в приложении создание событий трассировки и использовать события трассировки. События трассировки содержат заголовок события и определенные источником данные, которые описывают текущее состояние приложения или операции. События можно использовать для отладки приложения и выполнения анализа обрабатывающей способности и производительности. Визуализация трассировки событий Трассировка событий включает большие объемы информации, и для ее анализа необходимы эффективные инструменты. Команда разработчиков WPF рекомендует два инструмента для просмотра данных ETW. Это приложение XPerf (https://go.microsoft.com/fwlink/?LinkId=128544) и набор инструментов WPF Performance Suite (https://go.microsoft.com/fwlink/?LinkId=128544). Определения событий Существует несколько событий ETW, которые могут быть созданы при работе приложения WPF. В данном разделе приводятся определения доступных событий. Каждое определение включает таблицу, в которой перечислены связанный с событием идентификатор GUID, типы событий, которые можно отслеживать (Info, Start или End), а также любую дополнительную информацию, содержащуюся в событии. Для событий, которые могут различаться по типам "start" (начало) и "end" (конец), подразумевается, что вся дополнительная информация доступна только для типа начала, если не указано иное. В текстовом журнале ETW события отображаются в виде указанного в списке имени события, при этом события начала будут иметь пометку ‘+’ , а события конца – пометку ‘-‘. Особо интересные события помечены в содержании звездочкой (*). События диспетчера WClientUIContextDispatch Возникает при обработке операций диспетчера из очереди диспетчера. Используйте данное событие, чтобы отслеживать события начала и конца, порожденные операциями диспетчера (DispatcherOperation), отправленными в очередь. Если время, прошедшее с начала обработки операции диспетчера, достаточно большое, следует убедиться, что очередь диспетчера не перегружена слишком сложными или высокоприоритетными операциями.
WClientUIContextPost Возникает при успешной отправке операции диспетчера (DispatcherOperation) в очередь диспетчера.
WClientUIContextAbort Возникает при отмене операции диспетчера (DispatcherOperation) и удалении ее из очереди диспетчера.
WClientUIContextPromote Возникает при изменении приоритета операции DispatcherOperation в очереди с помощью метода Dispatcher.SetPriority.
WClientUIContextIdle Возникает, если в процессе обработке следующей операции DispatcherOperation из очереди диспетчера все остальные операции в очереди имеют приоритет “idle” или ниже.
События макета *WClientLayout Возникает в начале и в конце создания макета. Между событиями начала и конца WClientLayout ожидаются события начала и конца сначала для WClientMeasure, а затем для WClientArrange. Также возможно существование нескольких пар событий Measure и Arrange в рамках одного события WClientLayout. Если процесс создания макета занимает слишком долгое время, причина лежит в этапе оценки и (или) упорядочивания объектов. Проверьте возможности дальнейшей оптимизации этапов оценки или упорядочивания. Также следует помнить, что прокручивание курсора в виртуализованных панелях, например таких, как VirtualizingStackPanel, требует ресурсоемкого пересоздания макета в связи с частым развертыванием шаблонов на этапе оценки. В элементах управления ItemsControls избегайте повторения излишне сложных шаблонов ItemTemplates, а также излишне ресурсоемкого кода на этапах оценки и упорядочивания. Рассмотрите возможность виртуализации ItemsControls с помощью большого числа объектов для повышения производительности прокручивания.
*WClientMeasure Возникает в начале и в конце этапа оценки. Если этап оценки занимает слишком много времени, рассмотрите следующие варианты. Излишнее использование шаблонов, сложные шаблоны или частые переключения в визуальное дерево приводят к увеличению времени прохождения этапа оценки WPF. Избегайте анимации свойств со значением FrameworkPropertyMetadata.AffectsMeasure равным ИСТИНА.
*WClientArrange Возникает в начале и в конце этапа упорядочивания. Если этап упорядочивания занимает слишком много времени, рассмотрите следующие варианты. Излишнее использование шаблонов, сложные шаблоны или частые переключения в визуальное дерево приводят к увеличению времени прохождения этапа упорядочивания WPF. Избегайте анимации свойств со значением FrameworkPropertyMetadata.AffectsArrage равным ИСТИНА.
События при взаимодействии WClientCreateVisual Возникает при каждом создании нового объекта HwndTarget.
WClientInputMessage Возникает при обработке сообщения в окне ввода на клавиатуре, мышке или стилусе.
События построения изображения *WClientRenderHandler Возникает перед вызовами стандартного ответного вызова RenderMessageHandler, который выполняет построение пакета преобразователя, а также после таких вызовов. Вызов происходит в ответ на изменение свойств с помощью FrameworkPropertyMetadata.AffectsRender. В рамках стандартного ответного вызова RenderMesageHandler значение TimeManager приращивается на один цикл часов для обновления анимации. Большое количество анимации в сцене приводит к увеличению длительности такта TimeManager. После приращения TimeManager запускается CompositionTarget.Rendering (если этот метод подключен), а затем осуществляется проход визуального дерева для построения пакета преобразователя. Слишком большой промежуток времени между тактами TimeManager (WClientTimeManagerTick) и построением пакета преобразователя (WClientMediaRender) означает, что CompositionTarget. Rendering выполняет большие объемы работы. Ответный вызов может занимать более одного такта, если в CompositionTarget.Rendering добавлены новые анимационные эффекты. Метод CompositionTarget.Rendering вызывается только после первого такта.
*WClientAnimRenderHandler Возникает перед обновлением расписания, анимации и построением пакета преобразователя, а также после этих действий. Этот событие вызывается в ответ на активную анимацию или событие CompositionTarget.Rendering. Замечания для события WClientRenderHandler справедливы и для данного события.
*WClientMediaRender Возникает в начале и в конце построения пакета преобразователя. Если вы используете эффекты BitmapEffects предыдущих версий или вносите сложные изменения в визуальное дерево, построение пакета преобразователя займет больше времени.
WClientPostRender Возникает при каждом вызове метода MediaContext.PostRender. Это происходит каждый раз, когда WPF необходимо срочно выполнить принудительное построение пакета преобразователя. Изменение свойства зависимости со значением ‘FrameworkPropertyMetadata.AffectsRender’ равным ИСТИНА приведет к тому, что метод MediaContext.PostRender вызовет стандартный ответ RenderMessageHandler в качестве операции диспетчера с приоритетом ‘Render’. Если после события WClientPostRender возникает большая пауза перед следующим событием RenderHandler, это может означать нехватку ресурсов для очереди диспетчера с приоритетом 'Render'.
События при формировании WClientQPCFrequency Возникает при вызове статического конструктора класса MediaContext. Данное событие служит источником частоты и текущего времени для высокочувствительного счетчика производительности, если таковой существует.
WClientPrecomputeScene Возникает в начале и в конце этапа предварительных вычислений визуализации корня. На этапе предварительных вычислений вычисляются границы "грязной" части визуального дерева.
WClientCompileScene Возникает в начале и в конце этапа компиляции сцены, в рамках которого выполняется подготовка визуальных изменений для обрабатывающего потока. Этап компиляции может занимать слишком много времени, если выполняется слишком большое количество обновлений сцены. Можно упростить изменения сцены, чтобы свести к минимуму число обновлений.
*WClientUpdateRealizations Возникает в начале и в конце обновления реализаций. Если этап обновления реализаций занимает слишком много времени, проверьте наличие эффектов BitmapEffects предыдущих версий. Известно, что они снижают производительность. Команда разработчиков WPF не рекомендует их использовать. Если установлена версия WPF, предшествующая .NET Framework 3.5 SP1, избыточные обновления текста, например, анимационные эффекты, также могут привести к снижению производительности при обновлении реализаций.
WClientUIResponse Возникает в конце построения пакета преобразователя.
WClientUICommitChannel Возникает при отправке изменений визуализации на обрабатывающий поток.
*WClientUceNotifyPresent Возникает при каждом обновлении экрана обрабатывающим потоком. Так как данное событие возникает каждый раз, когда приложение WPF появляется на экране, частота события в секунду может использоваться для вычисления частоты кадров приложения. Параметр MIL_PRESENTATION_RESULTS определяется следующим образом:
WClientScheduleRender Возникает при каждом внесении в расписание нового этапа преобразования.
События при разборе XAML/BAML WClientParseBaml Возникает в начале и в конце разбора языка Binary Application Markup Language (BAML). Время в данном событии включает время, проведенное в WClientParseFefCrInst, WClientParseInstVisTree, WClientParseRdrCrInst и WClientParseRdrCrInFType.
WClientParseXml Возникает в начале и в конце разбора XML. Время здесь включает время, проведенное в WClientParseFefCrInst, WClientParseInstVisTree, WClientParseRdrCrInst и WClientParseRdrCrInFType.
WClientParseXmlInitialized Возникает после инициализации средства синтаксического анализа XAML.
WClientParseFefCrInst Возникает в начале и в конце применения ControlTemplate к элементу.
WClientParseInstVisTree Возникает в начале и в конце применения ControlTemplate к элементу из XAML. Поле ‘message’ (сообщение) доступно только для события типа ‘end’.
WClientParseRdrCrInst Возникает при каждом создании BamlRecordReader нового экземпляра объекта.
WClientParseRdrCrInFTyp Возникает при каждом создании BamlRecordReader нового экземпляра объекта из Type. Поле ‘type’ (тип) доступно только для события типа ‘end’.
Прочие события WClientAppCtor Возникает при построении класса Application. См. описание WClientAppRun.
WClientAppRun Возникает при вызове метода Application.Run. Так как данное событие возникает в рамках метода Application.Run, все предшествующие события могут быть отнесены к времени запуска приложения.
*WClientTimeManagerTick Возникает при каждом такте TimeManager. Поле ‘ticktime’ (время такта) доступно только для события типа ‘start’.
WClientString Возникает для пользовательских событий ‘string’. Среди мест, где в WPF возникают пользовательские события: методы ContentPresenter.BuildVisualTree, DrawingContext.DrawText, ItemsContainerGenerator.SetStatus, ScrollContentPresenter.Measure/ArrangeOverride, ScrollViewer.MeasureOverride, Stack.Measure/ArrangeOverride, TextFormatterImpl.FormatLineInternal и VirtualizingStackPanel.Measure/ArrangeOverride.
WClientFontCache Возникает при перегрузке кэша шрифтов.
|
Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.