No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AdaptiveVariableRefreshRate.cs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System;
  2. using UnityEngine.AdaptivePerformance.Samsung.Android;
  3. namespace UnityEngine.AdaptivePerformance
  4. {
  5. /// <summary>
  6. /// A scaler used by <see cref="AdaptivePerformanceIndexer"/> to adjust the rendering rate using <see cref="VariableRefreshRate"/>.
  7. /// </summary>
  8. public class AdaptiveVariableRefreshRate : AdaptiveFramerate
  9. {
  10. /// <summary>
  11. /// Returns the name of the scaler.
  12. /// </summary>
  13. public override string Name => "Adaptive Variable Refresh Rate";
  14. bool m_AdaptiveVRREnabled = false;
  15. /// <summary>
  16. /// Returns true if this scaler is active, false otherwise.
  17. /// </summary>
  18. public override bool Enabled { get => m_AdaptiveVRREnabled; set => m_AdaptiveVRREnabled = value; }
  19. IVariableRefreshRate m_VRR;
  20. int m_CurrentRefreshRateIndex;
  21. int m_DefaultRefreshRateIndex;
  22. /// <summary>
  23. /// Override for Awake in the base class to set up for Variable Refresh Rate.
  24. /// </summary>
  25. protected override void Awake()
  26. {
  27. base.Awake();
  28. if (m_Settings == null)
  29. return;
  30. m_VRR = VariableRefreshRate.Instance;
  31. if (m_VRR == null)
  32. {
  33. Enabled = false;
  34. return;
  35. }
  36. m_VRR.RefreshRateChanged += RefreshRateChanged;
  37. m_CurrentRefreshRateIndex = Array.IndexOf(m_VRR.SupportedRefreshRates, m_VRR.CurrentRefreshRate);
  38. }
  39. /// <summary>
  40. /// Callback when scaler gets disabled and removed from indexer.
  41. /// </summary>
  42. protected override void OnDisabled()
  43. {
  44. base.OnDisabled();
  45. if (m_VRR == null)
  46. return;
  47. m_VRR.SetRefreshRateByIndex(m_DefaultRefreshRateIndex);
  48. }
  49. /// <summary>
  50. /// Callback when scaler gets enabled and added to the indexer.
  51. /// </summary>
  52. protected override void OnEnabled()
  53. {
  54. base.OnEnabled();
  55. if (m_VRR == null)
  56. return;
  57. m_DefaultRefreshRateIndex = Array.IndexOf(m_VRR.SupportedRefreshRates, m_VRR.CurrentRefreshRate);
  58. }
  59. void OnDestroy()
  60. {
  61. if (m_VRR == null)
  62. return;
  63. m_VRR.RefreshRateChanged -= RefreshRateChanged;
  64. }
  65. void RefreshRateChanged()
  66. {
  67. if (m_VRR == null)
  68. return;
  69. m_CurrentRefreshRateIndex = Array.IndexOf(m_VRR.SupportedRefreshRates, m_VRR.CurrentRefreshRate);
  70. }
  71. /// <summary>
  72. /// Callback for when the performance level is increased.
  73. /// </summary>
  74. protected override void OnLevelIncrease()
  75. {
  76. if (m_VRR == null)
  77. return;
  78. if (m_CurrentRefreshRateIndex > 0)
  79. {
  80. var rateIndex = m_CurrentRefreshRateIndex - 1;
  81. var fps = m_VRR.SupportedRefreshRates[rateIndex];
  82. if (fps < MinBound || fps > MaxBound)
  83. return;
  84. if (m_VRR.SetRefreshRateByIndex(rateIndex))
  85. m_CurrentRefreshRateIndex = rateIndex;
  86. }
  87. }
  88. /// <summary>
  89. /// Callback for when the performance level is decreased.
  90. /// </summary>
  91. protected override void OnLevelDecrease()
  92. {
  93. if (m_VRR == null)
  94. return;
  95. if (m_CurrentRefreshRateIndex < m_VRR.SupportedRefreshRates.Length - 1)
  96. {
  97. var rateIndex = m_CurrentRefreshRateIndex + 1;
  98. var fps = m_VRR.SupportedRefreshRates[rateIndex];
  99. if (fps < MinBound || fps > MaxBound)
  100. return;
  101. if (m_VRR.SetRefreshRateByIndex(rateIndex))
  102. m_CurrentRefreshRateIndex = rateIndex;
  103. }
  104. }
  105. }
  106. }