Profile.cs 4.2 KB

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