Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Низкоуровневый нативный модуль Profiler API

Профилировщик Unity – это инструмент, который можно использовать для анализа и повышения производительности вашего заявление. Profilerокно, помогающее оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
См. в Словарь
выполняет анализ времени кадра вызовов функций в собственном коде Unity и управляемом коде в вашем приложении. Вы можете использовать ProfilerMarker API, чтобы вставить временные маркеры в собственный код, чтобы получить лучшее понимание производительности конкретных областей вашего приложения.

Вы можете использовать низкоуровневый собственный подключаемый модульБиблиотека собственного кода для конкретной платформы, созданная вне Unity для использования в Unity. Позволяет вам получить доступ к таким функциям, как вызовы ОС и сторонние библиотеки кода, которые в противном случае были бы недоступны для Unity. Подробнее
См. в Словарь
API профилировщика, чтобы расширить возможности Profiler и профилировать производительность собственного плагинаНабора кода, созданного вне Unity, который создает функциональные возможности в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
Посмотреть в Словарь
или подготовить профилирование данные для отправки в сторонние инструменты профилирования, такие как RazorНабор микросхем CPU/GPU, используемый в оборудовании PS4. Подробнее
См. в Словарь
(PS4), PIX (Xbox, Windows), Chrome Tracing , ETW, ITT, Vtune или телеметрия. Низкоуровневые встроенные API-интерфейсы Profiler предоставляют следующие интерфейсы для связи между Unity Profiler и внешними инструментами:

  • IUnityProfiler: используйте этот интерфейс для добавления событий инструментирования в Unity Profiler из собственного кода подключаемого модуля C/C++.
  • IUnityProfilerCallbacks. Используйте этот интерфейс для перехвата событий Unity Profiler и их сохранения или перенаправления другим инструментам.

API-интерфейс IUnityProfiler

Используйте API-интерфейс подключаемого модуля IUnityProfiler, чтобы добавить инструменты в код C/C++ собственных подключаемых модулей.

API подключаемого модуля представлен интерфейсом IUnityProfiler, объявленным в заголовке IUnityProfiler.h. Unity сохраняет заголовок в папке \Editor\Data\PluginAPI вашей установки Unity. (В macOS щелкните правой кнопкой мыши приложение Unity и выберите Показать содержимое пакета. Заголовок находится в Contents\PluginAPI).

Метод Описание
CreateMarker Создает маркер профилировщикаразмещается в коде для описания события CPU или GPU, которое затем отображается в окне Unity Profiler. Добавляется в код Unity по умолчанию, или вы можете использовать ProfilerMarker API для добавления собственных маркеров. Подробнее
См. в Словарь
, который представляет именованную область инструментирования, которую затем можно использовать для генерировать инструментальные образцы.
SetMarkerMetadataName Задает имена пользовательских параметров, которые можно передать вместе с образцом инструментария для маркера Profiler.
BeginSample Начинает инструментальный раздел кода, названный в честь маркера Profiler.
EndSample Заканчивает инструментальную часть.
EmitEvent Испускает общие события с метаданными.
IsEnabled Возвращает 1, если профайлер собирает данные.
IsAvailable Возвращает 1 для проигрывателей Editor или Development, где доступен Profiler, и 0 для проигрывателей Release.
RegisterThread Регистрирует текущий поток под указанным именем.
UnregisterThread Отменяет регистрацию текущего потока в Profiler.

Пример использования

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

#include #include static IUnityProfiler* s_UnityProfiler = NULL; static const UnityProfilerMarkerDesc* s_MyPluginMarker = NULL; static bool s_IsDevelopmentBuild = false; static void MyPluginWorkMethod() { if (s_IsDevelopmentBuild) s_UnityProfiler->BeginSample(s_MyPluginMarker); // Code I want to see in Unity Profiler as "MyPluginMethod". // ... if (s_IsDevelopmentBuild) s_UnityProfiler->EndSample(s_MyPluginMarker); } extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) { s_UnityProfiler = unityInterfaces->Get(); if (s_UnityProfiler == NULL) return; s_IsDevelopmentBuild = s_UnityProfiler->IsAvailable() != 0; s_UnityProfiler->CreateMarker(&s_MyPluginMarker, "MyPluginMethod", kUnityProfilerCategoryOther, kUnityProfilerMarkerFlagDefault, 0); } extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() { s_UnityProfiler = NULL; }

Обратные вызовы API IUnityProfilerCallbacks

Собственный API-интерфейс подключаемого модуля Profiler обеспечивает интерфейс между подсистемами Unity и сторонними API-интерфейсами профилирования, поэтому вы можете использовать внешний инструмент профилирования для профилирования своего приложения Unity. Заголовок IUnityProfilerCallbacks предоставляет API, который Unity хранит в папке \Editor\Data\PluginAPI вашей установки Unity. (В macOS щелкните правой кнопкой мыши приложение Unity и выберите Показать содержимое пакета. Заголовок находится в Contents\PluginAPI).

Следующие функции Unity Profiler помогают собирать инструментальные данные, чтобы вы могли анализировать производительность своего приложения.

Функция профилировщика Описание
Categories Unity группирует данные профиля по категориям (таким как рендеринг, сценарии и анимация) и назначает цвет для каждой категории. Категории с цветовой кодировкой помогают визуально различать типы данных в окне Profiler. Собственный API подключаемого модуля Profiler извлекает эти цвета, чтобы вы могли использовать их во внешнем инструменте профилирования.
Usage flags Флаги использования действуют как фильтр, уменьшающий объем данных, отправляемых Unity внешнему инструменту профилирования. Вы можете использовать флаги использования, чтобы удалить ненужную информацию из данных профилирования, прежде чем Unity отправит ее внешнему инструменту. Профилировщик применяет следующие флаги использования к маркерам событий, чтобы вы могли фильтровать данные:

Флажки доступности, указывающие на то, доступен ли маркер в редакторе Unity, проигрывателе разработки или проигрывателе выпуска.

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

Frame events Вы можете использовать собственный API-интерфейс подключаемого модуля Profiler для выполнения анализа времени кадра во внешнем инструменте профилирования..
Thread profiling Unity выполняет значительный объем работы с потоками (например, основной поток, поток рендеринга и рабочий поток системы заданий). Вы можете использовать собственный API подключаемого модуля Profiler, чтобы включить профилирование в любом потоке.

Чтобы использовать инструментальные данные, которые Unity Profiler генерирует во внешнем профилировщике, вы можете использовать этот минимальный набор обратных вызовов в коде подключаемого модуля C/C++, который интегрирует сторонний профилировщик:

Callback Функция
RegisterCreateCategoryCallback Регистрирует обратный вызов IUnityProfilerCreateCategoryCallback для получения категории ProfilerОпределяет данные о рабочей нагрузке для Подсистема Unity (например, категории Rendering, Scripting и Animation). Unity применяет цветовое кодирование к категориям, чтобы визуально различать типы данных в окне Profiler.
Просматривать название и цвет Словарь
всякий раз, когда Unity создает категорию.
RegisterCreateMarkerCallback Регистрирует обратный вызов IUnityProfilerCreateMarkerCallback, который вызывается всякий раз, когда Unity создает маркер. Используйте его, чтобы получить имя, категорию Profiler и флаги использования маркера. Параметр const UnityProfilerMarkerDesc* markerDesc функции обратного вызова представляет собой постоянный указатель на описание маркера, который можно использовать для фильтрации маркеров в RegisterMarkerEventCallback.
RegisterMarkerEventCallback Регистрирует обратный вызов IUnityProfilerMarkerEventCallback, который Unity вызывает, когда происходят единичные события, события с областью действия, выделение памяти или сборка мусора. Затем вы можете использовать этот обратный вызов для вызова соответствующих функций во внешнем инструменте профилирования. Примечание. Unity представляет события выделения памяти с помощью маркера GC.Alloc, а события сборки мусора — с помощью маркеров GC.Collect.
RegisterFrameCallback Инкапсулирует выборки в логические фреймы, чтобы внешние инструменты профилирования, не использующие фреймы, могли использовать эти выборки. Также регистрирует обратный вызов, который запускает Unity Profiler, когда Unity запускает следующий логический кадр ЦП.
RegisterCreateThreadCallback Регистрирует обратный вызов для получения имени внутреннего потока всякий раз, когда Unity регистрирует поток для профилирования.

Пример использования

В этом примере показано, как передавать события профилировщика Unity другому профилировщику с семантикой push/pop. Он выполняет две функции:

  • void MyProfilerPushMarker(const char* name) - pushes a named marker.
  • void MyProfilerPopMarker() - pops instrumentation marker.

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

#include #include static IUnityProfilerCallbacks* s_UnityProfilerCallbacks = NULL; static void UNITY_INTERFACE_API MyProfilerEventCallback(const UnityProfilerMarkerDesc* markerDesc, UnityProfilerMarkerEventType eventType, unsigned short eventDataCount, const UnityProfilerMarkerData* eventData, void* userData) { switch (eventType) { case kUnityProfilerMarkerEventTypeBegin: { MyProfilerPushMarker(markerDesc->name); break; } case kUnityProfilerMarkerEventTypeEnd: { MyProfilerPopMarker(); break; } } } static void UNITY_INTERFACE_API MyProfilerCreateMarkerCallback(const UnityProfilerMarkerDesc* markerDesc, void* userData) { s_UnityProfilerCallbacks->RegisterMarkerEventCallback(markerDesc, MyProfilerEventCallback, NULL); } extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) { s_UnityProfilerCallbacks = unityInterfaces->Get(); s_UnityProfilerCallbacks->RegisterCreateMarkerCallback(&MyProfilerCreateMarkerCallback, NULL); } extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() { s_UnityProfilerCallbacks->UnregisterCreateMarkerCallback(&MyProfilerCreateMarkerCallback, NULL); s_UnityProfilerCallbacks->UnregisterMarkerEventCallback(NULL, &MyProfilerEventCallback, NULL); }

Примечание. Чтобы отменить регистрацию данного обратного вызова для всех маркеров, запустите UnregisterEventCallback, установив для первого параметра значение null. .

Пример плагина UnitySystrace

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

| static void UNITY_INTERFACE_API SystraceFrameCallback(void* userData) { bool isCapturing = ATrace_isEnabled(); if (isCapturing != s_isCapturing) { s_isCapturing = isCapturing; if (isCapturing) { s_UnityProfilerCallbacks-> RegisterCreateMarkerCallback(SystraceCreateEventCallback, NULL); } else { s_UnityProfilerCallbacks-> UnregisterCreateMarkerCallback(SystraceCreateEventCallback, NULL); s_UnityProfilerCallbacks-> UnregisterMarkerEventCallback(NULL, SystraceEventCallback, NULL); } } }

Примечание. Чтобы отменить регистрацию данного обратного вызова для всех маркеров, запустите UnregisterEventCallback, установив для первого параметра значение null. .

Специальные маркеры

В Unity есть следующие специальные маркеры, содержащие полезные метаданные:

  • Profiler.DefaultMarker
  • GC.Alloc

Profiler.DefaultMarker

Profiler.DefaultMarker – это маркер, который Unity резервирует для Profiler.BeginSample и Profiler.EndSample .

В приведенном выше примере kUnityProfilerMarkerEventTypeBegin eventType соответствует событию Profiler.BeginSample и содержит следующие данные:

  • Int32: идентификатор экземпляра UnityEngine.Object. Это 0, если объект не указан.
  • Массив UInt16: строка UTF16, которая передается в Profiler.BeginSample. Размер указан в байтах.
  • UInt32: указатель категории.

GC.Alloc

GC.Alloc — это маркер, соответствующий выделению памяти для сборки мусора. Он имеет следующие данные:

  • Int64: размер выделения.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3