Profile.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using Ryujinx.Common;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. namespace Ryujinx.Profiler
  6. {
  7. public static class Profile
  8. {
  9. public static float UpdateRate => _settings.UpdateRate;
  10. public static long HistoryLength => _settings.History;
  11. public static ProfilerKeyboardHandler Controls => _settings.Controls;
  12. private static InternalProfile _profileInstance;
  13. private static ProfilerSettings _settings;
  14. [Conditional("USE_PROFILING")]
  15. public static void Initalize()
  16. {
  17. var config = ProfilerConfiguration.Load("ProfilerConfig.jsonc");
  18. _settings = new ProfilerSettings()
  19. {
  20. Enabled = config.Enabled,
  21. FileDumpEnabled = config.DumpPath != "",
  22. DumpLocation = config.DumpPath,
  23. UpdateRate = (config.UpdateRate <= 0) ? -1 : 1.0f / config.UpdateRate,
  24. History = (long)(config.History * PerformanceCounter.TicksPerSecond),
  25. MaxLevel = config.MaxLevel,
  26. Controls = config.Controls,
  27. MaxFlags = config.MaxFlags,
  28. };
  29. }
  30. public static bool ProfilingEnabled()
  31. {
  32. #if USE_PROFILING
  33. if (!_settings.Enabled)
  34. return false;
  35. if (_profileInstance == null)
  36. _profileInstance = new InternalProfile(_settings.History, _settings.MaxFlags);
  37. return true;
  38. #else
  39. return false;
  40. #endif
  41. }
  42. [Conditional("USE_PROFILING")]
  43. public static void FinishProfiling()
  44. {
  45. if (!ProfilingEnabled())
  46. return;
  47. if (_settings.FileDumpEnabled)
  48. DumpProfile.ToFile(_settings.DumpLocation, _profileInstance);
  49. _profileInstance.Dispose();
  50. }
  51. [Conditional("USE_PROFILING")]
  52. public static void FlagTime(TimingFlagType flagType)
  53. {
  54. if (!ProfilingEnabled())
  55. return;
  56. _profileInstance.FlagTime(flagType);
  57. }
  58. [Conditional("USE_PROFILING")]
  59. public static void RegisterFlagReciever(Action<TimingFlag> reciever)
  60. {
  61. if (!ProfilingEnabled())
  62. return;
  63. _profileInstance.RegisterFlagReciever(reciever);
  64. }
  65. [Conditional("USE_PROFILING")]
  66. public static void Begin(ProfileConfig config)
  67. {
  68. if (!ProfilingEnabled())
  69. return;
  70. if (config.Level > _settings.MaxLevel)
  71. return;
  72. _profileInstance.BeginProfile(config);
  73. }
  74. [Conditional("USE_PROFILING")]
  75. public static void End(ProfileConfig config)
  76. {
  77. if (!ProfilingEnabled())
  78. return;
  79. if (config.Level > _settings.MaxLevel)
  80. return;
  81. _profileInstance.EndProfile(config);
  82. }
  83. public static string GetSession()
  84. {
  85. #if USE_PROFILING
  86. if (!ProfilingEnabled())
  87. return null;
  88. return _profileInstance.GetSession();
  89. #else
  90. return "";
  91. #endif
  92. }
  93. public static List<KeyValuePair<ProfileConfig, TimingInfo>> GetProfilingData()
  94. {
  95. #if USE_PROFILING
  96. if (!ProfilingEnabled())
  97. return new List<KeyValuePair<ProfileConfig, TimingInfo>>();
  98. return _profileInstance.GetProfilingData();
  99. #else
  100. return new List<KeyValuePair<ProfileConfig, TimingInfo>>();
  101. #endif
  102. }
  103. public static TimingFlag[] GetTimingFlags()
  104. {
  105. #if USE_PROFILING
  106. if (!ProfilingEnabled())
  107. return new TimingFlag[0];
  108. return _profileInstance.GetTimingFlags();
  109. #else
  110. return new TimingFlag[0];
  111. #endif
  112. }
  113. public static (long[], long[]) GetTimingAveragesAndLast()
  114. {
  115. #if USE_PROFILING
  116. if (!ProfilingEnabled())
  117. return (new long[0], new long[0]);
  118. return _profileInstance.GetTimingAveragesAndLast();
  119. #else
  120. return (new long[0], new long[0]);
  121. #endif
  122. }
  123. }
  124. }