Добавление маркеров профилирования в код
Добавить маркеры профилеров к вашему коду, чтобы просмотреть образцы, которые ProfilerMarker.Begin, ProfilerMarker.End, или ProfilerMarker.Auto генерирует в Timeline Вид и Hierarchy Вид 1998 года CPU Модуль использования в 2000 году Profiler окно:
Предварительные условия
В некоторых примерах используется пакет Profiling Core, который необходимо установить перед началом работы. Пакет Profiling Core Unity не обнаруживается в Package Manager UI, поскольку это пакет core. Чтобы установить пакет, добавляет его по имени, которое является com.unity.profiling.core.
Разметка кода
Чтобы использовать ProfilerMarker API, поместите код, который вы хотите профилировать, между вызовами ProfilerMarker.Begin и ProfilerMarker.End. Например:
using UnityEngine;
using Unity.Profiling;
public class ProfilerMarkerExample
{
static readonly ProfilerMarker k_MyCodeMarker = new ProfilerMarker("My Code");
void Update() {
k_MyCodeMarker.Begin();
Debug.Log("This code is being profiled");
k_MyCodeMarker.End();
}
}
Примечание: Не используйте символ / в названии маркера профилера, так как это делает окно Profiler неспособным выделить маркер в виде графиков модуля CPU Profiler.
Убедитесь, что код между вызовами Begin и End не выходит из области до вызова End. Если код выходит из области до вызова End, в журнал Консоли заносится сообщение об ошибке. Чтобы избежать необходимости вызова End перед каждым возвращением, используйте Auto, чтобы образец автоматически заканчивался при выходе из области. Дополнительные сведения см. в разделе этой документации Автоматическое закрытие блоков кода маркера профилера.
Unity записывает и сообщает время выполнения профилируемого блока кода в Profiler, и отображает его в модуле CPU Profiler без необходимости использования Deep Profiling. Он отображает его как новую запись в Hierarchy View модуля CPU Profiler, следующим образом:
Автоматическое закрытие кодовых блоков маркеров профилирования
Используйте ProfilerMarker.Auto, чтобы гарантировать автоматический вызов ProfilerMarker.End в конце блока кода. Следующие вызовы эквивалентны:
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_UpdatePerfMarker = new ProfilerMarker("MySystem.Update");
public void Update()
{
k_UpdatePerfMarker.Begin();
// ...
k_UpdatePerfMarker.End();
using (k_UpdatePerfMarker.Auto())
{
// ...
}
}
}
В отличие от вызовов Begin() и End(), Unity не может компилировать вызов ProfilerMarker.Auto в сборках, не относящихся к разработке (Release). Однако вместо этого он возвращает null, что добавляет лишь минимальную нагрузку.
Вы также можете использовать ProfilerMarker.Auto с using var, и вызов End происходит автоматически после окончания текущей области. Этот подход минимизирует количество кода, который нужно изменить при добавлении экземпляра ProfilerMarker в код:
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_UpdatePerfMarker = new ProfilerMarker("MySystem.Update");
public void Update()
{
using var _ = k_UpdatePerfMarker.Auto();
// ...
}
}
Примечание: Любые асинхронные вызовы await и любые yield в пределах области, помеченной ProfilerMarker, не поддерживаются и регистрируют сообщение об ошибке в Консоли, даже если вы используете Auto.
Добавление параметров целочисленных или с плавающей точкой к образцам
В некоторых случаях в образцы кода может потребоваться добавить контекст для определения конкретных условий, в которых код выполняется в течение длительного времени.
Например, если ваша система выполняет симуляции объектов, вы можете передать количество объектов с выборкой Profiler. Если Profiler возвращает ненормальное число вместе с длительной продолжительностью выборки, это может означать, что вам придется использовать другой поток для симуляции, разделить работу CPU на несколько кадров (timeslicing) или настроить дизайн приложения, чтобы предотвратить падение кадров.
ProfilerMarker поддерживает до трех числовых параметров: ProfilerMarker<TP1>, ProfilerMarker<TP1, TP2> и ProfilerMarker<TP1, TP2, TP3>:
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker<int> k_PreparePerfMarker = new ProfilerMarker<int>("MySystem.Prepare", "Objects Count");
static readonly ProfilerMarker<float> k_SimulatePerfMarker = new ProfilerMarker<float>(ProfilerCategory.Scripts, "MySystem.Simulate", "Objects Density");
public void Update(int objectsCount)
{
k_PreparePerfMarker.Begin(objectsCount);
// ...
k_PreparePerfMarker.End();
using (k_SimulatePerfMarker.Auto(objectsCount * 1.0f))
{
// ...
}
}
}
Добавление строковых параметров к образцам
Методы ProfilerMarker и API поддерживают добавление строковых параметров к маркерам профилирования. Параметр строки может быть полезен, если вы хотите отобразить имя уровня или файла, когда приложение загружает файлы уровня или данных. Используйте методы ,ProfilerMarkerExtensionи для передачи строкового параметра вместе с примером Profiler:
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_PreparePerfMarker = new ProfilerMarker("MySystem.Prepare");
public void Prepare(string path)
{
k_PreparePerfMarker.Begin(path);
// ...
k_PreparePerfMarker.End();
}
}