// Frames Per Second Canvas|Prefabs|0030 namespace VRTK { using UnityEngine; using UnityEngine.UI; /// /// Provides a frames per second text element to the HMD view. To use the prefab it must be placed into the scene then the headset camera needs attaching to the canvas: /// /// /// **Prefab Usage:** /// * Place the `VRTK/Prefabs/FramesPerSecondCanvas/FramesPerSecondCanvas` prefab in the scene hierarchy. /// /// > This script is largely based on the script at: http://talesfromtherift.com/vr-fps-counter/ So all credit to Peter Koch for his work. Twitter: @peterept /// /// /// `VRTK/Examples/018_CameraRig_FramesPerSecondCounter` displays the frames per second in the centre of the headset view. Pressing the trigger generates a new sphere and pressing the touchpad generates ten new spheres. Eventually when lots of spheres are present the FPS will drop and demonstrate the prefab. /// public class VRTK_FramesPerSecondViewer : MonoBehaviour { [Tooltip("Toggles whether the FPS text is visible.")] public bool displayFPS = true; [Tooltip("The frames per second deemed acceptable that is used as the benchmark to change the FPS text colour.")] public int targetFPS = 90; [Tooltip("The size of the font the FPS is displayed in.")] public int fontSize = 32; [Tooltip("The position of the FPS text within the headset view.")] public Vector3 position = Vector3.zero; [Tooltip("The colour of the FPS text when the frames per second are within reasonable limits of the Target FPS.")] public Color goodColor = Color.green; [Tooltip("The colour of the FPS text when the frames per second are falling short of reasonable limits of the Target FPS.")] public Color warnColor = Color.yellow; [Tooltip("The colour of the FPS text when the frames per second are at an unreasonable level of the Target FPS.")] public Color badColor = Color.red; protected const float updateInterval = 0.5f; protected int framesCount; protected float framesTime; protected Canvas canvas; protected Text text; protected virtual void OnEnable() { VRTK_SDKManager.SubscribeLoadedSetupChanged(LoadedSetupChanged); InitCanvas(); } protected virtual void OnDisable() { if (!gameObject.activeSelf) { VRTK_SDKManager.UnsubscribeLoadedSetupChanged(LoadedSetupChanged); } } protected virtual void Update() { framesCount++; framesTime += Time.unscaledDeltaTime; if (framesTime > updateInterval) { if (text != null) { if (displayFPS) { float fps = framesCount / framesTime; text.text = string.Format("{0:F2} FPS", fps); text.color = (fps > (targetFPS - 5) ? goodColor : (fps > (targetFPS - 30) ? warnColor : badColor)); } else { text.text = ""; } } framesCount = 0; framesTime = 0; } } protected virtual void LoadedSetupChanged(VRTK_SDKManager sender, VRTK_SDKManager.LoadedSetupChangeEventArgs e) { if (this != null && VRTK_SDKManager.ValidInstance() && gameObject.activeInHierarchy) { SetCanvasCamera(); } } protected virtual void InitCanvas() { canvas = transform.GetComponentInParent(); text = GetComponent(); if (canvas != null) { canvas.planeDistance = 0.5f; } if (text != null) { text.fontSize = fontSize; text.transform.localPosition = position; } SetCanvasCamera(); } protected virtual void SetCanvasCamera() { Transform sdkCamera = VRTK_DeviceFinder.HeadsetCamera(); if (sdkCamera != null) { canvas.worldCamera = sdkCamera.GetComponent(); } } } }