Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Анализ следов профайлера

При профилировании приложения вы можете столкнуться с некоторыми распространенными проблемами. На этой странице описано, как исследовать причины некоторых распространенных проблем с производительностью.

Анализ следов запуска

При просмотре трассировки времени запуска необходимо проверить два ключевых метода: UnityInitApplicationGraphics и UnityLoadApplication. Эти два метода являются основными местами, где конфигурация, ресурсы и код проекта могут повлиять на время запуска.

Примечание. Время запуска вашего приложения зависит от платформы. На большинстве платформ запуск происходит во время появления заставки.

Трассировка инструментов примера проекта Unity, запущенного на устройстве iOS
Трассировка инструментов примера проекта Unity, запущенного на устройстве iOS

На приведенном выше снимке экрана показана трассировка инструментов примера проекта Unity, работающего на iOSмобильной операционной системе Apple. Подробнее
См. в Словарь
устройства, в специфичном для платформы startUnity, обратите внимание на методы UnityInitApplicationGraphics и UnityLoadApplication.

UnityInitApplicationGraphics выполняет множество внутренних операций, таких как настройка графического устройства и инициализация многих внутренних систем Unity. Он также инициализирует систему ресурсов, загружая индекс всех файлов, содержащихся в системе ресурсов.

система ресурсов Unity включает каждый файл ресурса в свои данные, находящиеся в Resources в папке Assets вашего проекта. Сюда входят все файлы в дочерних папках папки Resources. Таким образом, время, необходимое для инициализации системы ресурсов, увеличивается пропорционально количеству файлов в папках Resources в проекте вашего приложения.

UnityLoadApplication содержит методы, которые загружают и инициализируют первую SceneA Scene содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. Словарь
в проекте. Это включает в себя десериализацию и создание экземпляров данных, необходимых для отображения первой сцены, таких как компиляция шейдеровпрограммы, работающей на графическом процессоре. Подробнее
См. в Словарь
, загрузка текстур и создание экземпляров GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь
. Кроме того, Unity выполняет обратные вызовы Awake для всех MonoBehaviour в первой сцене.

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

Анализ трассировки во время выполнения

Для профилирования трассировок, полученных после начального времени запуска, в первую очередь представляет интерес метод PlayerLoop. Это основной цикл Unity, и код внутри него выполняется один раз за кадр.

Трассировка инструментов примера проекта Unity
Трассировка инструментов примера проекта Unity

Приведенный выше снимок экрана иллюстрирует несколько наиболее влияющих на производительность методов в PlayerLoop. Примечание. Названия методов в PlayerLoop могут различаться в разных версиях Unity.

PlayerRender – это метод, запускающий рендерингпроцесса рисования Unity. графика на экран (или в текстуру рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в системе Словарь
. Это включает в себя отбраковку объектов, вычисление динамических пакетов и отправку инструкций по рисованию в графический процессор. Любые эффекты изображения или обратные вызовы сценариев на основе рендеринга (например, OnWillRenderObject) также выполняются здесь. Как правило, это должно быть основным потребителем процессорного времени, пока проект является интерактивным.

BaseBehaviourManager вызывает три шаблонные версии CommonUpdate. Они вызывают определенные обратные вызовы в рамках MonoBehaviour, прикрепленных к активным игровым объектам в текущей сцене:

  • CommonUpdate вызывает обратные вызовы Update
  • CommonUpdate вызывает обратные вызовы LateUpdate
  • CommonUpdate вызывает FixedUpdate, если система физики установила флажок

В целом семейство методов BaseBehaviourManager::CommonUpdate является наиболее полезным для проверки, поскольку оно является точкой входа для большей части кода скрипта, выполняемого в проекте Unity. .

Есть несколько других методов, которые полезно проверить:

  • UI::CanvasManager вызывает несколько разных обратных вызовов, если проект использует Система UGUI. Сюда входит Unity UI(пользовательский интерфейс) Позволяет пользователю взаимодействовать с вашим приложением. Подробнее
    См. в Словарь
    пакетные вычисления и обновления макета; две операции, которые чаще всего вызывают появление CanvasManager в окне ProfilerA который поможет вам оптимизировать вашу игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
    См. в Словарь
    .
  • DelayedCallManager::Update запускает сопрограммы.
  • PhysicsManager::FixedUpdate запускает физическую систему PhysX. В первую очередь это связано с запуском внутреннего кода PhysX. Количество физических объектов в текущей сцене, таких как Rigidbody и Collider, влияет на внутренний код PhysX. Здесь также появляются обратные вызовы на основе физики: в частности, OnTriggerStay и OnCollisionStay.

Если в проекте используется 2D-физика, это выглядит как аналогичный набор вызовов в разделе Physics2DManager::FixedUpdate.

Разбор метода скрипта

Когда скриптыфрагмент кода, позволяющий создавать собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени. и отвечайте на ввод пользователя любым удобным для вас способом. Подробнее
См. Словарь
вызываются на платформах, кросс-компилируемых с IL2CPPРазработанный Unity сервер сценариев, который можно использовать в качестве альтернативы Mono при создании проектов для некоторых платформ. Подробнее
См. Словарь
, найдите строки трассировки, содержащие ScriptingInvocation. Это момент, когда внутренний нативный код Unity переходит в среду выполнения скрипта для выполнения кода скрипта. Примечание. Технически, после того как Unity прогоняет ваш код C# через IL2CPP, он также становится нативным кодом. Однако этот кросс-компилированный код в основном выполняет методы через среду выполнения IL2CPP и не похож на написанный от руки C++.

Трассировка из примера проекта Unity
Трассировка из примера проекта Unity

На приведенном выше снимке экрана методы, вложенные под строкой RuntimeInvoker_Void, являются частью кросс-компилированных сценариев C#, которые Unity выполняет один раз за кадр.

Имена строк трассировки представляют собой имя исходного класса, за которым следует символ подчеркивания и имя исходного метода. В этом примере трассировки вы можете увидеть EventSystem.Update, PlayerShooting.Update и несколько других Обновить методы. Это стандартные обратные вызовы Unity Update, используемые в большинстве MonoBehaviours.

Вы можете развернуть эти методы, чтобы увидеть, какие из них потребляют процессорное время. Это включает в себя другие методы скрипта в рамках проекта, API Unity и код библиотеки C#.

Приведенная выше трассировка показывает, что метод StandaloneInputModule.Process выполнял преобразование лучей через весь пользовательский интерфейс один раз за кадр. Этот метод определяет, были ли какие-либо события касания наведены или активированы какие-либо элементы пользовательского интерфейса. Метод, перебирающий все элементы пользовательского интерфейса и проверяющий, находится ли положение мыши в пределах их ограничивающего прямоугольника, требует больших ресурсов.

Загрузка объекта

Вы также можете определить загрузку активов в трассировках ЦП. Основной метод, указывающий на загрузку Актива, — SerializedFile::ReadObject. Этот метод подключает поток двоичных данных из файла к системе сериализации Unity, которая работает с помощью метода с именем Transfer. Метод Transfer применяется ко всем типам активов, таким как текстуры, поведение MonoBehaviours и системы частицПодробнее
См. в Словарь
.

След загрузки сцены
След загрузки сцены

Приведенный выше снимок экрана показывает, как Unity загружает сцену. При загрузке сцены Unity считывает и десериализует все активы в сцене, что обозначено вызовами различных методов Transfer в SerializedFile:: ЧитатьОбъект.

Если во время выполнения вы видите замедление производительности, а трассировка производительности показывает, что SerializedFile::ReadObject использовалось значительное количество времени, это означает, что загрузка ресурсов снизила частоту кадров. Примечание. SerializedFile::ReadObject обычно появляется в основном потоке, когда SceneManager, Ресурсы или API AssetBundle запрашивают синхронную загрузку активов.

Чтобы устранить это зависание производительности, вы можете сделать загрузку ресурсов асинхронной (которая перемещает тяжелый вызов ReadObject в рабочий поток) или предварительно загрузить определенные тяжелые ресурсы.

Вызовы

Transfer также появляются, когда Unity клонирует объекты (обозначается методом CloneObject в трассировке). Если вызов Transfer появляется под вызовом CloneObject, значит, Unity не загружает актив из хранилища. Вместо этого Unity передает данные старого объекта новому объекту. Для этого Unity сериализует старый объект и десериализует полученные данные как новый объект.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3