SDK XR Antarmuka statistik digunakan untuk mendaftar dan mengelola data statistik.
Gunakan antarmuka statistik XR untuk merekam statistik di antara berbagai subsistem. Satu-satunya primitif statistik didukung adalah nomor titik mengambang.
Gunakan metode titik entri UnityPluginLoad
untuk memperoleh pointer ke antarmuka XRStats:
IUnityXRStats* sXRStats = nullptr;
extern "C" void UNITY_INTERFACE_EXPORT UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
sXRStats = (IUnityXRStats*)unityInterfaces->GetInterface(UNITY_GET_INTERFACE_GUID(IUnityXRStats));
//...
}
Daftar subsistem dan definisi statistik individu dengan antarmuka statistik:
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;
}
Memperbarui statistik pada Thread Gfx:
extern float GetLastGPUTime(); //provided by your runtime
static void ExampleDisplayProvider_GfxThreadCall(UnitySubsystemHandle handle)
{
sXRStats->SetStatFloat(m_GPUFrameTimeID, GetLastGPUTime());
// Do gfx thread things
}
Memperbarui statistik pada benang utama:
extern float GetDroppedFrameCount(); //provided by your runtime
static void ExampleDisplayProvider_MainThreadCall(UnitySubsystemHandle handle)
{
sXRStats->SetStatFloat(m_DroppedFrameCountID, GetDroppedFrameCount());
// Do main thread things
}
Memperbarui statistik pada benang Anda sendiri, tetapi pastikan untuk memanggil IncrementStatFrame
untuk menjaga bingkai saat ini untuk benang yang disinkronkan dengan benang lain (ini dikelola secara internal untuk benang utama dan grafis):
extern float GetWorkerThreadStat(); //provided by your runtime
static void ExampleDisplayProvider_MyWorkerThread(UnitySubsystemHandle handle)
{
sXRStats->IncrementStatFrame();
sXRStats->SetStatFloat(m_WorkThreadStat, GetWorkerThreadStat());
// Do worker thread things
}
Unregister sumber statistik ketika subsistem berhenti:
static void ExampleDisplayProvider_Stop(UnitySubsystemHandle handle)
{
sXRStats->UnregisterStatSource(handle);
}
Memperbarui statistik melalui SetStatFloat
adalah benang aman. Namun, mendaftar dan sumber statistik yang tidak terdaftar tidak aman benang dan hanya harus dilakukan pada benang utama selama fungsi Start dan Stop siklus hidup sumber statistik.
Ukuran antrian untuk memproses statistik adalah 2000. antrian ini dibagikan di antara semua benang dan semua subsistem dan hanya dilayani pada penyelesaian bingkai. Untuk alasan ini, Anda harus menyimpan jumlah panggilan ke SetStatFloat
rendah untuk menghindari mengisi antrian.
Sitemap Setiap statistik yang dicatat ketika antrian penuh akan hilang.Note: Any stat recorded when the queue is full will be lost.
Di ruang nama UnityEngine.XR.Provider
, gunakan public static bool TryGetStat(Experimental.IntegratedSubsystem xrSubsystem, string tag, out float value)
untuk mendapatkan statistik yang terdaftar dan diperbarui dengan penyedia Anda:
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<XRDisplaySubsystem> displays = new List<XRDisplaySubsystem>();
SubsystemManager.GetInstances(displays);
if (displays.Count == 0)
{
Debug.Log("No display subsystem found.");
return null;
}
return displays[0];
}
}
Menulis metode aksesor publik seperti contoh di atas dapat membantu pengguna memperoleh statistik tanpa perlu menyaring melalui dokumentasi penyedia dan menemukan subsistem dengan statistik mana yang terdaftar.
Selain itu, beberapa subsistem memiliki tag statistik yang telah ditentukan. Penyedia Anda dapat menyediakan statistik untuk API yang dieksposkan Unity dengan mendaftarkan tag statistik spesifik subsistem (misalnya: Headers/XR/UnityXRDisplayStats.h
).