forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			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];
 | 
						|
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
} |