rabidus-test/Assets/Graphy - Ultimate Stats Mon.../Runtime/Fps/G_FpsMonitor.cs

146 lines
4.7 KiB
C#

/* ---------------------------------------
* Author: Martin Pane (martintayx@gmail.com) (@tayx94)
* Contributors: https://github.com/Tayx94/graphy/graphs/contributors
* Project: Graphy - Ultimate Stats Monitor
* Date: 15-Dec-17
* Studio: Tayx
*
* Git repo: https://github.com/Tayx94/graphy
*
* This project is released under the MIT license.
* Attribution is not required, but it is always welcomed!
* -------------------------------------*/
using System;
using System.Xml.Linq;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Tayx.Graphy.Fps
{
public class G_FpsMonitor : MonoBehaviour
{
#region Variables -> Private
private short[] m_fpsSamples;
private short[] m_fpsSamplesSorted;
private short m_fpsSamplesCapacity = 1024;
private short m_onePercentSamples = 10;
private short m_zero1PercentSamples = 1;
private short m_fpsSamplesCount = 0;
private short m_indexSample = 0;
private float m_unscaledDeltaTime = 0f;
#endregion
#region Properties -> Public
public short CurrentFPS { get; private set; } = 0;
public short AverageFPS { get; private set; } = 0;
public short OnePercentFPS { get; private set; } = 0;
public short Zero1PercentFps { get; private set; } = 0;
#endregion
#region Methods -> Unity Callbacks
private void Awake()
{
Init();
}
private void Update()
{
m_unscaledDeltaTime = Time.unscaledDeltaTime;
// Update fps and ms
CurrentFPS = (short)(Mathf.RoundToInt(1f / m_unscaledDeltaTime));
// Update avg fps
uint averageAddedFps = 0;
m_indexSample++;
if ( m_indexSample >= m_fpsSamplesCapacity ) m_indexSample = 0;
m_fpsSamples[ m_indexSample ] = CurrentFPS;
if (m_fpsSamplesCount < m_fpsSamplesCapacity)
{
m_fpsSamplesCount++;
}
for (int i = 0; i < m_fpsSamplesCount; i++)
{
averageAddedFps += (uint)m_fpsSamples[i];
}
AverageFPS = (short)((float)averageAddedFps / (float)m_fpsSamplesCount);
// Update percent lows
m_fpsSamples.CopyTo( m_fpsSamplesSorted, 0 );
/*
* TODO: Find a faster way to do this.
* We can probably avoid copying the full array every time
* and insert the new item already sorted in the list.
*/
Array.Sort(m_fpsSamplesSorted, (x, y) => x.CompareTo(y)); // The lambda expression avoids garbage generation
bool zero1PercentCalculated = false;
uint totalAddedFps = 0;
short samplesToIterateThroughForOnePercent = m_fpsSamplesCount < m_onePercentSamples
? m_fpsSamplesCount : m_onePercentSamples;
short samplesToIterateThroughForZero1Percent = m_fpsSamplesCount < m_zero1PercentSamples
? m_fpsSamplesCount : m_zero1PercentSamples;
short sampleToStartIn = (short)(m_fpsSamplesCapacity - m_fpsSamplesCount);
for ( short i = sampleToStartIn; i < sampleToStartIn + samplesToIterateThroughForOnePercent; i++ )
{
totalAddedFps += (ushort)m_fpsSamplesSorted[i];
if (!zero1PercentCalculated && i >= samplesToIterateThroughForZero1Percent - 1)
{
zero1PercentCalculated = true;
Zero1PercentFps = (short)((float)totalAddedFps / (float)m_zero1PercentSamples);
}
}
OnePercentFPS = (short)((float)totalAddedFps / (float)m_onePercentSamples);
}
#endregion
#region Methods -> Public
public void UpdateParameters()
{
m_onePercentSamples = (short)(m_fpsSamplesCapacity / 100);
m_zero1PercentSamples = (short)(m_fpsSamplesCapacity / 1000);
}
#endregion
#region Methods -> Private
private void Init()
{
m_fpsSamples = new short[m_fpsSamplesCapacity];
m_fpsSamplesSorted = new short[m_fpsSamplesCapacity];
UpdateParameters();
}
#endregion
}
}