146 lines
4.7 KiB
C#
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
|
||
|
}
|
||
|
}
|