//現在の予測遅延時間(動作-光子遅延時間)を取得 public float GetPredictedTime() { //最後のVsyncからの経過時間(フレーム経過時間)を取得 float FrameTime = 0; ulong FrameCount = 0; if (!IsReady()) { return(0); } if (!openvr.GetTimeSinceLastVsync(ref FrameTime, ref FrameCount)) { return(0); //有効な値を取得できなかった } //たまにすごい勢いで増えることがある if (FrameTime > 1.0f) { return(0); //有効な値を取得できなかった } //1フレームあたりの時間取得 float DisplayFrequency = 0; if (!GetPropertyFloat(GetHMDIndex(), ETrackedDeviceProperty.Prop_DisplayFrequency_Float, out DisplayFrequency)) { return(0); //有効な値を取得できなかった } float DisplayCycle = 1f / DisplayFrequency; //光子遅延時間(出力からHMD投影までにかかる時間)取得 float PhotonDelay = 0; if (!GetPropertyFloat(GetHMDIndex(), ETrackedDeviceProperty.Prop_SecondsFromVsyncToPhotons_Float, out PhotonDelay)) { return(0); //有効な値を取得できなかった } //予測遅延時間(1フレームあたりの時間 - 現在フレーム経過時間 + 光子遅延時間) var PredictedTimeNow = DisplayCycle - FrameTime + PhotonDelay; //負の値は過去になる。 if (PredictedTimeNow < 0) { return(0); } return(PredictedTimeNow); }
//returns current frame and time within it public static void TimeSinceVsync(ref float m_timeSinceLastVsync, ref ulong m_currFrame) { m_vrSystem.GetTimeSinceLastVsync(ref m_timeSinceLastVsync, ref m_currFrame); }