Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
6.5KB

  1. using System;
  2. using System.Collections.Generic;
  3. //This profiler is based on the Entitas Visual Debugging tool
  4. //https://github.com/sschmid/Entitas-CSharp
  5. namespace Svelto.ECS.Profiler
  6. {
  7. public sealed class EngineInfo
  8. {
  9. enum UpdateType
  10. {
  11. Update = 0,
  12. LateUpdate = 1,
  13. FixedUpdate = 2,
  14. }
  15. readonly IEngine _engine;
  16. readonly string _engineName;
  17. readonly Type _engineType;
  18. const int NUM_UPDATE_TYPES = 3;
  19. const int NUM_FRAMES_TO_AVERAGE = 10;
  20. //use a queue to averave out the last 30 frames
  21. Queue<double>[] _updateFrameTimes = new Queue<double>[NUM_UPDATE_TYPES];
  22. readonly double[] _accumulatedUpdateDuration = new double[NUM_UPDATE_TYPES];
  23. readonly double[] _lastUpdateDuration = new double[NUM_UPDATE_TYPES];
  24. readonly double[] _minUpdateDuration = new double[NUM_UPDATE_TYPES];
  25. readonly double[] _maxUpdateDuration = new double[NUM_UPDATE_TYPES];
  26. double _accumulatedAddDuration;
  27. double _minAddDuration;
  28. double _maxAddDuration;
  29. int _entityViewsAddedCount;
  30. double _accumulatedRemoveDuration;
  31. double _minRemoveDuration;
  32. double _maxRemoveDuration;
  33. int _entityViewsRemovedCount;
  34. public IEngine engine { get { return _engine; } }
  35. public string engineName { get { return _engineName; } }
  36. public Type engineType { get { return _engineType; } }
  37. public double lastUpdateDuration { get { return _lastUpdateDuration[(int) UpdateType.Update]; } }
  38. public double lastFixedUpdateDuration { get { return _lastUpdateDuration[(int)UpdateType.LateUpdate]; } }
  39. public double lastLateUpdateDuration { get { return _lastUpdateDuration[(int)UpdateType.FixedUpdate]; } }
  40. public double minAddDuration { get { return _minAddDuration; } }
  41. public double minRemoveDuration { get { return _minRemoveDuration; } }
  42. public double minUpdateDuration { get { return _minUpdateDuration[(int)UpdateType.Update]; } }
  43. public double maxAddDuration { get { return _maxAddDuration; } }
  44. public double maxRemoveDuration { get { return _maxRemoveDuration; } }
  45. public double maxUpdateDuration { get { return _maxUpdateDuration[(int)UpdateType.Update]; } }
  46. public double averageAddDuration { get { return _entityViewsAddedCount == 0 ? 0 : _accumulatedAddDuration / _entityViewsAddedCount; } }
  47. public double averageRemoveDuration { get { return _entityViewsRemovedCount == 0 ? 0 : _accumulatedRemoveDuration / _entityViewsRemovedCount; } }
  48. public double averageUpdateDuration { get { return _updateFrameTimes[(int)UpdateType.Update].Count == 0 ? 0 : _accumulatedUpdateDuration[(int)UpdateType.Update] / _updateFrameTimes[(int)UpdateType.Update].Count; } }
  49. public double averageLateUpdateDuration { get { return _updateFrameTimes[(int)UpdateType.LateUpdate].Count == 0 ? 0 : _accumulatedUpdateDuration[(int)UpdateType.LateUpdate] / _updateFrameTimes[(int)UpdateType.LateUpdate].Count; } }
  50. public double averageFixedUpdateDuration { get { return _updateFrameTimes[(int)UpdateType.FixedUpdate].Count == 0 ? 0 : _accumulatedUpdateDuration[(int)UpdateType.FixedUpdate] / _updateFrameTimes[(int)UpdateType.FixedUpdate].Count; } }
  51. public EngineInfo(IEngine engine)
  52. {
  53. _engine = engine;
  54. _engineName = _engine.ToString();
  55. int foundNamespace = _engineName.LastIndexOf(".");
  56. _engineName = _engineName.Remove(0, foundNamespace + 1);
  57. _engineType = engine.GetType();
  58. for (int i = 0; i < NUM_UPDATE_TYPES; i++)
  59. {
  60. _updateFrameTimes[i] = new Queue<double>();
  61. }
  62. ResetDurations();
  63. }
  64. public void AddUpdateDuration(double updateDuration)
  65. {
  66. AddUpdateDurationForType(updateDuration, (int)UpdateType.Update);
  67. }
  68. public void AddLateUpdateDuration(double updateDuration)
  69. {
  70. AddUpdateDurationForType(updateDuration, (int)UpdateType.LateUpdate);
  71. }
  72. public void AddFixedUpdateDuration(double updateDuration)
  73. {
  74. AddUpdateDurationForType(updateDuration, (int)UpdateType.FixedUpdate);
  75. }
  76. void AddUpdateDurationForType(double updateDuration, int updateType)
  77. {
  78. if (updateDuration < _minUpdateDuration[updateType] || _minUpdateDuration[updateType] == 0)
  79. {
  80. _minUpdateDuration[updateType] = updateDuration;
  81. }
  82. if (updateDuration > _maxUpdateDuration[updateType])
  83. {
  84. _maxUpdateDuration[updateType] = updateDuration;
  85. }
  86. if (_updateFrameTimes[updateType].Count == NUM_FRAMES_TO_AVERAGE)
  87. {
  88. _accumulatedUpdateDuration[updateType] -= _updateFrameTimes[updateType].Dequeue();
  89. }
  90. _accumulatedUpdateDuration[updateType] += updateDuration;
  91. _updateFrameTimes[updateType].Enqueue(updateDuration);
  92. _lastUpdateDuration[updateType] = updateDuration;
  93. }
  94. public void AddAddDuration(double duration)
  95. {
  96. if (duration < _minAddDuration || _minAddDuration == 0)
  97. {
  98. _minAddDuration = duration;
  99. }
  100. if (duration > _maxAddDuration)
  101. {
  102. _maxAddDuration = duration;
  103. }
  104. _accumulatedAddDuration += duration;
  105. _entityViewsAddedCount += 1;
  106. }
  107. public void AddRemoveDuration(double duration)
  108. {
  109. if (duration < _minRemoveDuration || _minRemoveDuration == 0)
  110. {
  111. _minRemoveDuration = duration;
  112. }
  113. if (duration > _maxRemoveDuration)
  114. {
  115. _maxRemoveDuration = duration;
  116. }
  117. _accumulatedRemoveDuration += duration;
  118. _entityViewsRemovedCount += 1;
  119. }
  120. public void ResetDurations()
  121. {
  122. for (int i = 0; i < NUM_UPDATE_TYPES; i++)
  123. {
  124. _accumulatedUpdateDuration[i] = 0;
  125. _minUpdateDuration[i] = 0;
  126. _maxUpdateDuration[i] = 0;
  127. _updateFrameTimes[i].Clear();
  128. }
  129. _accumulatedAddDuration = 0;
  130. _minAddDuration = 0;
  131. _maxAddDuration = 0;
  132. _entityViewsAddedCount = 0;
  133. _accumulatedRemoveDuration = 0;
  134. _minRemoveDuration = 0;
  135. _maxRemoveDuration = 0;
  136. _entityViewsRemovedCount = 0;
  137. }
  138. }
  139. }