Instruments: CPU-профиль и метки движка
Выбор процесса, повторяемая запись, call tree и границы измерения.
Instruments нужен для измерения поведения процесса на macOS. Начните с Time Profiler, если требуется найти нагрузку CPU. Он периодически снимает стеки: результат — распределение samples, а не точное время каждого вызова или измерение GPU. Метод чтения call tree описан в документации Apple.
Выберите процесс и сборку
Профилируйте редактор, если медленно работает редактор; игру — если тормозит игра. Встроенный запуск, отдельное окно игры и редактор могут давать разные процессы: запишите путь executable и PID. Для сравнения сохраните одинаковые проект, камеру, renderer, разрешение, VSync/FPS limit, входные данные и конфигурацию.
Нативная сборка с оптимизацией и символами, из Source рядом с SConstruct:
scons platform=macos target=editor arch=arm64 dev_build=no optimize=speed_trace debug_symbols=yes -j4На Intel замените архитектуру на x86_64. Пример без C#; для C# нужны отдельные стадии сборки macOS. Не используйте медленную debug-конфигурацию как оценку производительности релиза. При этом оптимизация может объединять/встраивать функции, поэтому samples нельзя читать как полный список всех вызовов.
debug_symbols=yes сохраняет информацию для символизации. Для отдельных символов добавьте separate_debug_symbols=yes и сохраните полученный .dSYM вместе с соответствующим бинарником. Если видны адреса вместо функций, проверьте symbols, UUID и архитектуру; другой .dSYM с тем же номером версии 1.0.0 не подходит.
Запишите полезный участок
- Откройте Instruments из Xcode и выберите шаблон Time Profiler. Названия и расположение элементов зависят от версии Xcode.
- Выберите фактический executable или подключитесь к нужному PID. Для запуска редактора передайте
--editor --path /absolute/project, для игры —--path /absolute/project. Путь указывает на папку сproject.reckfell. - Сначала дождитесь импорта, загрузки и прогрева шейдеров, если измеряете устойчивый игровой процесс. Если проблема именно в старте, запишите его отдельно с явно указанным состоянием cache.
- Запишите короткое повторяемое действие: например, один проход камеры по одному маршруту. Отметьте начало и конец, остановите запись и выделите соответствующий диапазон timeline.
- Изучите нужные потоки и call tree; сохраните
.trace, конфигурацию сборки, входные данные и описание действия. После изменения повторите тот же сценарий.
Как читать результат
| Наблюдение | Следующий шаг |
|---|---|
| Высокий общий вес функции | Посмотрите дочерние вызовы: inclusive weight включает их. Не приписывайте всё время телу родителя. |
| Высокий self weight | Исследуйте собственную работу функции в выбранном диапазоне. |
| Весь профиль занимает ожидание/VSync | Сверьте FPS limit, потоки, CPU и GPU отдельно. Стек ожидания не доказывает, что эта функция выполняет тяжёлую работу. |
| Короткий spike исчез в общей статистике | Выделите его на timeline; не усредняйте вместе с долгим простоем. |
| После Hide System Libraries исчезла причина | Верните библиотеки и проверьте стек целиком; фильтр скрывает строки, а не устраняет работу. |
CPU-профиль не доказывает отсутствие GPU bottleneck, allocations, утечек или задержек I/O. Для них нужны соответствующие инструменты и отдельные измерения. Число samples не является точным счётчиком вызовов, а отсутствие функции в короткой записи не означает, что она не выполнялась.
Метки движка
Обычный Time Profiler не требует profiler=instruments. Этот build-флаг включает нативные signposts Reckfell для размеченных участков; это дополнение к sampling, а не автоматическая трассировка всех методов C#:
scons platform=macos target=editor arch=arm64 dev_build=no optimize=speed_trace debug_symbols=yes profiler=instruments -j4Текущий backend публикует событие Frame и интервалы ReckfellProfileZone; script-zone и memory-макросы в нём пустые. Для просмотра меток добавьте подходящий instrument signposts/Points of Interest в вашей версии Instruments. Отсутствие меток сначала проверяйте по выбранной сборке, процессу, диапазону и настройкам записи. Не включайте profiler-флаги памяти или on-demand в ожидании, что они заменят настройку Instruments: build-скрипт сообщает, что эти параметры для backend игнорируются. Профилирование call stacks и памяти настраивайте в Instruments; не делайте вывод о фактическом capture только по наличию build-флага.
Проверены build-параметры и реализация backend. macOS, Instruments, .trace, нативная символизация и измерения CPU/GPU в этой проверке не запускались; численных обещаний производительности здесь нет.