This page has been translated automatically.
Видеоуроки
Интерфейс
Основы
Продвинутый уровень
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Профессиональный уровень (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Режимы вывода изображения
Физика
Браузер SDK 2
Лицензирование и типы лицензий
Дополнения (Add-Ons)
Демонстрационные проекты
API Samples
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Контроль версий
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Player-ноды
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
Унифицированный язык шейдеров UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Материалы и шейдеры
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Учебные материалы

Инструмент Microprofile

UNIGINE поддерживает Microprofile, расширенный внешний встраиваемый профилировщик CPU / GPU с поддержкой покадровой проверки.

Инструмент Microprofile

Профилировщик предоставляет следующие возможности:

  • Операции профилирования, выполняемые движком на CPU и GPU
  • Профилирование потоков движка
  • Профилирование до 1000 кадров
  • Вывод данных о производительности на локальный веб-сервер или в файл HTML

Запуск Microprofile#

Инструмент Microprofile доступен только для Development сборок движка: он не будет компилироваться для сборок Debug и Release. Вы можете использовать консольную команду microprofile_info, чтобы проверить, скомпилирован ли Microprofile.

Данные о производительности, полученные Microprofile могут выводиться на локальный веб-сервер или в файл HTML.

Примечание
Microprofile показывает действительную информацию только после рендеринга первых 1000 кадров (например, при частоте кадров 60 кадров в секунду такое время "разогрева" составляет около 16 секунд).

Включение и отключение Microprofile#

Microprofile отнимает много времени, поэтому мы рекомендуем вам включать его только при работе с ним и оставлять отключенным в противном случае.

Один из способов отключить Microprofile — снять флажок с соответствующей опции перед запуском UnigineEditor или приложения:

Disabling Microprofile via SDK Browser

Другой способ — использовать консольную команду microprofile_enabled.

Примечание
Если вы измените статус Microprofile через консоль, эта настройка будет сохранена в файле <Project_Name>/data/configs/default.user. Состояние, заданное в файле конфигурации пользователя, переопределит состояние, определенное через SDK Browser.

Сохранение данных о производительности в файл#

Microprofile позволяет сохранять данные о производительности в HTML-файл и затем анализировать их в автономном режиме.

Чтобы вывести данные о производительности в HTML-файл, выполните следующие действия:

  1. В консоли задайте количество кадров для профилирования с помощью консольной команды microprofile_dump_frames. Вы можете пропустить этот шаг: по умолчанию будет профилировано 500 кадров.
  2. Выполните консольную команду microprofile_dump_html.

Данные о производительности будут сохранены в указанном HTML-файле.

Примечание
Если путь не указан, дамп будет сохранен в папке data/microprofile_dump_html.

Использование дампов профилирования упрощает перехват "скачков" производительности: движок продолжает рендерить приложение в фоновом режиме, даже когда оно не в фокусе, поэтому кадр, на котором произошел скачок, может быть перезаписан в случае использования веб-сервера для визуализации данных производительности. Также его можно использовать для оценки результатов оптимизации: вы можете сделать дамп кадров до и после оптимизации и сравнить их.

Визуализация с использованием встроенного сервера#

Чтобы визуализировать данные о производительности с помощью локального веб-сервера, выполните следующие действия:

  1. В консоли установите количество кадров для профилирования с помощью консольной команды microprofile_webserver_frames . Вы можете пропустить этот шаг: по умолчанию будет профилировано 200 кадров.
  2. В меню UnigineEditor выберите Tools -> Microprofile.

Данные о производительности будут отображаться в вашем веб-браузере.

Примечание
  • Вы можете отобразить только часть профилированных кадров: для этого в адресной строке веб-браузера добавьте /<number_of_frames> к текущему URL-адресу.
  • Не забудьте обновить (F5) страницу в веб-браузере во время сбора данных профилирования, так как это не выполняется автоматически.

Например, если вы укажете localhost:1337/100, будут отображаться только первые 100 кадров.

Примечание
Все доступные консольные команды можно найти в разделе Performance Profiling статьи о Консоли .

Данные о производительности#

Microprofile визуализирует подробные данные о производительности для каждого кадра операций, выполняемых движком на CPU и GPU и в потоках движка. В главном меню Microprofile вы можете изменить режим визуализации: нажмите Mode и выберите нужный. По умолчанию установлен режим Detailed.

Группы профилирования, отображаемые в режиме Detailed

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

На рисунке ниже функция Engine::do_render() вызывает функции RenderRenderer::renderWorld() и так далее:

Чтобы просмотреть данные об определенной операции или потоке, наведите указатель мыши на соответствующую область. Чтобы увеличить / уменьшить отображаемые области, прокрутите колесико мыши.

Данные CPU#

В группе данных производительности Main отображается стек вызовов операций (например, update, rendering и т. д.), выполняемых движком на ЦП.

Данные о производительности функции World Update

Данные GPU#

В группе данных о производительности GPU отображается стек вызовов операций, выполняемых движком на GPU. В дополнение к основным данным о производительности для каждой функции (например, рендеринга среды, рендеринга пост-материалов и т.д.) отображается количество вызовов DIP и визуализированных треугольников. Также может отображаться количество поверхностей, источников света, теней, отрендеренных этой функцией, количество используемых материалов и шейдеров; информация об узле или материале, для которого вызывается функция (идентификатор, имя и т.д.).

Данные о производительности отложенного рендеринга освещения

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

команды Vulkan или DirectX можно объединить в группы отладки графического процессора, которые создаются автоматически при определении области профилирования. Все графические ресурсы, загружаемые из внешних файлов, такие как текстуры, шейдеры, статические меши или меши со костной анимацией, а также внутренние ресурсы движка имеют свои собственные имена отладки для упрощения идентификации. Эта информация может быть полезна при использовании отладчиков Graphics API, таких как NVIDIA Nsight или RenderDoc.

Пример данных отладки, просматриваемых в RenderDoc

Данные о потоках движка#

Данные о производительности потоков движка визуализируются в группах CPUThread, SoundThread, AsyncQueueThread, WorldSpawnMeshClutterThread, WorldSpawnGrassThread.

Данные о производительности в потоках симуляции физики

Использование Microprofile для логики Приложения#

Вы можете использовать Microprofile для проверки производительности логики вашего приложения.

  1. Откройте исходный код вашего приложения.
  2. Include the UnigineProfiler.h file to get access to methods of the Profiler class.

    AppWorldLogic.h
    #include <UnigineProfiler.h>
    
    using namespace Unigine;
  3. Найдите функцию или область видимости в коде, который вы хотите проверить.
  4. В начале функции (или области видимости) вызовите Profiler::begin(). Укажите имя для захвата, которое будет отображаться в Microprofile.

    Примечание
    Вы можете указать макрос __FUNCTION__, чтобы автоматически использовать класс и имя функции в качестве захвата.
  5. В конце функции (область действия) вызовите Profiler::end().

    AppWorldLogic.cpp
    int AppWorldLogic::update()
    {
    
    	// start profiling
    	Profiler::begin("AppWorldLogic::update");
    
    	float time = Game::getTime();
    	float angle_0 = time * 1.0f;
    	float angle_1 = time * 1.5f;
    	float angle_2 = time * 2.0f;
    
    	light_0->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_0), cosf(angle_0), 1.0f) * 20.0f));
    
    	light_1->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_1), cosf(angle_1), 1.0f) * 20.0f));
    
    	light_2->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_2), cosf(angle_2), 1.0f) * 20.0f));
    
    	// stop profiling
    	Profiler::end();
    
    	return 1;
    }
  6. Запустите проект.
  7. Откройте консоль и запустите команду microprofile_enabled 1.
  8. Перейдите в Microprofile и найдите регион с указанным названием.

Функции begin() и end() делают область профилирования доступной как для профилировщика, так и для Microprofile.

Если вы хотите использовать только Microprofile, создайте счетчик с помощью функций beginMicro() и endMicro().

Примечание
beginMicro() возвращает идентификатор, который должен быть передан в endMicro(). Таким образом, может быть создано несколько вложенных счетчиков.
AppWorldLogic.cpp
int AppWorldLogic::update()
{

	// start profiling
	int id = Profiler::beginMicro("AppWorldLogic::update");

	float time = Game::getTime();
	float angle_0 = time * 1.0f;
	float angle_1 = time * 1.5f;
	float angle_2 = time * 2.0f;

	light_0->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_0), cosf(angle_0), 1.0f) * 20.0f));

	light_1->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_1), cosf(angle_1), 1.0f) * 20.0f));

	light_2->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_2), cosf(angle_2), 1.0f) * 20.0f));

	// stop profiling
	Profiler::endMicro(id);

	return 1;
}

Создание вложенных счетчиков для профилирования#

Чтобы создать несколько вложенных счетчиков, вы должны использовать функции beginMicro() и endMicro(). beginMicro() возвращает идентификатор, который должен быть передан в endMicro(). Это позволяет создавать вложенные и пересекающиеся счетчики профилировщика.

В следующем примере используется комбинация begin()/end() и beginMicro()/endMicro(). Таким образом, профилирование функции AppWorldLogic::update() будет доступно как в профилировщике, так и в Microprofile.

AppWorldLogic.cpp
int AppWorldLogic::update()
{

	// start profiling
	Profiler::begin("AppWorldLogic::update");

	float time = Game::getTime();
	float angle_0 = time * 1.0f;
	float angle_1 = time * 1.5f;
	float angle_2 = time * 2.0f;

	// start profiling of the first light source (available in the Microprofile only)
	int id_0 = Profiler::beginMicro("1st Light Update");

	light_0->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_0), cosf(angle_0), 1.0f) * 20.0f));

	// stop profiling of the first light source
	Profiler::endMicro(id_0);

	// start profiling of the second light source (available in the Microprofile only)
	int id_1 = Profiler::beginMicro("2nd Light Update");

	light_1->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_1), cosf(angle_1), 1.0f) * 20.0f));

	// stop profiling of the second light source
	Profiler::endMicro(id_1);

	light_2->setWorldTransform(translate(Unigine::Math::Vec3(sinf(angle_2), cosf(angle_2), 1.0f) * 20.0f));

	// stop profiling
	Profiler::end();

	return 1;
}

Примечание
Используйте только beginMicro()/endMicro(), если вам не нужен инструмент Profiler.

Логика профилирования с использованием макросов#

Существуют специальные макросы для обозначения фрагментов вашего кода, которые следует проверить. Их можно использовать вместо функций beginMicro() и endMicro():

  • UNIGINE_PROFILER_FUNCTION для проверки работоспособности функции.

    Using Macro Using Functions
    Исходный код (C++)
    void myFunction()
    {
    	UNIGINE_PROFILER_FUNCTION;
    	// your function code
    }
    Исходный код (C++)
    void myFunction()
    {
    	int id = Profiler::beginMicro(__FUNCTION__);
    	// your function code
    	Profiler::endMicro(id);
    }
  • UNIGINE_PROFILER_SCOPED для проверки только определенной части кода.

    Using Macro Using Functions
    Исходный код (C++)
    void myFunction()
    {
    	// your function code
    	{
    		UNIGINE_PROFILER_SCOPED("Scope name");
    		// your function code
    	}
    }
    Исходный код (C++)
    void myFunction()
    {
    	// your function code
    	{
    		int id = Profiler::beginMicro("Scope name");
    		// your function code
    		Profiler::endMicro(id);
    	}
    }

Видеоурок: Анализ производительности с помощью Microprofile#

Последнее обновление: 13.12.2024
Build: ()