]> git.localhorst.tv Git - blank.git/commitdiff
collect timing information
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 23 Jul 2015 11:42:28 +0000 (13:42 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 23 Jul 2015 15:28:41 +0000 (17:28 +0200)
src/app/Application.hpp
src/app/FrameCounter.hpp [new file with mode: 0644]
src/app/app.cpp

index ea7421161b9031e45aa9f54d78bff38c5be6db73..97cac73805b5ddad01c194e2f22d023830869d36 100644 (file)
@@ -2,6 +2,7 @@
 #define BLANK_APP_APPLICATION_HPP_
 
 #include "Assets.hpp"
+#include "FrameCounter.hpp"
 #include "init.hpp"
 #include "RandomWalk.hpp"
 #include "../graphics/BlendedSprite.hpp"
@@ -64,6 +65,7 @@ private:
        GLContext ctx;
        InitGLEW init_glew;
        Assets assets;
+       FrameCounter counter;
 
        BlockLighting chunk_prog;
        DirectionalLighting entity_prog;
diff --git a/src/app/FrameCounter.hpp b/src/app/FrameCounter.hpp
new file mode 100644 (file)
index 0000000..069f622
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef BLANK_APP_FRAMECOUNTER_HPP_
+#define BLANK_APP_FRAMECOUNTER_HPP_
+
+#include <iosfwd>
+#include <SDL.h>
+
+
+namespace blank {
+
+class FrameCounter {
+
+public:
+       void EnterFrame() noexcept;
+       void EnterHandle() noexcept;
+       void ExitHandle() noexcept;
+       void EnterUpdate() noexcept;
+       void ExitUpdate() noexcept;
+       void EnterRender() noexcept;
+       void ExitRender() noexcept;
+       void ExitFrame() noexcept;
+
+       float AvgHandle() const noexcept { return avg.handle; }
+       float AvgUpdate() const noexcept { return avg.update; }
+       float AvgRender() const noexcept { return avg.render; }
+       float AvgFrame() const noexcept { return avg.total; }
+       float AvgRunning() const noexcept { return avg.handle + avg.update + avg.render; }
+       float AvgWaiting() const noexcept { return avg.total - AvgRunning(); }
+
+       bool Changed() const noexcept { return changed; }
+
+       void Print(std::ostream &) const;
+
+private:
+       int Tick() noexcept;
+
+private:
+       static constexpr int NUM_FRAMES = 32;
+       static constexpr float factor = 1.0f / float(NUM_FRAMES);
+
+       template<class T>
+       struct Frame {
+               T handle = T(0);
+               T update = T(0);
+               T render = T(0);
+               T total = T(0);
+       };
+
+       Uint32 last_enter = 0;
+       Uint32 last_tick = 0;
+
+       int cur_frame = 0;
+       Frame<int> running = Frame<int>{};
+       Frame<float> avg = Frame<float>{};
+       bool changed = false;
+
+};
+
+}
+
+#endif
index 9e83cd416b229cb18fce4c4f40ec94b38d678c3f..5c068a45bc15419fa9be74a5c9af36c8d51607f1 100644 (file)
@@ -1,5 +1,6 @@
 #include "Application.hpp"
 #include "Assets.hpp"
+#include "FrameCounter.hpp"
 
 #include "../graphics/Font.hpp"
 #include "../world/BlockType.hpp"
@@ -34,6 +35,7 @@ Application::Application(const Config &config)
 , ctx(window.CreateContext())
 , init_glew()
 , assets(get_asset_path())
+, counter()
 , chunk_prog()
 , entity_prog()
 , sprite_prog()
@@ -102,13 +104,16 @@ void Application::Run() {
 }
 
 void Application::Loop(int dt) {
+       counter.EnterFrame();
        HandleEvents();
        Update(dt);
        Render();
+       counter.ExitFrame();
 }
 
 
 void Application::HandleEvents() {
+       counter.EnterHandle();
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
                switch (event.type) {
@@ -140,6 +145,7 @@ void Application::HandleEvents() {
                                break;
                }
        }
+       counter.ExitHandle();
 }
 
 void Application::Handle(const SDL_WindowEvent &event) {
@@ -161,13 +167,18 @@ void Application::Handle(const SDL_WindowEvent &event) {
 }
 
 void Application::Update(int dt) {
+       counter.EnterUpdate();
        interface.Update(dt);
        test_controller.Update(dt);
        world.Update(dt);
+       counter.ExitUpdate();
 }
 
 void Application::Render() {
+       // gl implementation may (and will probably) delay vsync blocking until
+       // the first write after flipping, which is this clear call
        GLContext::Clear();
+       counter.EnterRender();
 
        chunk_prog.SetProjection(cam.Projection());
        entity_prog.SetProjection(cam.Projection());
@@ -176,6 +187,7 @@ void Application::Render() {
 
        interface.Render(entity_prog, sprite_prog);
 
+       counter.ExitRender();
        window.Flip();
 }
 
@@ -190,4 +202,68 @@ Font Assets::LoadFont(const string &name, int size) const {
        return Font(full.c_str(), size);
 }
 
+
+void FrameCounter::EnterFrame() noexcept {
+       last_enter = SDL_GetTicks();
+       last_tick = last_enter;
+}
+
+void FrameCounter::EnterHandle() noexcept {
+       Tick();
+}
+
+void FrameCounter::ExitHandle() noexcept {
+       running.handle += Tick();
+}
+
+void FrameCounter::EnterUpdate() noexcept {
+       Tick();
+}
+
+void FrameCounter::ExitUpdate() noexcept {
+       running.update += Tick();
+}
+
+void FrameCounter::EnterRender() noexcept {
+       Tick();
+}
+
+void FrameCounter::ExitRender() noexcept {
+       running.render += Tick();
+}
+
+void FrameCounter::ExitFrame() noexcept {
+       Uint32 now = SDL_GetTicks();
+       running.total += now - last_enter;
+       ++cur_frame;
+       if (cur_frame >= NUM_FRAMES) {
+               avg.handle = running.handle * factor;
+               avg.update = running.update * factor;
+               avg.render = running.render * factor;
+               avg.total = running.total * factor;
+               running = Frame<int>{};
+               cur_frame = 0;
+               changed = true;
+       } else {
+               changed = false;
+       }
+}
+
+int FrameCounter::Tick() noexcept {
+       Uint32 now = SDL_GetTicks();
+       int delta = now - last_tick;
+       last_tick = now;
+       return delta;
+}
+
+void FrameCounter::Print(std::ostream &out) const {
+       out << "frame:     " << AvgFrame() << std::endl;
+       out << "  handle:  " << AvgHandle() << std::endl;
+       out << "  update:  " << AvgUpdate() << std::endl;
+       out << "  render:  " << AvgRender() << std::endl;
+       out << "  running: " << AvgRunning() << std::endl;
+       out << "  waiting: " << AvgWaiting() << std::endl;
+       out << std::endl;
+}
+
 }