You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.4 KiB
C#
124 lines
3.4 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
#pragma warning disable 0618
|
|
|
|
namespace Example
|
|
{
|
|
/// <summary>
|
|
/// Helper utility to toggle application frame rate.
|
|
/// </summary>
|
|
public sealed class FrameRateUpdater : MonoBehaviour
|
|
{
|
|
public int TargetFrameRate => _targetFrameRate;
|
|
public int SmoothFrameRate => _smoothFrameRate;
|
|
|
|
private int _targetFrameRate;
|
|
private List<int> _defaultFrameRates = new List<int>();
|
|
private List<int> _mobileFrameRates = new List<int>();
|
|
private float[] _deltaTimes = new float[100];
|
|
private int _deltaTimeIndex;
|
|
private int _smoothFrameRate;
|
|
|
|
public void Toggle()
|
|
{
|
|
List<int> frameRates = _defaultFrameRates;
|
|
|
|
if (Application.isMobilePlatform == true && Application.isEditor == false)
|
|
{
|
|
frameRates = _mobileFrameRates;
|
|
}
|
|
|
|
int index = frameRates.IndexOf(_targetFrameRate);
|
|
index = index >= 0 ? (index + 1) % frameRates.Count : 0;
|
|
|
|
_targetFrameRate = frameRates[index];
|
|
|
|
Application.targetFrameRate = _targetFrameRate;
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
_defaultFrameRates.Add(0);
|
|
_defaultFrameRates.Add(5);
|
|
_defaultFrameRates.Add(15);
|
|
_defaultFrameRates.Add(30);
|
|
_defaultFrameRates.Add(60);
|
|
_defaultFrameRates.Add(90);
|
|
_defaultFrameRates.Add(120);
|
|
_defaultFrameRates.Add(144);
|
|
_defaultFrameRates.Add(150);
|
|
_defaultFrameRates.Add(165);
|
|
_defaultFrameRates.Add(200);
|
|
_defaultFrameRates.Add(240);
|
|
_defaultFrameRates.Add(288);
|
|
_defaultFrameRates.Add(325);
|
|
_defaultFrameRates.Add(360);
|
|
_defaultFrameRates.Add(390);
|
|
_defaultFrameRates.Add(432);
|
|
_defaultFrameRates.Add(480);
|
|
_defaultFrameRates.Add(576);
|
|
_defaultFrameRates.Add(650);
|
|
_defaultFrameRates.Add(720);
|
|
_defaultFrameRates.Add(850);
|
|
_defaultFrameRates.Add(990);
|
|
|
|
_mobileFrameRates.Add(0);
|
|
_mobileFrameRates.Add(5);
|
|
_mobileFrameRates.Add(15);
|
|
_mobileFrameRates.Add(30);
|
|
_mobileFrameRates.Add(60);
|
|
_mobileFrameRates.Add(72);
|
|
_mobileFrameRates.Add(90);
|
|
_mobileFrameRates.Add(120);
|
|
_mobileFrameRates.Add(125);
|
|
_mobileFrameRates.Add(144);
|
|
_mobileFrameRates.Add(165);
|
|
_mobileFrameRates.Add(200);
|
|
|
|
int currentRefreshRate = Screen.currentResolution.refreshRate;
|
|
if (currentRefreshRate > 0)
|
|
{
|
|
AddUnique(_defaultFrameRates, currentRefreshRate);
|
|
AddUnique(_defaultFrameRates, currentRefreshRate * 2);
|
|
AddUnique(_defaultFrameRates, currentRefreshRate * 3);
|
|
AddUnique(_defaultFrameRates, currentRefreshRate * 4);
|
|
|
|
AddUnique(_defaultFrameRates, currentRefreshRate);
|
|
AddUnique(_defaultFrameRates, currentRefreshRate * 2);
|
|
AddUnique(_defaultFrameRates, currentRefreshRate * 3);
|
|
AddUnique(_defaultFrameRates, currentRefreshRate * 4);
|
|
}
|
|
|
|
_targetFrameRate = Mathf.Max(currentRefreshRate, 0);
|
|
|
|
Application.targetFrameRate = _targetFrameRate;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
Application.targetFrameRate = _targetFrameRate;
|
|
|
|
_deltaTimeIndex = (_deltaTimeIndex + 1) % _deltaTimes.Length;
|
|
_deltaTimes[_deltaTimeIndex] = Time.unscaledDeltaTime;
|
|
|
|
float totalDeltaTime = 0.0f;
|
|
for (int i = 0; i < _deltaTimes.Length; ++i)
|
|
{
|
|
totalDeltaTime += _deltaTimes[i];
|
|
}
|
|
totalDeltaTime /= _deltaTimes.Length;
|
|
|
|
_smoothFrameRate = totalDeltaTime > 0.000001f ? Mathf.RoundToInt(1.0f / totalDeltaTime) : 0;
|
|
}
|
|
|
|
private void AddUnique(List<int> frameRates, int frameRate)
|
|
{
|
|
if (frameRates.Contains(frameRate) == false)
|
|
{
|
|
frameRates.Add(frameRate);
|
|
}
|
|
}
|
|
}
|
|
}
|