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;
}
}
}
}