+
+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;
+}
+