chore: initial commit
This commit is contained in:
117
Assets/Feel/MMTools/Accessories/MMPerformance/MMFPSCounter.cs
Normal file
117
Assets/Feel/MMTools/Accessories/MMPerformance/MMFPSCounter.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
using UnityEngine;
|
||||
#if MM_UI
|
||||
using UnityEngine.UI;
|
||||
using System.Collections;
|
||||
|
||||
namespace MoreMountains.Tools
|
||||
{
|
||||
/// <summary>
|
||||
/// Add this class to a gameObject with a Text component and it'll feed it the number of FPS in real time.
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(Text))]
|
||||
[AddComponentMenu("More Mountains/Tools/Performance/MMFPSCounter")]
|
||||
public class MMFPSCounter : MonoBehaviour
|
||||
{
|
||||
public enum Modes { Instant, MovingAverage, InstantAndMovingAverage }
|
||||
|
||||
/// the frequency at which the FPS counter should update (in seconds)
|
||||
public float UpdateInterval = 0.3f;
|
||||
/// if this is true, this counter will display a moving average of the framerate, not its instant framerate
|
||||
public Modes Mode = Modes.Instant;
|
||||
|
||||
protected float _framesAccumulated = 0f;
|
||||
protected float _framesDrawnInTheInterval = 0f;
|
||||
protected float _timeLeft ;
|
||||
protected Text _text;
|
||||
protected int _currentFPS;
|
||||
protected int _totalFrames = 0;
|
||||
protected int _average;
|
||||
|
||||
static string[] _stringsFrom00To300 = {
|
||||
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09",
|
||||
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
|
||||
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
|
||||
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
|
||||
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
|
||||
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
|
||||
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
|
||||
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
|
||||
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
|
||||
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99",
|
||||
"100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
|
||||
"110", "111", "112", "113", "114", "115", "116", "117", "118", "119",
|
||||
"120", "121", "122", "123", "124", "125", "126", "127", "128", "129",
|
||||
"130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
|
||||
"140", "141", "142", "143", "144", "145", "146", "147", "148", "149",
|
||||
"150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
|
||||
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169",
|
||||
"170", "171", "172", "173", "174", "175", "176", "177", "178", "179",
|
||||
"180", "181", "182", "183", "184", "185", "186", "187", "188", "189",
|
||||
"190", "191", "192", "193", "194", "195", "196", "197", "198", "199",
|
||||
"200", "201", "202", "203", "204", "205", "206", "207", "208", "209",
|
||||
"210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
|
||||
"220", "221", "222", "223", "224", "225", "226", "227", "228", "229",
|
||||
"230", "231", "232", "233", "234", "235", "236", "237", "238", "239",
|
||||
"240", "241", "242", "243", "244", "245", "246", "247", "248", "249",
|
||||
"250", "251", "252", "253", "254", "255", "256", "257", "258", "259",
|
||||
"260", "261", "262", "263", "264", "265", "266", "267", "268", "269",
|
||||
"270", "271", "272", "273", "274", "275", "276", "277", "278", "279",
|
||||
"280", "281", "282", "283", "284", "285", "286", "287", "288", "289",
|
||||
"290", "291", "292", "293", "294", "295", "296", "297", "298", "299",
|
||||
"300"
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// On Start(), we get the Text component and initialize our counter
|
||||
/// </summary>
|
||||
protected virtual void Start()
|
||||
{
|
||||
if(GetComponent<Text>()==null)
|
||||
{
|
||||
Debug.LogWarning ("FPSCounter requires a GUIText component.");
|
||||
return;
|
||||
}
|
||||
_text = GetComponent<Text>();
|
||||
_timeLeft = UpdateInterval;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// On Update, we increment our various counters, and if we've reached our UpdateInterval, we update our FPS counter
|
||||
/// with the number of frames displayed since the last counter update
|
||||
/// </summary>
|
||||
protected virtual void Update()
|
||||
{
|
||||
_framesDrawnInTheInterval++;
|
||||
_framesAccumulated = _framesAccumulated + Time.timeScale/Time.deltaTime;
|
||||
_timeLeft = _timeLeft - Time.deltaTime;
|
||||
|
||||
if( _timeLeft <= 0.0 )
|
||||
{
|
||||
_currentFPS = (int)Mathf.Clamp (_framesAccumulated / _framesDrawnInTheInterval, 0, 300);
|
||||
_framesDrawnInTheInterval = 0;
|
||||
_framesAccumulated = 0f;
|
||||
_timeLeft = UpdateInterval;
|
||||
_totalFrames++;
|
||||
_average += (_currentFPS - _average) / _totalFrames;
|
||||
|
||||
if (_currentFPS >=0 && _currentFPS <= 300)
|
||||
{
|
||||
switch (Mode)
|
||||
{
|
||||
case Modes.Instant:
|
||||
_text.text = _stringsFrom00To300[_currentFPS];
|
||||
break;
|
||||
case Modes.MovingAverage:
|
||||
_text.text = _stringsFrom00To300[_average];
|
||||
break;
|
||||
case Modes.InstantAndMovingAverage:
|
||||
_text.text = _stringsFrom00To300[_currentFPS] + " / " + _stringsFrom00To300[_average];
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,13 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 06e8923c17983d643980d7d7773b7382
|
||||
timeCreated: 1523894079
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
149
Assets/Feel/MMTools/Accessories/MMPerformance/MMFPSUnlock.cs
Normal file
149
Assets/Feel/MMTools/Accessories/MMPerformance/MMFPSUnlock.cs
Normal file
@@ -0,0 +1,149 @@
|
||||
using UnityEngine;
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
using UnityEngine.InputSystem;
|
||||
#endif
|
||||
using UnityEngine.Rendering;
|
||||
|
||||
namespace MoreMountains.Tools
|
||||
{
|
||||
/// <summary>
|
||||
/// Add this component to any object and it'll set the target frame rate and vsync count. Note that vsync count must be 0 for the target FPS to work.
|
||||
/// </summary>
|
||||
[AddComponentMenu("More Mountains/Tools/Performance/MMFPSUnlock")]
|
||||
public class MMFPSUnlock : MonoBehaviour
|
||||
{
|
||||
/// the target FPS you want the game to run at, that's up to how many times Update will run every second
|
||||
[Tooltip("the target FPS you want the game to run at, that's up to how many times Update will run every second")]
|
||||
public int TargetFPS = 300;
|
||||
|
||||
/// the number of frames to wait before rendering the next one. 0 will render every frame, 1 will render every 2 frames, 5 will render every 5 frames, etc
|
||||
[Tooltip("the number of frames to wait before rendering the next one. 0 will render every frame, 1 will render every 2 frames, 5 will render every 5 frames, etc")]
|
||||
public int RenderFrameInterval = 0;
|
||||
|
||||
[Range(0, 2)]
|
||||
/// whether vsync should be enabled or not (on a 60Hz screen, 1 : 60fps, 2 : 30fps, 0 : don't wait for vsync)
|
||||
[Tooltip("whether vsync should be enabled or not (on a 60Hz screen, 1 : 60fps, 2 : 30fps, 0 : don't wait for vsync)")]
|
||||
public int VSyncCount = 0;
|
||||
|
||||
/// if this is true, the user can press a number key to change the target FPS (1 : 10fps, 2 : 20fps, etc)
|
||||
[Tooltip("if this is true, the user can press a number key to change the target FPS (1 : 10fps, 2 : 20fps, etc)")]
|
||||
public bool EnableNumberShortcuts = false;
|
||||
|
||||
/// <summary>
|
||||
/// On start we change our target fps and vsync settings
|
||||
/// </summary>
|
||||
protected virtual void Start()
|
||||
{
|
||||
UpdateSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// On update we check for input if needed
|
||||
/// </summary>
|
||||
protected virtual void Update()
|
||||
{
|
||||
HandleInput();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When a value gets changed in the editor, we update our settings
|
||||
/// </summary>
|
||||
protected virtual void OnValidate()
|
||||
{
|
||||
UpdateSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the target frame rate value and vsync count setting
|
||||
/// </summary>
|
||||
protected virtual void UpdateSettings()
|
||||
{
|
||||
QualitySettings.vSyncCount = VSyncCount;
|
||||
Application.targetFrameRate = TargetFPS;
|
||||
OnDemandRendering.renderFrameInterval = RenderFrameInterval;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks for presses on 0-9 keys and changes the target FPS accordingly
|
||||
/// </summary>
|
||||
protected virtual void HandleInput()
|
||||
{
|
||||
if (!EnableNumberShortcuts)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool input;
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit0].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad0);
|
||||
#endif
|
||||
if (input) { TargetFPS = 300; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit1].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad1);
|
||||
#endif
|
||||
if (input) { TargetFPS = 10; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit2].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad2);
|
||||
#endif
|
||||
if (input) { TargetFPS = 20; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit3].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad3);
|
||||
#endif
|
||||
if (input) { TargetFPS = 30; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit4].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad4);
|
||||
#endif
|
||||
if (input) { TargetFPS = 40; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit5].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad5);
|
||||
#endif
|
||||
if (input) { TargetFPS = 50; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit6].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad6);
|
||||
#endif
|
||||
if (input) { TargetFPS = 60; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit7].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad7);
|
||||
#endif
|
||||
if (input) { TargetFPS = 70; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit8].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad8);
|
||||
#endif
|
||||
if (input) { TargetFPS = 80; UpdateSettings(); }
|
||||
|
||||
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
|
||||
input = Keyboard.current[Key.Digit9].wasPressedThisFrame;
|
||||
#else
|
||||
input = Input.GetKeyDown(KeyCode.Keypad9);
|
||||
#endif
|
||||
if (input) { TargetFPS = 90; UpdateSettings(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 32dd23bf97680be41a75b45b50f0d8ac
|
||||
timeCreated: 1523893764
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
69
Assets/Feel/MMTools/Accessories/MMPerformance/MMSpeedTest.cs
Normal file
69
Assets/Feel/MMTools/Accessories/MMPerformance/MMSpeedTest.cs
Normal file
@@ -0,0 +1,69 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace MoreMountains.Tools
|
||||
{
|
||||
/// <summary>
|
||||
/// A struct to store data associated to speed tests
|
||||
/// </summary>
|
||||
public struct MMSpeedTestItem
|
||||
{
|
||||
/// the name of the test, has to be unique
|
||||
public string TestID;
|
||||
/// a stopwatch to compute time
|
||||
public Stopwatch Timer;
|
||||
/// <summary>
|
||||
/// Creates a speed test with the specified ID and starts the timer
|
||||
/// </summary>
|
||||
/// <param name="testID"></param>
|
||||
public MMSpeedTestItem(string testID)
|
||||
{
|
||||
TestID = testID;
|
||||
Timer = Stopwatch.StartNew();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Use this class to run performance tests in your code.
|
||||
/// It'll output the time spent between the StartTest and the EndTest calls
|
||||
/// Make sure to use a unique ID for both calls
|
||||
/// </summary>
|
||||
public static class MMSpeedTest
|
||||
{
|
||||
private static readonly Dictionary<string, MMSpeedTestItem> _speedTests = new Dictionary<string, MMSpeedTestItem>();
|
||||
|
||||
/// <summary>
|
||||
/// Starts a speed test of the specified ID
|
||||
/// </summary>
|
||||
/// <param name="testID"></param>
|
||||
public static void StartTest(string testID)
|
||||
{
|
||||
if (_speedTests.ContainsKey(testID))
|
||||
{
|
||||
_speedTests.Remove(testID);
|
||||
}
|
||||
|
||||
MMSpeedTestItem item = new MMSpeedTestItem(testID);
|
||||
_speedTests.Add(testID, item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops a speed test of the specified ID
|
||||
/// </summary>
|
||||
public static void EndTest(string testID)
|
||||
{
|
||||
if (!_speedTests.ContainsKey(testID))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_speedTests[testID].Timer.Stop();
|
||||
float elapsedTime = _speedTests[testID].Timer.ElapsedMilliseconds / 1000f;
|
||||
_speedTests.Remove(testID);
|
||||
|
||||
MMDebug.DebugLogInfo("<color=red>MMSpeedTest</color> [Test "+testID+"] test duration : "+elapsedTime+"s");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0305ee4dd71cd604e95fb34a39ce09bd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user