using System; using UnityEngine.AdaptivePerformance.Samsung.Android; namespace UnityEngine.AdaptivePerformance { /// /// A scaler used by to adjust the rendering rate using . /// public class AdaptiveVariableRefreshRate : AdaptiveFramerate { /// /// Returns the name of the scaler. /// public override string Name => "Adaptive Variable Refresh Rate"; bool m_AdaptiveVRREnabled = false; /// /// Returns true if this scaler is active, false otherwise. /// public override bool Enabled { get => m_AdaptiveVRREnabled; set => m_AdaptiveVRREnabled = value; } IVariableRefreshRate m_VRR; int m_CurrentRefreshRateIndex; int m_DefaultRefreshRateIndex; /// /// Override for Awake in the base class to set up for Variable Refresh Rate. /// protected override void Awake() { base.Awake(); if (m_Settings == null) return; m_VRR = VariableRefreshRate.Instance; if (m_VRR == null) { Enabled = false; return; } m_VRR.RefreshRateChanged += RefreshRateChanged; m_CurrentRefreshRateIndex = Array.IndexOf(m_VRR.SupportedRefreshRates, m_VRR.CurrentRefreshRate); } /// /// Callback when scaler gets disabled and removed from indexer. /// protected override void OnDisabled() { base.OnDisabled(); if (m_VRR == null) return; m_VRR.SetRefreshRateByIndex(m_DefaultRefreshRateIndex); } /// /// Callback when scaler gets enabled and added to the indexer. /// protected override void OnEnabled() { base.OnEnabled(); if (m_VRR == null) return; m_DefaultRefreshRateIndex = Array.IndexOf(m_VRR.SupportedRefreshRates, m_VRR.CurrentRefreshRate); } void OnDestroy() { if (m_VRR == null) return; m_VRR.RefreshRateChanged -= RefreshRateChanged; } void RefreshRateChanged() { if (m_VRR == null) return; m_CurrentRefreshRateIndex = Array.IndexOf(m_VRR.SupportedRefreshRates, m_VRR.CurrentRefreshRate); } /// /// Callback for when the performance level is increased. /// protected override void OnLevelIncrease() { if (m_VRR == null) return; if (m_CurrentRefreshRateIndex > 0) { var rateIndex = m_CurrentRefreshRateIndex - 1; var fps = m_VRR.SupportedRefreshRates[rateIndex]; if (fps < MinBound || fps > MaxBound) return; if (m_VRR.SetRefreshRateByIndex(rateIndex)) m_CurrentRefreshRateIndex = rateIndex; } } /// /// Callback for when the performance level is decreased. /// protected override void OnLevelDecrease() { if (m_VRR == null) return; if (m_CurrentRefreshRateIndex < m_VRR.SupportedRefreshRates.Length - 1) { var rateIndex = m_CurrentRefreshRateIndex + 1; var fps = m_VRR.SupportedRefreshRates[rateIndex]; if (fps < MinBound || fps > MaxBound) return; if (m_VRR.SetRefreshRateByIndex(rateIndex)) m_CurrentRefreshRateIndex = rateIndex; } } } }