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

Интерфейс статистики XR SDK

XRОбщий термин, охватывающий приложения виртуальной реальности (VR), дополненной реальности (AR) и смешанной реальности (MR). . Устройства, поддерживающие эти формы интерактивных приложений, можно назвать устройствами XR. Подробнее
См. в Словарь
Интерфейс SDK Stats используется для регистрации и управления статистическими данными.

Обзор

Используйте интерфейс XR Stats для записи статистики между различными подсистемами. Единственным поддерживаемым примитивом статистики является число с плавающей запятой.

Используйте метод точки входа UnityPluginLoad, чтобы получить указатель на интерфейс XRStats:

IUnityXRStats* sXRStats = nullptr; extern "C" void UNITY_INTERFACE_EXPORT UnityPluginLoad(IUnityInterfaces* unityInterfaces) { sXRStats = (IUnityXRStats*)unityInterfaces->GetInterface(UNITY_GET_INTERFACE_GUID(IUnityXRStats)); //... }

Использование

Зарегистрируйте свою подсистему и отдельные определения статистики в интерфейсе статистики:

static UnityXRStatId m_GPUFrameTimeID; static UnityXRStatId m_DroppedFrameCountID; static UnityXRStatId m_WorkThreadStat; static UnitySubsystemErrorCode ExampleDisplayProvider_Start(UnitySubsystemHandle handle) { if (sXRStats) { sXRStats->RegisterStatSource(handle); m_GPUFrameTimeID = sXRStats->RegisterStatDefinition(handle, "Example.GPUTime", kUnityXRStatOptionNone); m_DroppedFrameCountID = sXRStats->RegisterStatDefinition(handle, "Example.DroppedFrame", kUnityXRStatOptionNone); m_WorkThreadStat = sXRStats->RegisterStatDefinition(handle, "Example.WorkerThreadStat", kUnityXRStatOptionNone); } return kUnitySubsystemErrorCodeSuccess; }

Обновление статистики в теме Gfx:

extern float GetLastGPUTime(); //provided by your runtime static void ExampleDisplayProvider_GfxThreadCall(UnitySubsystemHandle handle) { sXRStats->SetStatFloat(m_GPUFrameTimeID, GetLastGPUTime()); // Do gfx thread things }

Обновление статистики в основной теме:

extern float GetDroppedFrameCount(); //provided by your runtime static void ExampleDisplayProvider_MainThreadCall(UnitySubsystemHandle handle) { sXRStats->SetStatFloat(m_DroppedFrameCountID, GetDroppedFrameCount()); // Do main thread things }

Обновляйте статистику в своих потоках, но не забудьте вызвать IncrementStatFrame, чтобы текущий кадр для этого потока был синхронизирован с другими потоками (это управляется внутренним образом для основного и графические потоки):

extern float GetWorkerThreadStat(); //provided by your runtime static void ExampleDisplayProvider_MyWorkerThread(UnitySubsystemHandle handle) { sXRStats->IncrementStatFrame(); sXRStats->SetStatFloat(m_WorkThreadStat, GetWorkerThreadStat()); // Do worker thread things }

Отменить регистрацию источника статистики при остановке подсистемы:

static void ExampleDisplayProvider_Stop(UnitySubsystemHandle handle) { sXRStats->UnregisterStatSource(handle); }

Безопасность потоков

Обновление статистики с помощью SetStatFloat является потокобезопасным. Однако регистрация и отмена регистрации источников статистики не является потокобезопасной и должна выполняться только в основном потоке во время функций Start и Stop жизненного цикла источника статистики.

Ограничения

Размер очереди для обработки статистики — 2 000. Эта очередь является общей для всех потоков и всех подсистем и обслуживается только после завершения кадра. По этой причине количество вызовов SetStatFloat должно быть небольшим, чтобы избежать заполнения очереди.

Примечание. Любая статистика, записанная при заполнении очереди, будет потеряна.

Предоставление статистики пользователям

В пространстве имен UnityEngine.XR.Provider используйте public static bool TryGetStat(Experimental.IntegratedSubsystem xrSubsystem, string tag, out float value) , чтобы зарегистрировать и обновить статистику у вашего провайдера:

using UnityEngine.XR.Provider; using System.Collections.Generic; using UnityEngine.Experimental.XR; using UnityEngine.Experimental; using UnityEngine; public static class ExampleProviderStats { public static float GPUFrameTime() { float tmp; XRStats.TryGetStat(GetFirstDisplaySubsystem(), "Example.GPUTime", out tmp); return tmp; } public static int DroppedFrameCount() { float tmp; XRStats.TryGetStat(GetFirstDisplaySubsystem(), "Example.DroppedFrame", out tmp); return (int)tmp; } public static float MyWorkerThreadStat() { float tmp; XRStats.TryGetStat(GetFirstDisplaySubsystem(), "Example.WorkerThreadStat", out tmp); return tmp; } // etc... private static IntegratedSubsystem GetFirstDisplaySubsystem() { List displays = new List(); SubsystemManager.GetInstances(displays); if (displays.Count == 0) { Debug.Log("No display subsystem found."); return null; } return displays[0]; } }

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

Кроме того, некоторые подсистемы имеют предопределенные теги статистики. Ваш провайдер может предоставить статистику для предопределенных API статистики, которые Unity предоставляет, регистрируя теги статистики для конкретной подсистемы (например: Заголовки/XR/UnityXRDisplayStats.h).

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