PerformanceStatistics.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Diagnostics;
  2. using System.Timers;
  3. namespace Ryujinx.Core
  4. {
  5. public class PerformanceStatistics
  6. {
  7. Stopwatch ExecutionTime = new Stopwatch();
  8. Timer ResetTimer = new Timer(1000);
  9. long CurrentGameFrameEnded;
  10. long CurrentSystemFrameEnded;
  11. long CurrentSystemFrameStart;
  12. long LastGameFrameEnded;
  13. long LastSystemFrameEnded;
  14. double AccumulatedGameFrameTime;
  15. double AccumulatedSystemFrameTime;
  16. double CurrentGameFrameTime;
  17. double CurrentSystemFrameTime;
  18. double PreviousGameFrameTime;
  19. double PreviousSystemFrameTime;
  20. public double GameFrameRate { get; private set; }
  21. public double SystemFrameRate { get; private set; }
  22. public long SystemFramesRendered;
  23. public long GameFramesRendered;
  24. public long ElapsedMilliseconds => ExecutionTime.ElapsedMilliseconds;
  25. public long ElapsedMicroseconds => (long)
  26. (((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000);
  27. public long ElapsedNanoseconds => (long)
  28. (((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000000);
  29. public PerformanceStatistics()
  30. {
  31. ExecutionTime.Start();
  32. ResetTimer.Elapsed += ResetTimerElapsed;
  33. ResetTimer.AutoReset = true;
  34. ResetTimer.Start();
  35. }
  36. private void ResetTimerElapsed(object sender, ElapsedEventArgs e)
  37. {
  38. ResetStatistics();
  39. }
  40. public void StartSystemFrame()
  41. {
  42. PreviousSystemFrameTime = CurrentSystemFrameTime;
  43. LastSystemFrameEnded = CurrentSystemFrameEnded;
  44. CurrentSystemFrameStart = ElapsedMicroseconds;
  45. }
  46. public void EndSystemFrame()
  47. {
  48. CurrentSystemFrameEnded = ElapsedMicroseconds;
  49. CurrentSystemFrameTime = CurrentSystemFrameEnded - CurrentSystemFrameStart;
  50. AccumulatedSystemFrameTime += CurrentSystemFrameTime;
  51. SystemFramesRendered++;
  52. }
  53. public void RecordGameFrameTime()
  54. {
  55. CurrentGameFrameEnded = ElapsedMicroseconds;
  56. CurrentGameFrameTime = CurrentGameFrameEnded - LastGameFrameEnded;
  57. PreviousGameFrameTime = CurrentGameFrameTime;
  58. LastGameFrameEnded = CurrentGameFrameEnded;
  59. AccumulatedGameFrameTime += CurrentGameFrameTime;
  60. GameFramesRendered++;
  61. }
  62. public void ResetStatistics()
  63. {
  64. GameFrameRate = 1000 / ((AccumulatedGameFrameTime / GameFramesRendered) / 1000);
  65. GameFrameRate = double.IsNaN(GameFrameRate) ? 0 : GameFrameRate;
  66. SystemFrameRate = 1000 / ((AccumulatedSystemFrameTime / SystemFramesRendered) / 1000);
  67. SystemFrameRate = double.IsNaN(SystemFrameRate) ? 0 : SystemFrameRate;
  68. GameFramesRendered = 0;
  69. SystemFramesRendered = 0;
  70. AccumulatedGameFrameTime = 0;
  71. AccumulatedSystemFrameTime = 0;
  72. }
  73. }
  74. }