| | 1 | | namespace DCL.FPSDisplay |
| | 2 | | { |
| | 3 | | public class LinealBufferHiccupCounter |
| | 4 | | { |
| | 5 | | private readonly LinealBufferFPSCounter counter; |
| | 6 | |
|
| 9541 | 7 | | public int HiccupsCountInBuffer { get; private set; } |
| 9540 | 8 | | public float HiccupsSum { get; private set; } |
| 14405 | 9 | | public float TotalSeconds { get; private set; } |
| | 10 | |
|
| 3 | 11 | | public LinealBufferHiccupCounter(int bufferSize) |
| | 12 | | { |
| 3 | 13 | | counter = new LinealBufferFPSCounter(bufferSize); |
| 3 | 14 | | } |
| | 15 | |
|
| | 16 | | public void AddDeltaTime(float valueInSeconds) |
| | 17 | | { |
| 3601 | 18 | | if (IsHiccup(counter.Values[counter.Tail])) |
| | 19 | | { |
| 1436 | 20 | | HiccupsCountInBuffer -= 1; |
| 1436 | 21 | | HiccupsSum -= counter.Values[counter.Tail]; |
| | 22 | | } |
| | 23 | |
|
| 3601 | 24 | | if (IsHiccup(valueInSeconds)) |
| | 25 | | { |
| 3333 | 26 | | HiccupsCountInBuffer += 1; |
| 3333 | 27 | | HiccupsSum += valueInSeconds; |
| | 28 | | } |
| | 29 | |
|
| 3601 | 30 | | TotalSeconds -= counter.Values[counter.Tail]; |
| 3601 | 31 | | TotalSeconds += valueInSeconds; |
| | 32 | |
|
| 3601 | 33 | | counter.AddDeltaTime(valueInSeconds); |
| 3601 | 34 | | } |
| | 35 | |
|
| | 36 | | public static bool IsHiccup(float value) => |
| 7202 | 37 | | value > FPSEvaluation.HICCUP_THRESHOLD_IN_SECONDS; |
| | 38 | |
|
| | 39 | | private class LinealBufferFPSCounter |
| | 40 | | { |
| | 41 | | public readonly float[] Values; |
| | 42 | | private readonly int maxBufferSize; |
| | 43 | |
|
| | 44 | | private int head; |
| | 45 | | private float secondsBetweenHeadAndTail; |
| | 46 | |
|
| 19441 | 47 | | public int Tail { get; private set; } |
| | 48 | |
|
| 3 | 49 | | public LinealBufferFPSCounter(int bufferSize) |
| | 50 | | { |
| 3 | 51 | | Values = new float[bufferSize]; |
| 3 | 52 | | maxBufferSize = bufferSize; |
| 3 | 53 | | } |
| | 54 | |
|
| | 55 | | public void AddDeltaTime(float valueInSeconds) |
| | 56 | | { |
| 3601 | 57 | | Values[Tail] = valueInSeconds; |
| | 58 | |
|
| 3601 | 59 | | Tail = CircularIncrement(Tail); |
| | 60 | |
|
| 3601 | 61 | | AdjustHeadPosition(valueInSeconds); |
| 3601 | 62 | | } |
| | 63 | |
|
| | 64 | | private void AdjustHeadPosition(float valueInSeconds) |
| | 65 | | { |
| 3601 | 66 | | secondsBetweenHeadAndTail += valueInSeconds; |
| 7103 | 67 | | while (secondsBetweenHeadAndTail > 1) |
| | 68 | | { |
| 3502 | 69 | | secondsBetweenHeadAndTail -= Values[head]; |
| 3502 | 70 | | head = CircularIncrement(head); |
| | 71 | | } |
| 3601 | 72 | | } |
| | 73 | |
|
| | 74 | | private int CircularIncrement(int id) => |
| 7103 | 75 | | id == maxBufferSize - 1 ? 0 : id + 1; |
| | 76 | | } |
| | 77 | | } |
| | 78 | | } |