Панель сведений о модуле отображается в нижней части окна Profiler, которое помогает оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Дополнительная информация
Просмотр в окне Словарь при выборе модуля. Вы можете настроить этот раздел, чтобы отобразить дополнительные сведения, относящиеся к вашему модулю, или отобразить настраиваемую визуализацию ваших данных о производительности.
Чтобы создать настраиваемую панель сведений о модуле для модуля Profiler:
- Создайте сценарий контроллера панели сведений о модуле, чтобы нарисовать панель сведений о пользовательском модуле.
- Создайте сценарий модуля профилировщика, чтобы подключить контроллер панели сведений вашего пользовательского модуля к вашему модулю пользовательского профилировщика .
Создание скрипта для управления панелью сведений о модуле
Вы можете использовать базовый класс ProfilerModuleViewController настроить панель сведений о модуле в окне профилировщика. Для этого создайте сценарий, управляющий тем, что отображается на панели сведений о модуле при выборе определенного модуля.
Сценарий, который вы создаете для настройки панели сведений о модуле, должен:
- Определите общедоступный конструктор для контроллера представления, который вызывает базовый конструктор
base(profilerWindow)
. - Переопределите
CreateView
, чтобы создать панель сведений о пользовательском модуле.
Например:
public class CustomDetailsViewController : ProfilerModuleViewController
{
public CustomDetailsViewController(ProfilerWindow profilerWindow) : base(profilerWindow) { }
protected override VisualElement CreateView()
{
// Create your UI.
}
}
Пример сценария полного контроллера панели сведений о модуле см. в примере сценария контроллера панели сведений о модуле.
Пример сценария контроллера панели сведений о модуле
Приведенный ниже пример скрипта создает контроллер панели сведений о модуле, который рисует одну метку на панели сведений о модуле, отображающую текст:
Этот пример скрипта контроллера панели сведений о модуле делает следующее:
- Определяет и создает метку для отображения значения, которое вы хотите зафиксировать, и добавляет эту метку на панель сведений о модуле.
- Определяет конструктор для управления панелью сведений о модуле и использует CreateView для создания пользовательской панели сведений о модуле.
- Заполняет метку данными из текущего кадра и обновляет метку после каждого кадра.
- Выбирает значение счетчика в виде строки, которую можно отобразить на панели сведений о модуле.
- Указывает текст, который будет отображаться на панели сведений о модуле, и указывает профилировщику автоматически обновлять его в каждом кадре.
using UnityEditor;
using UnityEditorInternal;
using Unity.Profiling.Editor;
using UnityEngine.UIElements;
public class TankEffectsDetailsViewController : ProfilerModuleViewController
{
// Define a label, which will display the total particle count for tank trails in the selected frame.
Label m_TankTrailParticleCountLabel;
// Define a constructor for the view controller, which calls the base constructor with the Profiler Window passed from the module.
public TankEffectsDetailsViewController(ProfilerWindow profilerWindow) : base(profilerWindow) { }
// Override CreateView to build the custom module details panel.6666666667reateView()
{
var view = new VisualElement();
// Create the label and add it to the view.
m_TankTrailParticleCountLabel = new Label() { style = { paddingTop = 8, paddingLeft = 8 } };
view.Add(m_TankTrailParticleCountLabel);
// Populate the label with the current data for the selected frame.
ReloadData();
// Be notified when the selected frame index in the Profiler Window changes, so we can update the label.
ProfilerWindow.SelectedFrameIndexChanged += OnSelectedFrameIndexChanged;
return view;
}
// Override Dispose to do any cleanup of the view when it is destroyed. This is a standard C# Dispose pattern.
protected override void Dispose(bool disposing)
{
if (!disposing)
return;
// Unsubscribe from the Profiler window event that we previously subscribed to.
ProfilerWindow.SelectedFrameIndexChanged -= OnSelectedFrameIndexChanged;
base.Dispose(disposing);
}
void ReloadData()
{
// Retrieve the TankTrailParticleCount counter value from the Profiler as a formatted string.
var selectedFrameIndexInt32 = System.Convert.ToInt32(ProfilerWindow.selectedFrameIndex);
var value = ProfilerDriver.GetFormattedCounterValue(selectedFrameIndexInt32, GameStatistics.TanksCategory.Name, GameStatistics.TankTrailParticleCountName);
// Update the label's text with the value.
m_TankTrailParticleCountLabel.text = $"The value of '{GameStatistics.TankTrailParticleCountName}' in the selected frame is {value}.";
}
void OnSelectedFrameIndexChanged(long selectedFrameIndex)
{
// Update the label with the current data for the newly selected frame.
ReloadData();
}
}
Создание пользовательских элементов пользовательского интерфейса на панели сведений о модуле
Вы можете использовать UIToolkit Unity для создания пользовательского UI(пользовательский интерфейс). Позволяет пользователю взаимодействовать с вашим приложением. В настоящее время Unity поддерживает три системы пользовательского интерфейса. Подробнее
См. в Словарь панель сведений о модуле. Дополнительную информацию см. в разделе Инструментарий пользовательского интерфейса.
На следующем примере изображения показана панель сведений о пользовательском модуле, принадлежащая пользовательской Адаптивная производительность:
Подключить панель сведений пользовательского модуля к модулю Profiler
Чтобы отобразить панель сведений о пользовательском модуле, необходимо создать экземпляр контроллера панели сведений о модуле при выборе модуля Profiler. Для этого переопределите CreateDetailsViewController
, чтобы создать и нарисовать новый контроллер панели сведений о модуле. Затем Unity вызывает этот метод, когда отображает панель сведений о вашем модуле.
В следующем примере кода создается панель сведений о пользовательском модуле для модуля с именем TankEffectsProfilerModule
:
using Unity.Profiling.Editor;
[System.Serializable]
[ProfilerModuleMetadata("Tank Effects")]
public class TankEffectsProfilerModule : ProfilerModule
{
static readonly ProfilerCounterDescriptor[] k_Counters = new ProfilerCounterDescriptor[]
{
new ProfilerCounterDescriptor(GameStatistics.TankTrailParticleCountName, GameStatistics.TanksCategory),
new ProfilerCounterDescriptor(GameStatistics.ShellExplosionParticleCountName, GameStatistics.TanksCategory),
new ProfilerCounterDescriptor(GameStatistics.TankExplosionParticleCountName, GameStatistics.TanksCategory),
};
public TankEffectsProfilerModule() : base(k_Counters) { }
public override ProfilerModuleViewController CreateDetailsViewController()
{
return new TankEffectsDetailsViewController(ProfilerWindow);
}
}
Визуализация дополнительных счетчиков на панели сведений о модуле
Вы можете отображать счетчики на панели сведений о модуле, которые не включены в представление диаграммы вашего модуля. Это полезно, когда вы хотите показать дополнительные данные для выбранного кадра.
Профилировщик автоматически фиксирует категории всех счетчиков, принадлежащих представлению диаграммы модуля, когда этот модуль активен. Чтобы зафиксировать дополнительные счетчики, напишите сценарий, сообщающий профилировщику о необходимости захвата определенных категорий, когда ваш модуль активен.
Например, приведенный ниже скрипт использует аргумент конструктора autoEnabledCategoryNames
для указания скриптовКусок кода, который позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на действия пользователя любым способом. Подробнее
См. в категориях Словарь и Память. Это включает эти категории, когда модуль активен:
using Unity.Profiling;
using Unity.Profiling.Editor;
[System.Serializable]
[ProfilerModuleMetadata("Tank Effects")]
public class TankEffectsProfilerModule : ProfilerModule
{
static readonly ProfilerCounterDescriptor[] k_Counters = new ProfilerCounterDescriptor[]
{
new ProfilerCounterDescriptor(GameStatistics.TankTrailParticleCountName, ProfilerCategory.Scripts),
new ProfilerCounterDescriptor(GameStatistics.ShellExplosionParticleCountName, ProfilerCategory.Scripts),
new ProfilerCounterDescriptor(GameStatistics.TankExplosionParticleCountName, ProfilerCategory.Scripts),
};
// Enable the ProfilerCategory.Scripts and ProfilerCategory.Memory categories when the module is active.
static readonly string[] k_AutoEnabledCategoryNames = new string[]
{
ProfilerCategory.Scripts.Name,
ProfilerCategory.Memory.Name
};
// Pass the auto-enabled category names to the base constructor.
public TankEffectsProfilerModule() : base(k_Counters, autoEnabledCategoryNames: k_AutoEnabledCategoryNames) { }