Код Unity оснащен большим количеством окон Profiler, которые помогают оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Дополнительная информация
Просматривайте в Словарь маркеры, которые дают вам представление о том, что занимает время в вашей заявление. В следующих таблицах поясняется, что делают некоторые распространенные маркеры:
- Основные маркеры основного потока
- Маркеры обновления сценария
- Маркеры рендеринга и вертикальной синхронизации
- Маркеры внутренних сценариев
- Маркеры многопоточности
- Физические маркеры
- Предупреждения о производительности
Основные маркеры темы
Основные маркеры основного потока обеспечивают четкое разделение между временем, затраченным на ваше приложение, и временем, затраченным на действия редактора и профилировщика. ProfilerRecorder также может использовать эти маркеры для получения времени кадра в основном потоке.
Маркер | Функция |
---|---|
PlayerLoop | Содержит любые образцы, происходящие из основного цикла вашего приложения. Если вы нацеливаете редактор вместо режима воспроизведения, когда проигрыватель работает в редакторе в активном режиме воспроизведения, сэмплы PlayerLoop размещаются в EditorLoop. |
EditorLoop (Editor only marker) |
Содержит любые сэмплы, происходящие из основного цикла редактора. Это присутствует только тогда, когда вы профилируете игрока в редакторе. Когда вы выбираете режим воспроизведения с помощью профилировщика, образцы EditorLoop показывают количество времени, затраченное на рендеринг и запуск редактора, содержащего проигрыватель.
Профилировщик не записывает никаких дополнительных подробных данных под маркером EditorLoop. Это связано с тем, что образцы, которые генерирует код редактора, когда профилировщик профилирует режим воспроизведения, создают большие накладные расходы на профилирование. Unity классифицирует все образцы из маркера EditorLoop как Другие в диаграммах модуля CPU Profiler. В результате образцы EditorLoop обычно вносят наибольший вклад в эту категорию. Если вы хотите увидеть, что редактор делает в это время, а также получить более подробную информацию о том, что еще влияет на категорию Другие, измените профилировщик вместо этого укажите в редакторе. Переключение цели Профилировщика на Редактор изменяет то, что Профилировщик отображает на панели сведений модуля Профилировщик ЦП, а также разбивку по категориям на диаграммах модуля Профилировщик ЦП. Это связано с тем, что образцы, которые ранее были скрыты в образце EditorLoop, затем вносят свой вклад в соответствующие категории. |
Profiler.CollectEditorStats (Editor only marker) |
Содержит любые образцы, относящиеся к сбору статистики для различных активных модулей Profiler.
Выборки, вложенные в маркер Profiler.CollectGlobalStats, показывают, сколько дополнительных ресурсов берет на себя проигрыватель при сборе статистики определенного модуля. Все другие дочерние образцы отражают их эффект только в редакторе. Чтобы устранить накладные расходы, связанные с конкретным модулем, закройте диаграмму модуля или вызовите Profiler.SetAreaEnabled. Примечание. Модули Custom Profiler, использующие встроенные счетчики, включают область встроенного счетчика, даже если модуль, к которому он принадлежит, был отключен. Чтобы профилировщик не собирал эту статистику и не создавал служебных данных, убедитесь, что встроенный модуль профилировщика и ваш пользовательский модуль профилировщика отключены. |
Editor-only markers
Есть определенные маркеры, которые появляются только при профилировании в редакторе Unity. Эти маркеры не отображаются в действиях, связанных с игроком, и относятся только к действиям редактора. Маркеры только для редактора включают проверки безопасности, такие как GetComponentNullErrorWrapper, которые помогают идентифицировать использование нулевого компонента; CheckConsistency, который проверяет установку объекта; CheckAllowDestructionRecursive — проверка на уничтожение; и деятельность, связанная с сборными конструкциями.
По умолчанию в представлении Hierarchy модуля CPU Profiler стопки образцов с маркерами только для редактора свернуты и называются EditorOnly [SampleName]
. Хотя эти стеки сэмплов или их дочерние семплы могут вызвать управляемое выделение памяти, что может привести к срабатыванию сборки мусора, они не влияют на значение GC.Alloc родительского семпла, если они свернуты.
Чтобы изменить поведение по умолчанию, в правом верхнем углу панели сведений о модуле выберите контекстное меню и отключите параметр Свернуть образцы только для редактора. Когда вы сделаете это, вы сможете расширить выборку и внести ее значение GC.Alloc во вмещающий маркер.
Этот параметр не влияет на представление Временная шкала, и образцы и их дочерние элементы отображаются развернутыми. Обычно вы можете игнорировать образцы с этими маркерами, потому что они относятся к действиям только для редактора и не влияют на сокращение управляемых выделений. Однако они могут быть полезны для расследования, если у вас возникли серьезные проблемы с влиянием на производительность, которое они оказывают в режиме воспроизведения.
Маркеры обновления сценария
Если вы не используете систему заданий, большая часть кода вашего скрипта находится под следующими маркерами. Информацию о примерах системы заданий см. в разделе Многопоточные маркеры на этой странице.
Дополнительные сведения о цикле обновления Unity см. в документации по порядку выполнения функций обработки событий. Если вы вставили свои собственные обратные вызовы в цикл игрока через PlayerLoop.SetPlayerLoop, образцы обновлений вашего скрипта отображаются под соответствующим основным маркером PlayerLoopSystem, если они введены как подсистема, или на их собственные, если они введены непосредственно в основной цикл.
Маркет | Функция |
---|---|
BehaviourUpdate | Содержит все примеры методов MonoBehaviour.Update. |
CoroutinesDelayedCalls | Содержит все образцы сопрограмм после их первого выхода.. |
FixedBehaviourUpdate | Содержит все примеры методов MonoBehaviour.FixedUpdate. |
PreLateUpdate.ScriptRunBehaviourLateUpdate | Содержит все примеры методов Monobehaviour.LateUpdate. |
Update.ScriptRunBehaviourUpdate | Содержит все примеры MonoBehaviour.Update и сопрограмм. |
Маркеры рендеринга и вертикальной синхронизации
Эти маркеры содержат образцы, в которых ЦП тратит время на обработку данных для графического процессора или где он может ожидать завершения работы графического процессора. Если модуль GPU Profiler недоступен или требует слишком много ресурсов, панель инструментов Ряд кнопок и основных элементов управления в верхней части редактора Unity, который позволяет вам взаимодействовать с редактором различными способами (например, масштабирование, перевод). Подробнее
See in Словарь на панели сведений модуля Profiler не показывает эту информацию. Образцы под этими маркерами могут дать вам хорошее представление о том, привязано ли ваше приложение к процессору или графическому процессору.
Маркер | Функция |
---|---|
WaitForTargetFPS | Указывает, сколько времени ваше приложение потратило на ожидание целевого FPS, указанного Application.targetFrameRate.
Если образец представляет собой подвыборку Gfx.WaitForPresentOnGfxThread, он представляет собой количество времени, которое ваше приложение потратило на ожидание GPU. Например, это может быть время, которое GPU потратил на ожидание следующей VSync, если это настроено в QualitySettings.vSyncCount, или если vSync принудительно на вашей целевой платформе. Однако образцы с этим маркером также генерируются, если графический процессор не закончил вычисление кадра. Чтобы определить, почему образцы с этим маркером занимают много времени, переключитесь на представление временной шкалы в модуле CPU Profiler. В этом представлении вы можете проверить, что произошло в потоке рендеринга и сколько времени прошло между этим сэмплом, заканчивающимся в текущем кадре, и тем же семплом, заканчивающимся в соседних кадрах. Если продолжительность больше, чем должно быть время кадра вашего приложения (исходя из целевой частоты кадров или vSync), ваши кадры занимают слишком много времени для рендеринга или вычисления. Если это так, изучите поток рендеринга и посмотрите, сколько времени он потратил на Gfx.PresentFrame по сравнению с другой работой, которую он затрачивал на подготовку и выдачу команд графическому процессору. Если поток рендеринга провел много времени в Gfx.PresentFrame, ваша работа по рендерингу связана с GPU. Если время потока рендеринга было потрачено на подготовку команд, ваше приложение привязано к ЦП. Чтобы узнать, на чем следует сосредоточиться, если ваше приложение привязано к графическому процессору, профилируйте работу графического процессора с помощью Unity Profiler или профилировщика платформы. Дополнительные сведения см. в документации руководства пользователя о том, как оптимизировать производительность графики. Примечание. Редактор не выполняет вертикальную синхронизацию на графическом процессоре, а вместо этого использует функцию WaitForTargetFPS для имитации задержки вертикальной синхронизации. Некоторые платформы, в частности Android и iOS, используют VSync или имеют ограничение частоты кадров по умолчанию, равное 30 или 60. |
Gfx.PresentFrame | Представляет время, затраченное вашим приложением на ожидание рендеринга и представления кадра графическим процессором, включая ожидание вертикальной синхронизации.
Образцы с маркером WaitForTargetFPS в основном потоке показывают, сколько времени тратится на ожидание VSync. |
Gfx.ProcessCommands | Содержит всю обработку рендерингапроцесса рисования графики на экране (или в текстуре рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее См. в командах Словарь в потоке рендеринга. Ваше приложение могло потратить часть этого времени обработки на ожидание VSyncВертикальная синхронизация (VSync) — это параметр отображения, ограничивающий кадр игры. частоту обновления, соответствующую частоте обновления монитора, чтобы предотвратить разрыв изображения. См. в Словарь или новые команды из основного потока, которые вы можете увидеть из его дочерний образец Gfx.WaitForPresentOnGfxThread. |
Gfx.WaitForCommands | Указывает, что поток рендеринга готов к новым командам. Если вы видите этот маркер, это может указывать на узкое место в основном потоке. |
e.g.GfxDeviceD3D11.WaitForLastPresent GfxDeviceD3D12.WaitForLastPresent GfxDeviceMetal.WaitForLastPresent |
Образцы с этим маркером появляются, когда основной поток ожидает, пока графический процессор перевернет номер кадра на экран (Time.frameCount - QualitySettings.maxQueuedFrames + 1 ). Это означает, что если QualitySettings.maxQueuedFrames больше единицы, это время тратится на ожидание, пока графический процессор перевернет кадр, который ваше приложение запросило для отображения в предыдущем кадре основного потока.
Подробнее об этом образце и обзор конвейера кадров Unity см. на странице Запись в блоге Unity об исправлении разницы во времени. |
Gfx.WaitForPresentOnGfxThread | Указывает, что основной поток был готов начать рендеринг следующего кадра, но поток рендеринга не завершил ожидание представления кадра графическим процессором. Это может указывать на то, что ваше приложение привязано к графическому процессору. Чтобы узнать, на что одновременно тратится время потока рендеринга, откройте временную шкалу модуля CPU Profiler.
Если поток рендеринга проводит время в Camera.Render, ваше приложение привязано к процессору и может тратить слишком много времени на отправку вызовов отрисовки или текстур на графический процессор. Если поток рендеринга проводит время в Gfx.PresentFrame, ваше приложение привязано к графическому процессору или может ожидать VSync на графическом процессоре. Подвыборка WaitForTargetFPS для Gfx.WaitForPresentOnGfxThread представляет часть фазы Present, которую ваше приложение потратило на ожидание VSync. Текущая фаза — это часть времени между тем, когда Unity дает графическому API указание поменять местами буферы, и временем завершения этой операции. |
Gfx.WaitForRenderThread | Указывает, что основной поток ожидал, пока поток рендеринга обработает все команды в своем потоке команд. Образцы с этим маркером отображаются только при многопоточном рендеринге. |
Back end scripting markers
В примерах выделен Mono или IL2CPPразработанный Unity сервер сценариев, который можно использовать в качестве альтернативы Mono при создание проектов для некоторых платформ. Подробнее
См. в Словарь серверная часть сценариевСреда, обеспечивающая работу сценариев в Unity. Unity поддерживает три различных бэкэнда для сценариев в зависимости от целевой платформы: Mono, .NET и IL2CPP. Однако универсальная платформа Windows поддерживает только два: .NET и IL2CPP. Подробнее
См. в Словарь. Они полезны для устранения неполадок, связанных со сборкой и размещением мусора.
Маркет | Функция |
---|---|
GC.Alloc | Представляет выделение в управляемой куче, содержащее управляемые выделения, подлежащие автоматической сборке мусора. Чтобы сократить время, затрачиваемое вашим приложением на автоматическую сборку мусора, вы должны свести к минимуму эти типы выборок. |
GC.Collect | Представляет образцы, относящиеся к сборке мусора. Всякий раз, когда Unity необходимо выполнить сборку мусора, он останавливает выполнение вашего программного кода и возобновляет нормальное выполнение только тогда, когда сборщик мусора завершит всю свою работу. Примечание. Если вы включили добавочную сборку мусора, сборщик мусора может не завершить свою работу за один кадр.
Это прерывание может вызвать задержки в выполнении вашего приложения, которые длятся от менее одной миллисекунды до сотен миллисекунд. Это зависит от того, сколько памяти требуется сборщику мусора, и от платформы, на которой работает ваше приложение. Дополнительную информацию см. в документации по Общие сведения об автоматическом управлении памятью. |
Mono.JIT Mono-only |
Содержит примеры, относящиеся к своевременной компиляции метода сценария. Когда функция выполняется в первый раз, Mono компилирует ее, а Mono.JIT представляет эти издержки компиляции. |
UnsafeUtility.Malloc | Содержит образцы, вызывающие UnsafeUtility.Malloc для выделения неуправляемой памяти. Хотя сборщик мусора не отслеживает эту память, выделение памяти может оказать значительное влияние на производительность, что показано в этом примере. Чтобы исследовать источник этого вызова, вы можете включить Call Stackсписок методов, которые вызывались во время выполнения, организованные по принципу "последний пришел - первый ушел". Просмотрите запись Словарь для этого маркера в окне Profiler. |
Маркеры многопоточности
Эти маркеры содержат образцы, которые не измеряют потребляемые циклы ЦП, а вместо этого выделяют информацию, относящуюся к синхронизации потоков и системе заданий. Когда вы увидите эти примеры, используйте представление временной шкалы модуля CPU Profiler, чтобы проверить, что происходит в других потоках одновременно.
Маркет | Функция |
---|---|
Idle | Содержит образцы, указывающие время, в течение которого рабочий поток неактивен. Рабочий поток неактивен каждый раз, когда система заданий не использует его, и переходит в режим ожидания, где он ожидает на семафоре.
Небольшие промежутки между примерами бездействия обычно возникают, когда система заданий активирует их, например, для планирования новых заданий. Более длинные промежутки могут указывать на то, что в потоке выполняется собственное задание, которое не было инструментировано.. |
JobHandle.Complete | Содержит образцы, указывающие, когда возникла точка синхронизации в задании. Точки синхронизации могут повлиять на производительность вашего приложения и помешать выполнению кода многопоточного задания. Чтобы было проще найти, где именно произошла точка синхронизации, включите запись Call Stack для этого примера. В представлении Временная шкала модуля CPU Profiler вы можете включить события потока, чтобы увидеть, какие задания завершены на данный момент. |
Semaphore.WaitForSignal | Содержит образец, изображающий точку синхронизации в потоке. Чтобы найти поток, который он ожидает, проверьте представление временной шкалы для образцов, которые закончились незадолго до этого.. |
WaitForJobGroupID | Сработала блокировка синхронизации на JobHandle. Это может привести к краже работы, что происходит, когда работник заканчивает свою работу, а затем смотрит на работы других работников, чтобы завершить их. Они отображаются как образцы заданий, выполняемые под этим маркером. Рабочие места, которые были «украдены», не обязательно являются рабочими местами, которых ждали. |
Физические маркеры
В следующей таблице представлены некоторые высокоуровневые физические маркеры профилировщикаразмещенные в коде для описания события CPU или GPU, которое затем отображается в окне Unity Profiler. Добавляется в код Unity по умолчанию, или вы можете использовать ProfilerMarkerAPI для добавления собственных маркеров. Подробнее
См. в Словарь. FixedUpdate вызывает все эти измерения.
Маркет | Функция | |
---|---|---|
Physics.FetchResults | Содержит образцы, которые собирают результаты физического моделирования из физического движкаСистема, которая моделирует аспекты физических систем, чтобы объекты могли ускоряться. правильно и подвергаться воздействию столкновений, гравитации и других сил. Подробнее См. в Словарь, например потоки контактов, перекрытия триггеров и jointФизический компонент, обеспечивающий динамическое соединение между компонентами Rigidbody, обычно допускающий некоторую степень движения, например шарнир. Подробнее См. в Словарь события поломки. |
|
Physics.Interpolation | Содержит образцы, измеряющие время выполнения метода Physics.Interpolation. Этот метод управляет интерполяцией положений и вращений для всех физических объектов в вашем приложении. | |
Physics.Processing | Содержит образцы, которые провели время в ожидании в основном потоке, пока не завершится моделирование физики во всех потоках. Если ваше приложение проводит много времени в Physics.Processing, но имеет только несколько связанных с физикой GameObjectsфундаментальный объект в сценах Unity, которые могут представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее См. в Словарь в СценаСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее См. в Словарь, это может означать, что рабочие потоки взяли на себя другие системные задачи из-за к краже работы и сообщается как физика. Это связано с тем, что во время ожидания основной поток берет задания из очереди с высоким приоритетом.. |
|
Physics.ProcessingCloth | Содержит образцы, измеряющие время выполнения метода Physics.ProcessingCloth. Этот метод обрабатывает все задания по физике ткани. Разверните этот образец, чтобы показать детали низкого уровня работы, выполняемой внутри физического движка. | |
Physics.ProcessReports | Содержит образцы, соответствующие времени, затраченному на пересылку физических данных сценариям с помощью обратных вызовов, таких как OnTriggerEnter. Примечание. Эти образцы не вычисляют требуемые данные, поскольку они уже были подготовлены во время FetchResults.
Есть четыре отдельных подэтапа: |
|
Physics.Contacts | Содержит примеры, измеряющие время выполнения Physics.Contacts. Это обрабатывает события OnCollisionEnter, OnCollisionExit и OnCollisionStay.. | |
Physics.JointBreaks | Содержит примеры, измеряющие время выполнения Physics.JointBreaks. Это обрабатывает обновления и сообщения, связанные со сломанными суставами. | |
Physics.TriggerEnterExits | Содержит примеры, измеряющие время выполнения Physics.TriggerEnterExits. Это обрабатывает события OnTriggerEnter и OnTriggerExit. | |
Physics.TriggerStays | Содержит образцы, измеряющие время выполнения Physics.TriggerStays. Это обрабатывает события OnTriggerStay. | |
Physics.Simulate | Содержит примеры, в которых измеряется время, затраченное на предварительные условия для метода Physics.Simulate. Этот метод дает указание физическому движку запустить симуляцию, которая обновляет состояние текущей физики.. | |
Physics.UpdateBodies | Содержит образцы, которые обновляют положения и повороты всех физических тел. Для каждого игрового объекта, имеющего компонент Rigidbody, который позволяет воздействовать на игровой объект смоделированной гравитацией и другими силами. Подробнее Посмотрите в Словарь образцы с этим маркером считывают позу из физического движка и запишите его в Transform. |
|
Physics.UpdateCloth | Содержит образцы, измеряющие время выполнения метода Physics.UpdateCloth. Этот метод обрабатывает обновления, которые относятся к ткани и их Skinned Meshes.. |
Дополнительную информацию о жизненных циклах скриптов и общие примеры жизненного цикла скриптов см. в документации по Порядку выполнения функций обработки событий.
Предупреждения о производительности
Профилировщик ЦП обнаруживает некоторые распространенные проблемы с производительностью и предупреждает вас о них. Они отображаются в столбце «Предупреждение» представления Иерархия модуля CPU Profiler на панели сведений о модуле.
Профилировщик обнаруживает некоторые конкретные вызовы, которых следует избегать в критических для производительности контекстах. Он отображает предупреждения с указанием причин, по которым операции влияют на производительность, следующим образом:
Предупреждение | Описание |
---|---|
Animation.DestroyAnimationClip Animation.AddClip Animation.RemoveClip Animation.Clone Animation.Deactivate |
Указывает, что RebuildInternalState активирован. RebuildInternalState — это операция, которая проходит по списку кривых для каждого клипа в компоненте Animation, а затем повторно привязывает каждую кривую к значению компонента в GameObject.
Это ресурсоемкая операция, поэтому следует по возможности избегать вызова этих методов во время выполнения. |
AssetBundle.asset/allAssets | Указывает, что Unity вызвала API AssetBundleRequest.assets/allAssets, пока загрузка AssetBundle не была завершена (AssetBundleRequest.isDone имеет значение false). Это вызывает остановку основного потока и ожидание завершения операции загрузки. |
AsyncUploadManager.AsyncBufferResized AsyncUploadManager.AsyncBufferDelete |
Указывает, что размер внутреннего буфера для загрузки данных в графический процессор изменен, так как он недостаточно велик. Это изменение размера происходит медленно и вызывает всплески активности ЦП.
Вы можете избежать этого предупреждения, если сможете сэкономить память, чтобы выделить больший размер вперед. Вы можете использовать параметр Размер буфера асинхронной загрузки в Настройках качества, чтобы установить размер по умолчанию. Маркер AsyncUploadManager.AsyncBufferResized указывает вновь выделенный размер, который можно использовать в качестве ориентира для размера буфера по умолчанию. |
Rigidbody.SetKinematic | Воссоздайте невыпуклый MeshCollider для Rigidbody. |