Browse Source

Stat improvements

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
5e96e26ea1

+ 1 - 1
AnKi/Core/App.cpp

@@ -47,7 +47,7 @@ namespace anki {
 android_app* g_androidApp = nullptr;
 #endif
 
-StatCounter g_cpuTotalTime(StatCategory::kTime, "CPU total", StatFlag::kMilisecond);
+StatCounter g_cpuTotalTime(StatCategory::kTime, "CPU total", StatFlag::kMilisecond | StatFlag::kShowAverage);
 static StatCounter g_cpuAllocatedMem(StatCategory::kCpuMem, "Total", StatFlag::kBytes | StatFlag::kThreadSafe);
 static StatCounter g_cpuAllocationCount(StatCategory::kCpuMem, "Allocations/frame",
 										StatFlag::kBytes | StatFlag::kZeroEveryFrame | StatFlag::kThreadSafe);

+ 14 - 4
AnKi/Core/StatsSet.h

@@ -24,10 +24,11 @@ enum class StatFlag : U16
 	kThreadSafe = 1 << 1,
 	kFloat = 1 << 2,
 
-	kSecond = (1 << 3) | kFloat,
-	kMilisecond = (1 << 4) | kFloat,
-	kNanoSeconds = 1 << 5,
-	kBytes = 1 << 6,
+	kShowAverage = 1 << 3,
+	kSecond = (1 << 4) | kFloat,
+	kMilisecond = (1 << 5) | kFloat,
+	kNanoSeconds = 1 << 6,
+	kBytes = 1 << 7,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(StatFlag)
 
@@ -335,6 +336,15 @@ public:
 	}
 #endif
 
+	U32 getCounterCount() const
+	{
+#if ANKI_STATS_ENABLED
+		return m_statCounterArrSize;
+#else
+		return 0;
+#endif
+	}
+
 private:
 #if ANKI_STATS_ENABLED
 	StatCounter** m_statCounterArr = nullptr;

+ 46 - 1
AnKi/Core/StatsUi.cpp

@@ -14,6 +14,28 @@ namespace anki {
 extern StatCounter g_cpuTotalTime;
 extern StatCounter g_rendererGpuTime;
 
+class StatsUi::Value
+{
+public:
+	F64 m_avg = 0.0;
+	F64 m_rollingAvg = 0.0;
+
+	void update(F64 x, Bool flush)
+	{
+		m_rollingAvg += x / F64(kBufferedFrames);
+
+		if(flush)
+		{
+			m_avg = m_rollingAvg;
+			m_rollingAvg = 0.0;
+		}
+	}
+};
+
+StatsUi::StatsUi()
+{
+}
+
 StatsUi::~StatsUi()
 {
 }
@@ -22,6 +44,11 @@ Error StatsUi::init()
 {
 	ANKI_CHECK(UiManager::getSingleton().newInstance(m_font, "EngineAssets/UbuntuMonoRegular.ttf", Array<U32, 1>{24}));
 
+	if(StatsSet::getSingleton().getCounterCount())
+	{
+		m_averageValues.resize(StatsSet::getSingleton().getCounterCount());
+	}
+
 	return Error::kNone;
 }
 
@@ -62,6 +89,14 @@ void StatsUi::labelBytes(PtrSize val, CString name)
 
 void StatsUi::build(CanvasPtr canvas)
 {
+	Bool flush = false;
+	if(m_bufferedFrames == kBufferedFrames)
+	{
+		flush = true;
+		m_bufferedFrames = 0;
+	}
+	++m_bufferedFrames;
+
 	canvas->pushFont(m_font, 24);
 
 	const Vec4 oldWindowColor = ImGui::GetStyle().Colors[ImGuiCol_WindowBg];
@@ -75,6 +110,7 @@ void StatsUi::build(CanvasPtr canvas)
 		if(m_detail == StatsUiDetail::kDetailed)
 		{
 			StatCategory category = StatCategory::kCount;
+			U32 count = 0;
 			StatsSet::getSingleton().iterateStats(
 				[&](StatCategory c, const Char* name, U64 value, StatFlag flags) {
 					if(category != c)
@@ -91,15 +127,24 @@ void StatsUi::build(CanvasPtr canvas)
 					{
 						ImGui::Text("%s: %zu", name, value);
 					}
+
+					++count;
 				},
-				[&](StatCategory c, const Char* name, F64 value, StatFlag) {
+				[&](StatCategory c, const Char* name, F64 value, StatFlag flags) {
 					if(category != c)
 					{
 						category = c;
 						ImGui::Text("-- %s --", kStatCategoryTexts[c].cstr());
 					}
 
+					if(!!(flags & StatFlag::kShowAverage))
+					{
+						m_averageValues[count].update(value, flush);
+						value = m_averageValues[count].m_avg;
+					}
+
 					ImGui::Text("%s: %f", name, value);
+					++count;
 				});
 		}
 		else

+ 8 - 1
AnKi/Core/StatsUi.h

@@ -26,7 +26,7 @@ enum class StatsUiDetail : U8
 class StatsUi : public UiImmediateModeBuilder
 {
 public:
-	StatsUi() = default;
+	StatsUi();
 
 	~StatsUi();
 
@@ -40,9 +40,16 @@ public:
 	}
 
 private:
+	class Value;
+
+	static constexpr U32 kBufferedFrames = 30;
+
 	FontPtr m_font;
 	StatsUiDetail m_detail = StatsUiDetail::kDetailed;
 
+	CoreDynamicArray<Value> m_averageValues;
+	U32 m_bufferedFrames = 0;
+
 	static void labelTime(Second val, CString name)
 	{
 		ImGui::Text("%s: %fms", name.cstr(), val * 1000.0);

+ 2 - 2
AnKi/Renderer/MainRenderer.cpp

@@ -20,8 +20,8 @@
 
 namespace anki {
 
-static StatCounter g_rendererCpuTime(StatCategory::kTime, "Renderer", StatFlag::kMilisecond);
-StatCounter g_rendererGpuTime(StatCategory::kTime, "GPU frame", StatFlag::kMilisecond);
+static StatCounter g_rendererCpuTime(StatCategory::kTime, "Renderer", StatFlag::kMilisecond | StatFlag::kShowAverage);
+StatCounter g_rendererGpuTime(StatCategory::kTime, "GPU frame", StatFlag::kMilisecond | StatFlag::kShowAverage);
 
 MainRenderer::MainRenderer()
 {

+ 3 - 3
AnKi/Scene/SceneGraph.cpp

@@ -18,9 +18,9 @@
 
 namespace anki {
 
-static StatCounter g_sceneUpdateTime(StatCategory::kTime, "All scene update", StatFlag::kMilisecond);
-static StatCounter g_sceneVisibilityTime(StatCategory::kTime, "Scene visibility", StatFlag::kMilisecond);
-static StatCounter g_scenePhysicsTime(StatCategory::kTime, "Physics", StatFlag::kMilisecond);
+static StatCounter g_sceneUpdateTime(StatCategory::kTime, "All scene update", StatFlag::kMilisecond | StatFlag::kShowAverage);
+static StatCounter g_sceneVisibilityTime(StatCategory::kTime, "Scene visibility", StatFlag::kMilisecond | StatFlag::kShowAverage);
+static StatCounter g_scenePhysicsTime(StatCategory::kTime, "Physics", StatFlag::kMilisecond | StatFlag::kShowAverage);
 
 constexpr U32 kUpdateNodeBatchSize = 10;