Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

VR время кадра

Время кадра в VR режим работает точно так же, как это делает в VSync-активированный не-VR режиме (см. документацию по Порядок выполнения функций событий). Единственное различие в том, что Unity не зависит от базового инструмента 3D SDK’s VSync, а вместо этого VR SDK нет никакой пользы от рендеринга быстрее, чем дисплей может обновляться. Вместо этого, Unity фокусируется на наиболее эффективном использовании времени.

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

Unity ожидает, пока GPU завершит рендеринг и отобразит последний кадр, затем отправляет команды рендеринга для следующего кадра.

Самая низкая латентность

Прежде чем Unity может отправить первую команду отображения, которая зависит от матрицы преобразования представления, она должна сначала получить матрицу представления из VR SDK. Чтобы сохранить задержку на минимальном уровне, VR SDK предсказывает преобразование головки дважды за кадр:

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

  • Один прогноз для имитации следующего кадра.

Unity применяет предсказание рендеринга текущего кадра к камерам, контроллерам и всему, что нуждается в информации для рендеринга Scene. Unity использует предсказание симулирования для следующего кадра, если он не может рендеринг следующего кадра.

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

Что происходит, когда Unity сбрасывает кадр?

Если Unity не отправляет полностью рендированный кадр вовремя, чтобы он был готов для следующего обновления дисплея, может произойти несколько вещей, в зависимости от того, какие VR SDK активны. VR SDK могут:

  • Отображение ранее представленного кадра. Это выглядит как тремор, и значительно снижает качество опыта.

  • Перепроецирует ранее отправленный кадр по повороту с учётом текущей позы головы. Это грубое приближение, которое неплохо работает как запасной вариант для статичного содержимого, но контент с анимацией или перемещением в пространстве выглядит некорректно.

  • Применить какую-то форму позиционной репроекции. Это может быть временно, чтобы заполнить недостающие детали.

Более подробную информацию о репроекции (иногда называемой искажением времени) см. в статье XinReality wiki о Timewarp.

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

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

GPU-связанный по сравнению с CPU-связанным в VR

Каждый дисплей имеет определенную частоту обновления, к которой привязан Unity. Вы можете получить это во время выполнения с помощью VRDevice.refreshRate. Значение 1, поделенное на refreshRate, дает вам время, выделенное на один кадр.

Например, это может быть 11.1 миллисекунд в случае частоты обновления 90 Гц.

  • Если ваше приложение связано с GPU, Unity Profiler отображает XR.WaitForGPU сверх времени одного кадра в миллисекундах.

  • Если приложение связано с CPU, кадр занимает больше времени, чем назначенное время кадра, но Unity Profiler отображает XR.WaitForGPU короче, чем один кадр.