Unity 6.3
0 онлайн 96 гостей 3 в системе
Вход
Оптимизация Шаг 59 из 208

Profiler ссылка на маркеры

Unity’s код инструментирован с маркеры профилеров которые дают вам представление о том, что занимает время в вашем приложении. В следующих таблицах содержится список некоторых встроенных маркеров.

Основные поток основы маркеры

Основные метки потока обеспечивают четкое разделение времени, затрачиваемого на приложение, и времени, затрачиваемого на действия Unity Editor и Profiler. Вы также можете использовать эти метки с ProfilerRecorder API для получения времени кадра в основном потоке, или с FrameTimingManager API для получения высокоуровневой статистики кадров во время выполнения.

Вы также можете использовать счетчики профилирования рендеринга CPU Время кадра главного потока, CPU Время кадра потока рендеринга и CPU Общее время кадра для получения высокоуровневых значений времени использования CPU вашим приложением. Дополнительные сведения см. в Счетчики профилирования рендеринга справочник.

Маркер Описание
PlayerLoop Содержит любые семплы, происходящие из главного цикла приложения. Если вы нацелены на редактор вместо режима воспроизведения, когда проигрыватель работает в редакторе в активном режиме воспроизведения, семплы PlayerLoop будут вложены под EditorLoop.
EditorLoop
(только для редактора)
Содержит любые семплы, которые происходят из главного цикла Редактора. Этот семпль присутствует только во время профилирования проигрывателя в Редакторе. Когда вы нацеливаете режим воспроизведения на Profiler, семплы EditorLoop указывают время, потраченное на рендеринг и запуск Редактора, содержащего проигрыватель.

Для получения дополнительной информации, см. образцы режима воспроизведения и режима редактирования.
Profiler.CollectEditorStats
(только для редактора)
Содержит любые образцы, связанные со сбором статистических данных для различных активных модулей Profiler.

Образцы, вложенные под маркером Profiler.CollectGlobalStats, указывают, сколько накладных расходов имеет Проигрыватель, когда он собирает статистические данные для конкретного модуля. Все другие дочерние образцы отражают их эффект только в Редакторе.

Чтобы удалить накладные расходы, которые имеет конкретный модуль, закройте диаграмму модуля или вызовите Profiler.SetAreaEnabled.

Примечание: Пользовательские модули Profiler, которые используют встроенные счетчики, включают область встроенных счетчиков, даже если модуль, к которому они принадлежат, отключен. Чтобы предотвратить сбор Profiler этих статистических данных и создание накладных расходов на сбор, убедитесь, что встроенный модуль Profiler и ваш пользовательский модуль Profiler отключены.

Маркеры обновления скриптов

Если вы не используете система работы, большая часть вашего кода скриптов вложена под следующими метками. Дополнительные сведения об образцах системы заданий см. Многорезцовые маркеры разделе этой страницы.

Дополнительные сведения о цикле обновления Unity см. в документации по Порядок выполнения функций событий. Вы можете вставить свои собственные обратные вызова в Player Loop с помощью PlayerLoop.SetPlayerLoop. Если вы вставляете обратные вызова непосредственно в главный цикл, образцы обновления вашего скрипта появляются самостоятельно. Если вы вставляете обратные вызова как подсистему, образцы появляются под соответствующим основным маркером PlayerLoopSystem.

Маркер Описание
BehaviourUpdate Содержит все примеры методов ,MonoBehaviour.Update,.
CoroutinesDelayedCalls Содержит все образцы ,coroutines, после их первой добычи.
FixedBehaviourUpdate Содержит все примеры методов ,Monobehaviour.FixedUpdate,.
PreLateUpdate.ScriptRunBehaviourLateUpdate Содержит все примеры методов ,Monobehaviour.LateUpdate,.
Update.ScriptRunBehaviourUpdate Содержит все образцы ,MonoBehaviour.Update, и ,coroutines,.

Отображение и маркеры VSync

Эти метки содержат примеры, где CPU тратит время на обработку данных для GPU, или где он может ждать завершения GPU. Если модуль GPU Profiler недоступен или добавляет слишком много накладных расходов, панель инструментов в панели деталей модуля Profiler не отображает эту информацию. Образцы под этими метками могут дать вам хорошее представление о том, связано ли ваше приложение с CPU или GPU.

Маркер Описание
WaitForTargetFPS Показывает, сколько времени приложение ожидало достижения целевой частоты кадров, заданной Application.targetFrameRate.

Если этот образец является дочерним образцом Gfx.WaitForPresentOnGfxThread, он показывает время ожидания GPU приложением. Например, GPU мог ожидать следующего VSync, если он настроен в QualitySettings.vSyncCount либо принудительно включён на целевой платформе. Однако образцы с этим маркером также создаются, если GPU ещё не завершил вычисление кадра.

Чтобы выяснить причину больших затрат времени в образцах с этим маркером, откройте представление Timeline в модуле CPU Profiler. Здесь можно проверить, что происходило в потоке отрисовки и сколько времени прошло между завершением этого образца в текущем кадре и завершением такого же образца в соседних кадрах.

Если длительность превышает ожидаемое время кадра приложения (с учётом целевой частоты кадров или vSync), отрисовка либо вычисление кадров занимает слишком много времени. В таком случае исследуйте поток отрисовки и сравните время, затраченное на Gfx.PresentFrame, со временем другой работы по подготовке и передаче команд GPU. Если поток отрисовки проводит много времени в Gfx.PresentFrame, производительность отрисовки ограничена GPU. Если же время потока отрисовки уходит на подготовку команд, производительность приложения ограничена CPU.

Если производительность приложения ограничена GPU, профилируйте работу GPU с помощью Unity Profiler или профилировщика платформы, чтобы определить направление оптимизации. Подробнее см. в руководстве пользователя в разделе об оптимизации производительности графики.

Примечание: Редактор не выполняет VSync на GPU, а имитирует задержку VSync с помощью WaitForTargetFPS. Некоторые платформы, в частности Android и iOS, принудительно используют VSync либо по умолчанию ограничивают частоту кадров значением 30 или 60.
Gfx.PresentFrame Представляет время, затраченное приложением на ожидание GPU для рендеринга и представления кадра, которое включает время ожидания VSync.

Образцы с меткой WaitForTargetFPS на главном потоке показывают, сколько времени потрачено на ожидание VSync.
Gfx.ProcessCommands Содержит всю обработку команд отображения в потоке отображения. Ваше приложение, возможно, потратило некоторое время на ожидания VSync или новых команд из главного потока, что можно увидеть из его дочернего примера Gfx.WaitForPresentOnGfxThread.
Gfx.WaitForCommands Показывает, что поток отображения готов для новых команд. Если вы видите этот маркер, это может указывать на узкое место в основном потоке.
<GraphicsAPIName>.WaitForLastPresent например:
GfxDeviceD3D11.WaitForLastPresent
GfxDeviceD3D12.WaitForLastPresent
GfxDeviceMetal.WaitForLastPresent
Образцы с этим маркером появляются, когда основной поток ждал, пока GPU перенесет номер кадра на экран (Time.frameCount - QualitySettings.maxQueuedFrames + 1). Это означает, что если QualitySettings.maxQueuedFrames больше одного, это время тратится на ожидание, пока GPU перенесет кадр, который ваше приложение запросило для рендеринга в предыдущем кадре главного потока.

Более подробную информацию об этом примере и обзор Frame Pipeline Unity см. в статье Unity в блоге об исправлении Delta Time.
Gfx.WaitForPresentOnGfxThread Показывает, что основной поток был готов начать рендеринг следующего кадра, но поток рендеринга не закончил ожидать GPU Это может означать, что ваше приложение не соответствует требованиям GPU-bound. Чтобы проверить, на чем поток рендеринга одновременно тратит время, проверьте CPU Profiler модули Timeline вид.

Если поток отображения проводит время в Camera.Render, Ваша заявка CPU-bound и может тратить слишком много времени, отправляя draw-вызовы или текстуры в GPU.

Если поток отображения проводит время в Gfx.PresentFrame, Ваша заявка GPU-bound, или он может ждать VSync по вопросу GPU. A WaitForTargetFPS подвыборка Gfx.WaitForPresentOnGfxThread представляет собой часть текущей фазы, которую ваше приложение провело в ожидании VSync. Настоящая фаза — это часть времени между Unity инструктирование графики API для обмена буферами, до момента завершения этой операции.
Gfx.WaitForRenderThread Показывает, что основной поток ждал, пока поток рендеринга обработает все команды в потоке команд. Образцы с этим маркером появляются только в многопоточном рендеринге.

Базовые скриптовые маркеры

Образцы выделяют Mono или IL2CPP операции скриптирования в бэкэнде и полезны для устранения неполадок со сбором мусора и распределением.

Маркер Описание
GC.Alloc Представляет собой выделение в управляемом куче, содержащее управляемые выделения, подпадающие под автоматическую сборку мусора. Чтобы сократить время, затрачиваемое приложением на автоматическую сборку мусора, следует минимизировать выборки этих типов.
GC.Collect Представляет образцы, связанные с сбором мусора. Когда Unity требуется выполнить сбор мусора, он останавливает выполнение кода программы и возобновляет обычное выполнение только после того, как сборщик мусора завершит всю свою работу. Примечание: Если вы включили Инкрементальный сбор мусора, сборщик мусора может не завершить свою работу в одном кадре.

Это прерывание может вызвать задержки в выполнении приложения, которые могут составлять от менее одной миллисекунды до сотен миллисекунд. Это зависит от объема памяти, который должен обработать сборщик мусора, и от платформы, на которой работает ваше приложение. Дополнительную информацию см. в документации по Понимание автоматического управления памятью.
Mono.JIT
Mono-только
Содержит сэмплы, относящиеся к JIT-компиляции скриптового метода. При первом выполнении функции Mono компилирует её, а Mono.JIT представляет накладные расходы этой компиляции.
UnsafeUtility.Malloc Содержит примеры, в которых для выделения неуправляемой памяти вызывается UnsafeUtility.Malloc. Хотя сборщик мусора не отслеживает эту память, её выделение может существенно влиять на производительность, что и показано в этом примере. Чтобы определить источник этого вызова, можно включить запись стека вызовов для этого маркера в окне Profiler.

Многопоточные маркеры

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

Маркер Описание
Бездействующий Содержит образцы, указывающие продолжительность времени, в течение которого рабочий поток неактивен. Работающий поток неактивен в любое время, когда система заданий его не использует, и он переходит в режим ожидания, где он ожидает семафор.

Небольшие промежутки между образцами Idle обычно возникают, когда Job System пробуждает их, например, для планирования новых заданий. Более длинные промежутки могут указывать на то, что на потоке работает основное задание, которое не было инструментализовано.
JobHandle.Complete Содержит образцы, указывающие, когда произошла точка синхронизации в задании. Точки синхронизации могут влиять на производительность приложения и могут мешать выполнению кода многопоточного задания. Чтобы упростить определение точного места, где произошла точка синхронизации, включите Стек вызовов записи для этой выборки. CPU Profiler модули Timeline вид, который вы можете включить События потока чтобы определить, какие задания закончились в этот момент.
Semaphore.WaitForSignal Содержит образец, который изображает точку синхронизации на потоке. Чтобы найти поток, который он ожидает, проверьте представление Timeline на образцы, которые закончились незадолго до этого потока.
WaitForJobGroupID На JobHandle был запущен Sync Fence. Это может привести к тому, что украдет, что происходит, когда рабочий завершает свою работу и затем смотрит на задания других рабочих, которые должны быть выполнены. Они отображаются как образцы заданий, выполненных под этим маркером. Задания, которые были украдены, не обязательно являются ожидаемыми заданиями.

Физико-математические маркеры

В следующей таблице приведены некоторые высокоуровневые физические Profiler маркеры. FixedUpdate вызывают все эти измерения.

Маркер Описание
Physics.FetchResults Содержит образцы, которые собирают результаты моделирования физики из механизма физики, такие как потоки контактов, перекрытия триггеров и события разрыва соединений.
Physics.Interpolation Содержит образцы, измеряющие время выполнения метода Physics.Interpolation. Этот метод управляет интерполяцией позиций и вращения для всех физических объектов в вашем приложении.
Physics.Processing Содержит образцы, которые потратили время ожидания на главном потоке до завершения моделирования физики во всех потоках. Если ваше приложение тратит много времени на Physics.Processing, но имеет только несколько связанных с физикой GameObjects в Scene, это может означать, что рабочие потоки взяли на себя другие системные задачи из-за кражи заданий и сообщили о них как о физике. Это потому, что во время ожидания главный поток берет задания из очереди высокого приоритета.
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 Содержит семплы, которые обновляют все позиции и вращения физических тел. Для каждого GameObject, который имеет компонент Rigidbody, семплы с этим маркером читают позицию из физической системы и записывают ее в Transform.
Physics.UpdateCloth Содержит образцы, измеряющие время выполнения метода Physics.UpdateCloth. Этот метод обрабатывает обновления, относящиеся к ткани и их Skinned Meshes.

Дополнительные сведения о жизненных циклах скриптов и общих примерах жизненных циклов скриптов см. в Порядок выполнения функций событий.

Animation маркеры

В следующих таблицах содержатся маркеры из системы Animation. Общую информацию о производительности системы Animation см. на страницах Производительность Mecanim и Оптимизация.

Этап PreLateUpdate.DirectorUpdateAnimationBegin

На этом этапе обрабатывается каждый активный и включенный Animator. Активные аниматоры обрабатываются независимо от режима удаления и видимости.

Маркеры, начинающиеся с Director., также могут покрывать Playables и Timeline.

Маркер Описание
Director.PrepareFrame Настройка, расписание и ожидание заданий Director.PrepareFrameJob. Эти задания вычисляют машины состояний для всех активных компонентов Animator.
Director.PrepareFrameJob (работа) Вычисление машины состояний одного активного Animator. Время обработки Animator растёт вместе со сложностью его машины состояний, то есть с числом состояний, переходов, свойств и слоёв.

Вычисление машин состояний с StateMachineBehaviours, которые реализуют слушателей OnStateMachineEnter или OnStateMachineExit, будет ограничена главным потоком.
Animators.PrepareFirstPass Подготовка к следующим этапам обработки.
Animators.ProcessGraphJob Создание, планирование и ожидание результатов заданий Animator.ProcessGraph.
Animators.ProcessGraph (работа) Оценка всех свойств по всем связанным AnimationClips.

Вычисление смещений движения корня путем объединения свойств движения корня из всех клипов вместе.

Сбор новых событий анимации для текущего deltaTime.

При оценке свойств AnimationClips сегменты кривой кэшированы локально между кадрами, чтобы избежать чтения из памяти AnimationClips больше, чем необходимо.
Animators.FireAnimationEventsAndBehaviours Запускает все сообщения событий анимации на ,StateMachineBehaviours, и MonoBehaviours, за исключением ,OnStateMachineEnter, или ,OnStateMachineExit, слушателей, которые уже были запущены в Director.PrepareFrameJob.
Animators.ApplyOnAnimatorMove Применить движение корня и вызвать сообщение OnAnimatorMove на MonoBehaviours.

PreLateUpdate.DirectorUpdateAnimationEnd

На этом этапе обрабатываются только аниматоры с режимом Culling Mode Always Update и видимые аниматоры с режимом Culling Mode UpdateTransform или Cull Completely. Аниматоры с Cull Completely, которые были выведены из кадра Root Motion, не участвуют в этой фазе. Не участвуют также аниматоры, которые были отключены пользовательским кодом, вызванным StateMachineBehaviours и AnimationEvents.

Маркер Функция
Animators.PrepareSecondPass Настройте следующие шаги обработки. Это включает фильтрацию аниматоров в зависимости от их режима удаления и статуса видимости.
Animators.SortWriteJob Система Transform разрешает только одному потоку модифицировать Transform Hierarchy одновременно. Чтобы приспособиться к этому ограничению, Animators.SortWriteJob группирует задания Animators.WriteTransforms по их Transform.root.

Для наилучшей производительности избегайте наличия нескольких Аниматоров в одной и той же иерархии преобразований, чтобы увеличить гранулярность, при которой задания могут быть запланированы и параллелизованы.
Animators.ProcessAnimationsJob Создание, планирование и ожидание результатов заданий Animators.ProcessAnimations.
Animator.ProcessAnimations (работа) Смешивает все свойства текущих активных AnimationClip для одного Animator, кроме корневого движения, и применяет их к внутреннему представлению аватара.

Длина этого маркера изменяется в зависимости от сложности анимации и смешивания.
OnAnimatorIK Настраивает анимацию IK. Это вызывает один раз для каждого Animator слоя Контроллера с включенным проходом IK.
Animators.WriteJob Создание, планирование и ожидание результатов заданий Animator.WriteTransform. Эти задания записывают трансформирующие позы из аватаров Animation в соответствующую иерархию трансформирования GameObject.
Animators.WriteTransforms (работа) Записывает все анимированные преобразования в сцену из рабочих потоков.
Animator.WriteProperties Запись любого анимированного свойства, которое не является трансформационной позы в целевой объект.

Предупреждения о производительности

CPU Profiler обнаруживает некоторые распространённые проблемы с производительностью и предупреждает о них. Эти предупреждения отображаются в столбце Warning представления Hierarchy модуля CPU Profiler на панели сведений о модуле.

Profiler обнаруживает некоторые специфические вызовы, которых следует избегать в контекстах, критических для производительности. Он отображает предупреждения с причинами, по которым операции влияют на производительность следующим образом:

Предупреждение Описание
Animation.DestroyAnimationClip
Animation.AddClip
Animation.RemoveClip
Animation.Clone
Animation.Deactivate
Указывает, что RebuildInternalState был запущен. RebuildInternalState — это операция, которая проходит через список кривых для каждого клипа в компоненте Animation, а затем перепривязывает каждую кривую к значению на компоненте, на GameObject.

Это ресурсоемкая операция, поэтому вы должны избегать вызова этих методов во время выполнения, насколько это возможно.
AssetBundle.asset/allAssets Указывает, что Unity вызвал AssetBundleRequest.assets/allAssets API, в то время как загрузка AssetBundle не была завершена (AssetBundleRequest.isDone является false). Это вызывает задержку на главном потоке и ожидает завершения операции загрузки.
AsyncUploadManager.AsyncBufferResized
AsyncUploadManager.AsyncBufferDelete
Указывает, что внутренний буфер для передачи данных на GPU был увеличен, потому что его не хватало. Такое изменение размера выполняется медленно и вызывает всплески нагрузки на CPU.

Вы можете избежать этого предупреждения, если можете освободить память для выделения большего размера заранее.

Вы можете использовать Размер Буфера Асинхронной Загрузки установка в Настройки качества чтобы установить размер по умолчанию.

AsyncUploadManager.AsyncBufferResized маркер указывает на вновь выделенный размер, который можно использовать в качестве ориентира для размера буфера по умолчанию.
Rigidbody.SetKinematic Воссоздать невыпуклое MeshCollider для Rigidbody.

Дополнительные ресурсы