Поделиться через


Трассировка событий в приложении Windows Presentation Foundation

Содержание

  • Введение
    • Что такое трассировка событий в Windows?
    • Визуализация трассировки событий
  • Определения событий
    • События диспетчера
      • WClientUIContextDispatch
      • WClientUIContextPost
      • WClientUIContextAbort
      • WClientUIContextPromote
      • WClientUIContextIdle
    • События макета
      • *WClientLayout
      • *WClientMeasure
      • *WClientArrange
    • События при взаимодействии
      • WClientCreateVisual
      • WClientInputMessage
    • События построения изображения
      • *WClientRenderHandler
      • *WClientAnimRenderHandler
      • *WClientMediaRender
      • WClientPostRender
    • События при формировании
      • WClientQPCFrequency
      • WClientPrecomputeScene
      • WClientCompileScene
      • *WClientUpdateRealizations
      • WClientUIResponse
      • WClientUICommitChannel
      • *WClientUceNotifyPresent
      • WClientScheduleRender
    • События при разборе XAML/BAML
      • WClientParseBaml
      • WClientParseXml
      • WClientParseXmlInitialized
      • WClientParseFefCrInst
      • WClientParseInstVisTree
      • WClientParseRdrCrInst
      • WClientParseRdrCrInFTyp
    • Прочие события
      • WClientAppCtor
      • WClientAppRun
      • *WClientTimeManagerTick
      • WClientString
      • WClientFontCache

Введение

Если вы хотите понять рабочие показатели приложения 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), отправленными в очередь. Если время, прошедшее с начала обработки операции диспетчера, достаточно большое, следует убедиться, что очередь диспетчера не перегружена слишком сложными или высокоприоритетными операциями.

Идентификатор GUID 2481a374-999f-4ad2-9f22-6b7c8e2a5db0
Приоритет [UInt32] DispatcherPriority для DispatcherOperation.
Операция [строчный тип] Название операции диспетчера (DispatcherOperation).
Типы событий Start, End

 

WClientUIContextPost

Возникает при успешной отправке операции диспетчера (DispatcherOperation) в очередь диспетчера.

Идентификатор GUID 76287aef-f674-4061-a60a-76f95550efeb
Приоритет [UInt32] DispatcherPriority для DispatcherOperation.
Операция [строчный тип] Название операции диспетчера (DispatcherOperation).
Типы событий Info

 

WClientUIContextAbort

Возникает при отмене операции диспетчера (DispatcherOperation) и удалении ее из очереди диспетчера.

Идентификатор GUID 39404da9-413f-4581-a0a1-4715168b5ad8
Приоритет [UInt32] DispatcherPriority для DispatcherOperation.
Операция [строчный тип] Название операции диспетчера (DispatcherOperation).
Типы событий Info

 

WClientUIContextPromote

Возникает при изменении приоритета операции DispatcherOperation в очереди с помощью метода Dispatcher.SetPriority.

Идентификатор GUID 632d4e9e-b988-4b32-ab2a-b37aa34927ee
Приоритет [UInt32] DispatcherPriority для DispatcherOperation.
Операция [строчный тип] Название операции диспетчера (DispatcherOperation).
Типы событий Info

 

WClientUIContextIdle

Возникает, если в процессе обработке следующей операции DispatcherOperation из очереди диспетчера все остальные операции в очереди имеют приоритет “idle” или ниже.

Идентификатор GUID c626ebef-0780-487f-81d7-38d3f0a6f05e
Типы событий Info

 

События макета

*WClientLayout

Возникает в начале и в конце создания макета. Между событиями начала и конца WClientLayout ожидаются события начала и конца сначала для WClientMeasure, а затем для WClientArrange. Также возможно существование нескольких пар событий Measure и Arrange в рамках одного события WClientLayout.

Если процесс создания макета занимает слишком долгое время, причина лежит в этапе оценки и (или) упорядочивания объектов. Проверьте возможности дальнейшей оптимизации этапов оценки или упорядочивания. Также следует помнить, что прокручивание курсора в виртуализованных панелях, например таких, как VirtualizingStackPanel, требует ресурсоемкого пересоздания макета в связи с частым развертыванием шаблонов на этапе оценки. В элементах управления ItemsControls избегайте повторения излишне сложных шаблонов ItemTemplates, а также излишне ресурсоемкого кода на этапах оценки и упорядочивания. Рассмотрите возможность виртуализации ItemsControls с помощью большого числа объектов для повышения производительности прокручивания.

Идентификатор GUID A3edb710-21fc-4f91-97f4-ac2b0df1c20f
Id [Int32] Идентификатор диспетчера, который выполняет текущее создание макета.
Типы событий Start, End

 

*WClientMeasure

Возникает в начале и в конце этапа оценки.

Если этап оценки занимает слишком много времени, рассмотрите следующие варианты. Излишнее использование шаблонов, сложные шаблоны или частые переключения в визуальное дерево приводят к увеличению времени прохождения этапа оценки WPF. Избегайте анимации свойств со значением FrameworkPropertyMetadata.AffectsMeasure равным ИСТИНА.

Идентификатор GUID 3005e67b-129c-4ced-bcaa-91d7d73b1544
Id [Int32] Идентификатор диспетчера, который выполняет текущее создание макета.
Типы событий Start, End

 

*WClientArrange

Возникает в начале и в конце этапа упорядочивания.

Если этап упорядочивания занимает слишком много времени, рассмотрите следующие варианты. Излишнее использование шаблонов, сложные шаблоны или частые переключения в визуальное дерево приводят к увеличению времени прохождения этапа упорядочивания WPF. Избегайте анимации свойств со значением FrameworkPropertyMetadata.AffectsArrage равным ИСТИНА.

Идентификатор GUID 4b0ef3d1-0cbb-4847-b98f-16408e7e83f3
Id [Int32] Идентификатор диспетчера, который выполняет текущее создание макета.
Типы событий Start, End

 

События при взаимодействии

WClientCreateVisual

Возникает при каждом создании нового объекта HwndTarget.

Идентификатор GUID 2dbecf62-51ea-493a-8dd0-4bee1ccbe8aa
Id [Int32] Идентификатор диспетчера, который выполняет текущее создание макета.
HWND [Int64] 64-разрядный указатель на HWND.
Типы событий Info

 

WClientInputMessage

Возникает при обработке сообщения в окне ввода на клавиатуре, мышке или стилусе.

Идентификатор GUID 4ac79bac-7dfb-4402-a910-fdafe16f29b2
Id [Int32] Идентификатор диспетчера, который обрабатывает событие ввода.
HWND [Int64] 64-разрядный указатель на HWND.
Msg [Int32] Идентификатор сообщения.
WParam [Int32] WParam сообщения.
LParam [Int32] LParam сообщения.
Типы событий Info

 

События построения изображения

*WClientRenderHandler

Возникает перед вызовами стандартного ответного вызова RenderMessageHandler, который выполняет построение пакета преобразователя, а также после таких вызовов. Вызов происходит в ответ на изменение свойств с помощью FrameworkPropertyMetadata.AffectsRender.

В рамках стандартного ответного вызова RenderMesageHandler значение TimeManager приращивается на один цикл часов для обновления анимации. Большое количество анимации в сцене приводит к увеличению длительности такта TimeManager. После приращения TimeManager запускается CompositionTarget.Rendering (если этот метод подключен), а затем осуществляется проход визуального дерева для построения пакета преобразователя. Слишком большой промежуток времени между тактами TimeManager (WClientTimeManagerTick) и построением пакета преобразователя (WClientMediaRender) означает, что CompositionTarget. Rendering выполняет большие объемы работы. Ответный вызов может занимать более одного такта, если в CompositionTarget.Rendering добавлены новые анимационные эффекты. Метод CompositionTarget.Rendering вызывается только после первого такта.

Идентификатор GUID 7723d8b7-488b-4f80-b089-46a4c6aca1c4
Id [Int32] Идентификатор диспетчера, который обрабатывает событие ввода.
Типы событий Start, End

 

*WClientAnimRenderHandler

Возникает перед обновлением расписания, анимации и построением пакета преобразователя, а также после этих действий. Этот событие вызывается в ответ на активную анимацию или событие CompositionTarget.Rendering. Замечания для события WClientRenderHandler справедливы и для данного события.

Идентификатор GUID 521c1c8d-faaa-435b-ad8c-1d64442bfd70
Id [Int32] Идентификатор диспетчера, который обрабатывает событие ввода.
Типы событий Start, End

 

*WClientMediaRender

Возникает в начале и в конце построения пакета преобразователя.

Если вы используете эффекты BitmapEffects предыдущих версий или вносите сложные изменения в визуальное дерево, построение пакета преобразователя займет больше времени.

Идентификатор GUID 6827e447-0e0e-4b5e-ae81-b79a00ec8349
Id [Int32] Идентификатор преобразователя для текущего этапа преобразования.
QPCExpectedPresentTime [Int64] Оценочное время следующей презентации в виде счетчика QPC.
Типы событий Start, End

 

WClientPostRender

Возникает при каждом вызове метода MediaContext.PostRender. Это происходит каждый раз, когда WPF необходимо срочно выполнить принудительное построение пакета преобразователя. Изменение свойства зависимости со значением ‘FrameworkPropertyMetadata.AffectsRender’ равным ИСТИНА приведет к тому, что метод MediaContext.PostRender вызовет стандартный ответ RenderMessageHandler в качестве операции диспетчера с приоритетом ‘Render’. Если после события WClientPostRender возникает большая пауза перед следующим событием RenderHandler, это может означать нехватку ресурсов для очереди диспетчера с приоритетом 'Render'.

Идентификатор GUID fb69cd45-c00d-4c23-9765-69c00344b2c5
Типы событий Info

 

События при формировании

WClientQPCFrequency

Возникает при вызове статического конструктора класса MediaContext. Данное событие служит источником частоты и текущего времени для высокочувствительного счетчика производительности, если таковой существует.

Идентификатор GUID 30EE0097-084C-408b-9038-73BED0479873
QPCFrequency [Int64] Частота высокочувствительного счетчика производительности.
QPCCurrentTime [Int64] Текущее время высокочувствительного счетчика производительности.
Типы событий Info

 

WClientPrecomputeScene

Возникает в начале и в конце этапа предварительных вычислений визуализации корня.

На этапе предварительных вычислений вычисляются границы "грязной" части визуального дерева.

Идентификатор GUID 3331420f-7a3b-42b6-8dfe-aabf472801da
Id [Int32] Идентификатор CompositionTarget, который выполняет предварительное вычисление сцены.
Типы событий Start, End

 

WClientCompileScene

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

Этап компиляции может занимать слишком много времени, если выполняется слишком большое количество обновлений сцены. Можно упростить изменения сцены, чтобы свести к минимуму число обновлений.

Идентификатор GUID af36fcb5-58e5-48d0-88d0-d8f4dcb56a12
Id [Int32] Идентификатор CompositionTarget, который выполняет компиляцию сцены.
Типы событий Start, End

 

*WClientUpdateRealizations

Возникает в начале и в конце обновления реализаций.

Если этап обновления реализаций занимает слишком много времени, проверьте наличие эффектов BitmapEffects предыдущих версий. Известно, что они снижают производительность. Команда разработчиков WPF не рекомендует их использовать. Если установлена версия WPF, предшествующая .NET Framework 3.5 SP1, избыточные обновления текста, например, анимационные эффекты, также могут привести к снижению производительности при обновлении реализаций.

Идентификатор GUID 22272cfc-de04-4900-af53-3ee8ef1ef426
Типы событий Info

 

WClientUIResponse

Возникает в конце построения пакета преобразователя.

Идентификатор GUID ab29585b-4794-4465-91e6-9df5861c88c5
ContextID [Int32] Идентификатор класса MediaContext, выполняющего построение пакета преобразователя.
ResponseID [Int32] Идентификатор текущего этапа преобразования.
Типы событий Info

 

WClientUICommitChannel

Возникает при отправке изменений визуализации на обрабатывающий поток.

Идентификатор GUID f9c0372e-60bd-46c9-bc64-94fe5fd31fe4
Id [Int32] Идентификатор текущего этапа преобразования.
Типы событий Info

 

*WClientUceNotifyPresent

Возникает при каждом обновлении экрана обрабатывающим потоком.

Так как данное событие возникает каждый раз, когда приложение WPF появляется на экране, частота события в секунду может использоваться для вычисления частоты кадров приложения. Параметр MIL_PRESENTATION_RESULTS определяется следующим образом:

internal enum MIL_PRESENTATION_RESULTS
{
    MIL_PRESENTATION_VSYNC,
    MIL_PRESENTATION_NOPRESENT,
    MIL_PRESENTATION_VSYNC_UNSUPPORTED,
    MIL_PRESENTATION_DWM,
    MIL_PRESENTATION_FORCE_DWORD = unchecked((int)0xffffffff)
};
Идентификатор GUID 24cd1476-e145-4e5a-8bfc-50c36bbdf9cc
QPCLastPresentationTime [Int64] Время последней презентации в виде счетчика QPC.
PresentationResults [Int64] Значение параметра MIL_PRESENTATION_RESULTS для данного представления.
Типы событий Info

 

WClientScheduleRender

Возникает при каждом внесении в расписание нового этапа преобразования.

Идентификатор GUID 6d5aeaf3-a433-4daa-8b31-d8ae49cf6bd1
RenderDelay [Int32] Задержка в миллисекундах перед следующим преобразованием.
Типы событий Info

 

События при разборе XAML/BAML

WClientParseBaml

Возникает в начале и в конце разбора языка Binary Application Markup Language (BAML). Время в данном событии включает время, проведенное в WClientParseFefCrInst, WClientParseInstVisTree, WClientParseRdrCrInst и WClientParseRdrCrInFType.

Идентификатор GUID 8a1e3af5-3a6d-4582-86d1-5901471ebbde
Типы событий Start, End

 

WClientParseXml

Возникает в начале и в конце разбора XML. Время здесь включает время, проведенное в WClientParseFefCrInst, WClientParseInstVisTree, WClientParseRdrCrInst и WClientParseRdrCrInFType.

Идентификатор GUID bf86e5bf-3fb4-442f-a34a-b207a3b19c3b
Типы событий Start, End

 

WClientParseXmlInitialized

Возникает после инициализации средства синтаксического анализа XAML.

Идентификатор GUID 80484707-838b-4328-9f31-5ecbaf25a531
Типы событий Info

 

WClientParseFefCrInst

Возникает в начале и в конце применения ControlTemplate к элементу.

Идентификатор GUID f7555161-6c1a-4a12-828d-8492a7699a49
Типы событий Start, End

 

WClientParseInstVisTree

Возникает в начале и в конце применения ControlTemplate к элементу из XAML. Поле ‘message’ (сообщение) доступно только для события типа ‘end’.

Идентификатор GUID a8c3b9c0-562b-4509-becb-a08e481a7273
Сообщение [строковый тип] Сообщение, описывающее, почему был создан данный экземпляр.
Типы событий Start, End

 

WClientParseRdrCrInst

Возникает при каждом создании BamlRecordReader нового экземпляра объекта.

Идентификатор GUID 8ba8f51c-0775-4adf-9eed-b1654ca088f5
Типы событий Start, End

 

WClientParseRdrCrInFTyp

Возникает при каждом создании BamlRecordReader нового экземпляра объекта из Type. Поле ‘type’ (тип) доступно только для события типа ‘end’.

Идентификатор GUID 0da15d58-c3a7-40de-9113-72db0c4a9351
Тип [строковый тип] Имя создаваемого типа.
Типы событий Start, End

 

Прочие события

WClientAppCtor

Возникает при построении класса Application.

См. описание WClientAppRun.

Идентификатор GUID f9f048c6-2011-4d0a-812a-23a4a4d801f5
Типы событий Info

 

WClientAppRun

Возникает при вызове метода Application.Run.

Так как данное событие возникает в рамках метода Application.Run, все предшествующие события могут быть отнесены к времени запуска приложения.

Идентификатор GUID 08a719d6-ea79-4abc-9799-38eded602133
Типы событий Info

 

*WClientTimeManagerTick

Возникает при каждом такте TimeManager. Поле ‘ticktime’ (время такта) доступно только для события типа ‘start’.

Идентификатор GUID ea3b4b66-b25f-4e5d-8bd4-ec62bb44583e
TickTime [Int64] Абсолютное время, относительно которого происходит отсчет, в миллисекундах.
Типы событий Start, End

 

WClientString

Возникает для пользовательских событий ‘string’. Среди мест, где в WPF возникают пользовательские события: методы ContentPresenter.BuildVisualTree, DrawingContext.DrawText, ItemsContainerGenerator.SetStatus, ScrollContentPresenter.Measure/ArrangeOverride, ScrollViewer.MeasureOverride, Stack.Measure/ArrangeOverride, TextFormatterImpl.FormatLineInternal и VirtualizingStackPanel.Measure/ArrangeOverride.

Идентификатор GUID 6b3c0258-9ddb-4579-8660-41c3ada25c34
Информация [строковый тип] Пользовательская строка для события.
Типы событий Start, End, Info

 

WClientFontCache

Возникает при перегрузке кэша шрифтов.

Идентификатор GUID f3362106-b861-4980-9aac-b1ef0bab75aa
Типы событий Info