From d1dde9459f43ec6d0e11d4c07bee02faaf678397 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 11:01:18 +0200 Subject: [PATCH 1/8] Added FPS counter --- include/Game/FPSCounter.h | 42 +++++++++++++++++++++++++++++++++++++++ include/Game/HUD.h | 4 ++++ 2 files changed, 46 insertions(+) create mode 100644 include/Game/FPSCounter.h diff --git a/include/Game/FPSCounter.h b/include/Game/FPSCounter.h new file mode 100644 index 0000000..6dd4b49 --- /dev/null +++ b/include/Game/FPSCounter.h @@ -0,0 +1,42 @@ +#ifndef GUI_FPSCOUNTER_H__ +#define GUI_FPSCOUNTER_H__ + +#include "GUI/Frame.h" +#include "GUI/NumberFrame.h" + +namespace dd +{ +namespace GUI +{ + +class FPSCounter : public Frame +{ +public: + FPSCounter(Frame* parent, std::string name) + : Frame(parent, name) + { + m_Numbers = new GUI::NumberFrame(this, "FPSCounterNumberFrame"); + } + + virtual void Update(double dt) + { + m_NumFrames++; + m_Accum += dt; + + m_Numbers->SetNumber(1.0/(m_Accum/m_NumFrames)); + if (m_NumFrames % 20) { + //LOG_INFO("FPS: %f", 1.0/(m_Accum/m_NumFrames)); + } + } + +private: + NumberFrame* m_Numbers = nullptr; + + double m_Accum = 0.0; + int m_NumFrames = 0; +}; + +} +} +#endif + diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 2a240b3..30afcf6 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -6,6 +6,7 @@ #include "GUI/NumberFrame.h" #include "Core/EKeyUp.h" #include "Game/EScoreEvent.h" +#include "Game/FPSCounter.h" namespace dd { @@ -31,6 +32,8 @@ public: m_ScoreNumberFrame->X = 15; m_ScoreNumberFrame->Y = 21; + //m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); + EVENT_SUBSCRIBE_MEMBER(m_EScore, &HUD::OnScore); } @@ -38,6 +41,7 @@ private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; + FPSCounter* m_FPSCounter = nullptr; EventRelay m_EScore; From b42a09fce1843cab4b943e6377d1b165839eb9d7 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 11:01:33 +0200 Subject: [PATCH 2/8] Semi-working number frame --- include/GUI/NumberFrame.h | 118 ++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 38 deletions(-) diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index ac51aed..dae825d 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -1,6 +1,8 @@ #ifndef GUI_NUMBERFRAME_H__ #define GUI_NUMBERFRAME_H__ +#include + #include "GUI/TextureFrame.h" namespace dd @@ -26,20 +28,20 @@ public: m_NumberTextures[9] = "Textures/GUI/Numbers/N9.png"; // Create number frame if missing - for (int i = 0; i < 10; i++) { - auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); - frame->SetTexture(m_NumberTextures[0]); - frame->DisableScissor(); - // Position frame based on alignment - if (i > 0) { - frame->X = i * 20; - } - Width += frame->Width; - if (Height < frame->Height) { - Height = frame->Height; - } - m_NumberFrames.push_front(frame); - } +// for (int i = 0; i < 10; i++) { +// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); +// frame->SetTexture(m_NumberTextures[0]); +// frame->DisableScissor(); +// // Position frame based on alignment +// if (i > 0) { +// frame->SetLeft(m_NumberFrames[0]->Right()); +// } +// Width += frame->Width; +// if (Height < frame->Height) { +// Height = frame->Height; +// } +// m_NumberFrames.push_front(frame); +// } SetNumber(0); } @@ -50,41 +52,80 @@ public: m_Number = number; // Clear number textures - //for (auto& frame : m_NumberFrames) { - // frame->SetTexture(""); - //} + for (auto& frame : m_NumberFrames) { + frame->SetTexture(""); + } - //Width = 0; - //Height = 0; + Width = 0; + Height = 0; + + std::string digits = std::to_string(number); + + Width = 0; + Height = 0; + + std::string digits = std::to_string(number); + + + int i = 0; + for (char& c : digits) { + // Create number frame if missing + if (i >= m_NumberFrames.size()) { + auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); + if (i > 0) { + frame->SetLeft(m_NumberFrames[i - 1]->Right()); + } + frame->DisableScissor(); + m_NumberFrames.push_back(frame); + } + + // Update value + std::string texture = "Textures/Core/ErrorTexture.png"; + if (m_CharacterTextures.find(c) != m_CharacterTextures.end()) { + texture = m_CharacterTextures.at(c); + } + m_NumberFrames[i]->SetTexture(m_CharacterTextures.at(c)); + Width += m_NumberFrames[i]->Width; + if (Height < m_NumberFrames[i]->Height) { + Height = m_NumberFrames[i]->Height; + } + + i++; + } int n = 0; do { -// // Create number frame if missing -// if (m_NumberFrames.size() <= n) { -// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); -// frame->DisableScissor(); -// m_NumberFrames.push_front(frame); -// } + // Create number frame if missing + if (m_NumberFrames.size() <= n) { + auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); + frame->DisableScissor(); + m_NumberFrames.push_back(frame); + } + + int digit = number % 10; // Update value - int digit = number % 10; m_NumberFrames[n]->SetTexture(m_NumberTextures[digit]); - //Width += m_NumberFrames[n]->Width; - //if (Height < m_NumberFrames[n]->Height) { - // Height = m_NumberFrames[n]->Height; - //} -// // Position frame based on alignment -// if (n > 0) { -// if (!m_LeftAligned) { -// m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); -// } else { -// m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); -// } -// } + Width += m_NumberFrames[n]->Width; + if (Height < m_NumberFrames[n]->Height) { + Height = m_NumberFrames[n]->Height; + } + // Position frame based on alignment + if (n > 0) { + if (m_LeftAligned) { + m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); + } else { + m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); + } + } + + ss << digit; number /= 10; n++; } while (number > 0); + + LOG_DEBUG("Number: %s", ss.str().c_str()); } void SetLeftAlign() { m_LeftAligned = true; } @@ -100,6 +141,7 @@ private: bool m_LeftAligned = true; std::string m_NumberTextures[10]; + std::unordered_map m_CharacterTextures; std::deque m_NumberFrames; }; From ff27eafccffc7137dec13c9fa1f00d211725fa46 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 13:09:27 +0200 Subject: [PATCH 3/8] WORKING number frame --- include/GUI/NumberFrame.h | 60 +++++++-------------------------------- 1 file changed, 10 insertions(+), 50 deletions(-) diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index dae825d..d1717b1 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -16,16 +16,16 @@ public: NumberFrame(Frame* parent, std::string name) : Frame(parent, name) { - m_NumberTextures[0] = "Textures/GUI/Numbers/N0.png"; - m_NumberTextures[1] = "Textures/GUI/Numbers/N1.png"; - m_NumberTextures[2] = "Textures/GUI/Numbers/N2.png"; - m_NumberTextures[3] = "Textures/GUI/Numbers/N3.png"; - m_NumberTextures[4] = "Textures/GUI/Numbers/N4.png"; - m_NumberTextures[5] = "Textures/GUI/Numbers/N5.png"; - m_NumberTextures[6] = "Textures/GUI/Numbers/N6.png"; - m_NumberTextures[7] = "Textures/GUI/Numbers/N7.png"; - m_NumberTextures[8] = "Textures/GUI/Numbers/N8.png"; - m_NumberTextures[9] = "Textures/GUI/Numbers/N9.png"; + m_CharacterTextures['0'] = "Textures/GUI/Numbers/N0.png"; + m_CharacterTextures['1'] = "Textures/GUI/Numbers/N1.png"; + m_CharacterTextures['2'] = "Textures/GUI/Numbers/N2.png"; + m_CharacterTextures['3'] = "Textures/GUI/Numbers/N3.png"; + m_CharacterTextures['4'] = "Textures/GUI/Numbers/N4.png"; + m_CharacterTextures['5'] = "Textures/GUI/Numbers/N5.png"; + m_CharacterTextures['6'] = "Textures/GUI/Numbers/N6.png"; + m_CharacterTextures['7'] = "Textures/GUI/Numbers/N7.png"; + m_CharacterTextures['8'] = "Textures/GUI/Numbers/N8.png"; + m_CharacterTextures['9'] = "Textures/GUI/Numbers/N9.png"; // Create number frame if missing // for (int i = 0; i < 10; i++) { @@ -61,12 +61,6 @@ public: std::string digits = std::to_string(number); - Width = 0; - Height = 0; - - std::string digits = std::to_string(number); - - int i = 0; for (char& c : digits) { // Create number frame if missing @@ -92,40 +86,6 @@ public: i++; } - - int n = 0; - do { - // Create number frame if missing - if (m_NumberFrames.size() <= n) { - auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); - frame->DisableScissor(); - m_NumberFrames.push_back(frame); - } - - int digit = number % 10; - - // Update value - m_NumberFrames[n]->SetTexture(m_NumberTextures[digit]); - Width += m_NumberFrames[n]->Width; - if (Height < m_NumberFrames[n]->Height) { - Height = m_NumberFrames[n]->Height; - } - // Position frame based on alignment - if (n > 0) { - if (m_LeftAligned) { - m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); - } else { - m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); - } - } - - ss << digit; - - number /= 10; - n++; - } while (number > 0); - - LOG_DEBUG("Number: %s", ss.str().c_str()); } void SetLeftAlign() { m_LeftAligned = true; } From c821fbfc255051d47478c119b17554a65dbd2e5a Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 16:12:53 +0200 Subject: [PATCH 4/8] Futile attempts to fix memory corruption bug --- include/Core/Engine.h | 2 +- include/GUI/NumberFrame.h | 17 ----------------- include/Game/PadSystem.h | 9 ++++++--- src/game/Core/EventBroker.cpp | 5 +++-- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index f7842ed..eedd53a 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -360,7 +360,7 @@ public: // Swap event queues to get fresh input data in the read queue //m_EventBroker->Swap(); - ResourceManager::Update(); + //ResourceManager::Update(); if (m_GameIsRunning) { m_World->Update(dt); } diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h index d1717b1..7241b82 100644 --- a/include/GUI/NumberFrame.h +++ b/include/GUI/NumberFrame.h @@ -27,22 +27,6 @@ public: m_CharacterTextures['8'] = "Textures/GUI/Numbers/N8.png"; m_CharacterTextures['9'] = "Textures/GUI/Numbers/N9.png"; - // Create number frame if missing -// for (int i = 0; i < 10; i++) { -// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); -// frame->SetTexture(m_NumberTextures[0]); -// frame->DisableScissor(); -// // Position frame based on alignment -// if (i > 0) { -// frame->SetLeft(m_NumberFrames[0]->Right()); -// } -// Width += frame->Width; -// if (Height < frame->Height) { -// Height = frame->Height; -// } -// m_NumberFrames.push_front(frame); -// } - SetNumber(0); } @@ -100,7 +84,6 @@ private: int m_Number = 0; bool m_LeftAligned = true; - std::string m_NumberTextures[10]; std::unordered_map m_CharacterTextures; std::deque m_NumberFrames; }; diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 4a53907..549e0f6 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -69,9 +69,12 @@ public: private: EntityID m_Entity = 0; glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); - bool m_Left = false, m_Right = false, m_ReplaceBall = false, m_MultiBall = false; - Components::Transform* m_Transform; - Components::Pad* m_Pad; + bool m_Left = false; + bool m_Right = false; + bool m_ReplaceBall = false; + bool m_MultiBall = false; + Components::Transform* m_Transform = nullptr; + Components::Pad* m_Pad = nullptr; dd::EventRelay m_EKeyDown; dd::EventRelay m_EKeyUp; diff --git a/src/game/Core/EventBroker.cpp b/src/game/Core/EventBroker.cpp index 2c68fd0..c8015c1 100644 --- a/src/game/Core/EventBroker.cpp +++ b/src/game/Core/EventBroker.cpp @@ -68,9 +68,10 @@ int dd::EventBroker::Process(std::string contextTypeName) std::shared_ptr event = pair.second; auto itpair = relays.equal_range(eventTypeName); - for (auto it2 = itpair.first; it2 != itpair.second; ++it2) + for (auto it2 = itpair.first; it2 != itpair.second; it2++) { - auto relay = it2->second; + std::string name = it2->first; + BaseEventRelay* relay = it2->second; relay->Receive(event); eventsProcessed++; } From 45f1d882ad1ac41cc90f417f49dd62295da620b2 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 1 Oct 2015 14:41:55 +0200 Subject: [PATCH 5/8] Adding these two additional frames make the event broker break --- include/Game/HUD.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 30afcf6..5f61bb0 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -25,6 +25,13 @@ public: m_LevelIndicator = new GUI::TextureFrame(this, "HUDLevelIndicator"); m_LevelIndicator->SetTexture("Textures/GUI/HUD/LevelIndicatorBG.png"); + m_A1 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_A1->X = 40; + m_A1->SetNumber(1); + m_A2 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_A2->X = 60; + m_A2->SetNumber(1); + m_ScoreIndicator = new GUI::TextureFrame(this, "HUDScoreIndicator"); m_ScoreIndicator->SetTexture("Textures/GUI/HUD/ScoreIndicatorBG.png"); m_ScoreIndicator->SetRight(Right()); @@ -40,6 +47,8 @@ public: private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; + NumberFrame* m_A1 = nullptr; + NumberFrame* m_A2 = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; FPSCounter* m_FPSCounter = nullptr; From e74f1092c7844190ac67b7fdcf4fe821f8278b81 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 2 Oct 2015 18:12:00 +0200 Subject: [PATCH 6/8] Fixed crash when events were (un)subscribed while events were processing --- include/Core/EventBroker.h | 8 +++++ src/game/Core/EventBroker.cpp | 67 ++++++++++++++++++++++++++--------- src/tests/EventFixture.h | 2 +- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/include/Core/EventBroker.h b/include/Core/EventBroker.h index cb5e39c..ce2a5a4 100644 --- a/include/Core/EventBroker.h +++ b/include/Core/EventBroker.h @@ -24,6 +24,7 @@ #include #include #include +#include #define EVENT_SUBSCRIBE_MEMBER(relay, handler) \ relay = decltype(relay)(std::bind(handler, this, std::placeholders::_1)); \ @@ -123,16 +124,23 @@ public: void Unsubscribe(BaseEventRelay &relay); private: + bool m_IsProcessing = false; + typedef std::string ContextTypeName_t; // typeid(ContextType).name() typedef std::string EventTypeName_t; // typeid(EventType).name() typedef std::unordered_multimap EventRelays_t; typedef std::unordered_map ContextRelays_t; ContextRelays_t m_ContextRelays; + std::vector m_RelaysToSubscribe; + std::vector m_RelaysToUnsubscribe; typedef std::list>> EventQueue_t; std::shared_ptr m_EventQueueRead; std::shared_ptr m_EventQueueWrite; + + void subscribeImmediate(BaseEventRelay& relay); + void unsubscribeImmediate(BaseEventRelay& relay); }; template diff --git a/src/game/Core/EventBroker.cpp b/src/game/Core/EventBroker.cpp index c8015c1..ce91fd9 100644 --- a/src/game/Core/EventBroker.cpp +++ b/src/game/Core/EventBroker.cpp @@ -29,32 +29,26 @@ dd::BaseEventRelay::~BaseEventRelay() void dd::EventBroker::Unsubscribe(BaseEventRelay &relay) // ? { - auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); - if (contextIt == m_ContextRelays.end()) - return; - - auto eventRelays = contextIt->second; - - auto itpair = eventRelays.equal_range(relay.m_EventTypeName); - for (auto it = itpair.first; it != itpair.second; ++it) - { - if (it->second == &relay) - { - relay.m_Broker = nullptr; - eventRelays.erase(it); - break; - } + if (m_IsProcessing) { + m_RelaysToUnsubscribe.push_back(&relay); + } else { + unsubscribeImmediate(relay); } } void dd::EventBroker::Subscribe(BaseEventRelay &relay) { - relay.m_Broker = this; - m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); + if (m_IsProcessing) { + m_RelaysToSubscribe.push_back(&relay); + } else { + subscribeImmediate(relay); + } } int dd::EventBroker::Process(std::string contextTypeName) { + m_IsProcessing = true; + auto it = m_ContextRelays.find(contextTypeName); if (it == m_ContextRelays.end()) return 0; @@ -77,6 +71,20 @@ int dd::EventBroker::Process(std::string contextTypeName) } } + m_IsProcessing = false; + + // Process pending subscriptions + for (auto& r : m_RelaysToSubscribe) { + subscribeImmediate(*r); + } + m_RelaysToSubscribe.clear(); + + // Process pending unsubscriptions + for (auto& r : m_RelaysToUnsubscribe) { + unsubscribeImmediate(*r); + } + m_RelaysToUnsubscribe.clear(); + return eventsProcessed; } @@ -84,4 +92,29 @@ void dd::EventBroker::Swap() { std::swap(m_EventQueueRead, m_EventQueueWrite); m_EventQueueWrite->clear(); + +} + +void dd::EventBroker::subscribeImmediate(dd::BaseEventRelay& relay) +{ + relay.m_Broker = this; + m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); +} + +void dd::EventBroker::unsubscribeImmediate(dd::BaseEventRelay& relay) +{ + auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); + if (contextIt == m_ContextRelays.end()) { + return; + } + + auto eventRelays = contextIt->second; + auto itpair = eventRelays.equal_range(relay.m_EventTypeName); + for (auto it = itpair.first; it != itpair.second; ++it) { + if (it->second == &relay) { + relay.m_Broker = nullptr; + eventRelays.erase(it); + break; + } + } } diff --git a/src/tests/EventFixture.h b/src/tests/EventFixture.h index 1548a08..4f78080 100644 --- a/src/tests/EventFixture.h +++ b/src/tests/EventFixture.h @@ -10,7 +10,7 @@ struct EventFixture EventFixture() { this->EventBroker = new dd::EventBroker(); - m_EEventType = decltype(m_EEventType)(std::bind(&OnEvent, this, std::placeholders::_1)); + m_EEventType = decltype(m_EEventType)(std::bind(&EventFixture::OnEvent, this, std::placeholders::_1)); this->EventBroker->Subscribe(m_EEventType); Run(); Check(); From b38580f468ac0cbc1a644baea576ef9a0d4e534e Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 2 Oct 2015 18:30:36 +0200 Subject: [PATCH 7/8] Area and Stage numbers in the right place --- include/Game/HUD.h | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/include/Game/HUD.h b/include/Game/HUD.h index 5f61bb0..52711e8 100644 --- a/include/Game/HUD.h +++ b/include/Game/HUD.h @@ -25,12 +25,14 @@ public: m_LevelIndicator = new GUI::TextureFrame(this, "HUDLevelIndicator"); m_LevelIndicator->SetTexture("Textures/GUI/HUD/LevelIndicatorBG.png"); - m_A1 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); - m_A1->X = 40; - m_A1->SetNumber(1); - m_A2 = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); - m_A2->X = 60; - m_A2->SetNumber(1); + m_AreaNumberFrame = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_AreaNumberFrame->X = 132; + m_AreaNumberFrame->Y = 19; + m_AreaNumberFrame->SetNumber(6); + m_StageNumberFrame = new GUI::NumberFrame(m_LevelIndicator, "HUDScoreNumberFrameawdawdwa"); + m_StageNumberFrame->X = 165; + m_StageNumberFrame->Y = 19; + m_StageNumberFrame->SetNumber(5); m_ScoreIndicator = new GUI::TextureFrame(this, "HUDScoreIndicator"); m_ScoreIndicator->SetTexture("Textures/GUI/HUD/ScoreIndicatorBG.png"); @@ -39,7 +41,7 @@ public: m_ScoreNumberFrame->X = 15; m_ScoreNumberFrame->Y = 21; - //m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); + m_FPSCounter = new GUI::FPSCounter(this, "FPSCounter"); EVENT_SUBSCRIBE_MEMBER(m_EScore, &HUD::OnScore); } @@ -47,8 +49,8 @@ public: private: TextureFrame* m_LevelIndicator = nullptr; TextureFrame* m_ScoreIndicator = nullptr; - NumberFrame* m_A1 = nullptr; - NumberFrame* m_A2 = nullptr; + NumberFrame* m_AreaNumberFrame = nullptr; + NumberFrame* m_StageNumberFrame = nullptr; NumberFrame* m_ScoreNumberFrame = nullptr; FPSCounter* m_FPSCounter = nullptr; From a8b0631379c206abac892bcec705b51d1c4e1461 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 2 Oct 2015 19:01:08 +0200 Subject: [PATCH 8/8] Improved FPS counter with averaging --- include/Game/FPSCounter.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/include/Game/FPSCounter.h b/include/Game/FPSCounter.h index 6dd4b49..0f7f303 100644 --- a/include/Game/FPSCounter.h +++ b/include/Game/FPSCounter.h @@ -15,25 +15,26 @@ public: FPSCounter(Frame* parent, std::string name) : Frame(parent, name) { + m_FrameTimes.resize(m_MaxSamples); m_Numbers = new GUI::NumberFrame(this, "FPSCounterNumberFrame"); } virtual void Update(double dt) { - m_NumFrames++; - m_Accum += dt; + m_FrameTimes[m_CurrentFrame % m_MaxSamples] = dt; + double sum = std::accumulate(m_FrameTimes.begin(), m_FrameTimes.end(), 0.0); + sum /= std::min(m_CurrentFrame, m_MaxSamples); + m_Numbers->SetNumber(std::round(1.0 / sum)); - m_Numbers->SetNumber(1.0/(m_Accum/m_NumFrames)); - if (m_NumFrames % 20) { - //LOG_INFO("FPS: %f", 1.0/(m_Accum/m_NumFrames)); - } + m_CurrentFrame++; } private: NumberFrame* m_Numbers = nullptr; - double m_Accum = 0.0; - int m_NumFrames = 0; + int m_MaxSamples = 100; + int m_CurrentFrame = 0; + std::vector m_FrameTimes; }; }