Профилировщик 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 сохраняет заголовок в папке
вашей установки 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 хранит в папке
вашей установки 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: размер выделения.