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
).