81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using FishNet.Documenting;
 | |
| using System;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace FishNet.Managing.Timing
 | |
| {
 | |
| 
 | |
|     [APIExclude]
 | |
|     public class MovingAverage
 | |
|     {
 | |
|         #region Public.
 | |
|         /// <summary>
 | |
|         /// Average from samples favoring the most recent sample.
 | |
|         /// </summary>
 | |
|         public float Average { get; private set; }
 | |
|         #endregion
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Next index to write a sample to.
 | |
|         /// </summary>
 | |
|         private int _writeIndex;
 | |
|         /// <summary>
 | |
|         /// Collected samples.
 | |
|         /// </summary>
 | |
|         private float[] _samples;
 | |
|         /// <summary>
 | |
|         /// Number of samples written. Will be at most samples size.
 | |
|         /// </summary>
 | |
|         private int _writtenSamples;
 | |
|         /// <summary>
 | |
|         /// Samples accumulated over queue.
 | |
|         /// </summary>
 | |
|         private float _sampleAccumulator;
 | |
| 
 | |
|         public MovingAverage(int sampleSize)
 | |
|         {
 | |
|             if (sampleSize < 0)
 | |
|                 sampleSize = 0;
 | |
|             else if (sampleSize < 2)
 | |
|                 NetworkManager.StaticLogWarning("Using a sampleSize of less than 2 will always return the most recent value as Average.");
 | |
| 
 | |
|             _samples = new float[sampleSize];
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Computes a new windowed average each time a new sample arrives
 | |
|         /// </summary>
 | |
|         /// <param name="newSample"></param>
 | |
|         public void ComputeAverage(float newSample)
 | |
|         {
 | |
|             if (_samples.Length <= 1)
 | |
|             {
 | |
|                 Average = newSample;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _sampleAccumulator += newSample;
 | |
|             _samples[_writeIndex] = newSample;
 | |
| 
 | |
|             //Increase writeIndex.
 | |
|             _writeIndex++;
 | |
|             _writtenSamples = Math.Max(_writtenSamples, _writeIndex);
 | |
|             if (_writeIndex >= _samples.Length)
 | |
|                 _writeIndex = 0;
 | |
| 
 | |
|             Average = _sampleAccumulator / _writtenSamples;
 | |
| 
 | |
|             /* If samples are full then drop off
 | |
|             * the oldest sample. This will always be
 | |
|             * the one just after written. The entry isn't
 | |
|             * actually removed from the array but will
 | |
|             * be overwritten next sample. */
 | |
|             if (_writtenSamples >= _samples.Length)
 | |
|                 _sampleAccumulator -= _samples[_writeIndex];
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |