MVE - Multi-View Environment mve-devel
Loading...
Searching...
No Matches
frame_timer.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015, Simon Fuhrmann
3 * TU Darmstadt - Graphics, Capture and Massively Parallel Computing
4 * All rights reserved.
5 *
6 * This software may be modified and distributed under the terms
7 * of the BSD 3-Clause license. See the LICENSE.txt file for details.
8 */
9
10#ifndef UTIL_FRAME_TIMER_HEADER
11#define UTIL_FRAME_TIMER_HEADER
12
13#include <ctime>
14
15#include "util/defines.h"
16#include "util/timer.h"
17#include "util/system.h"
18
19#define FRAME_TIMER_BUSY_WAITING 0
20
22
32{
33public:
34 FrameTimer (void);
35
37 void set_max_fps (std::size_t fps);
38
40 std::size_t get_max_fps (void) const;
41
46 float get_time_sec (void) const;
47
52 std::size_t get_time (void) const;
53
55 std::size_t get_frame_count (void) const;
56
58 void next_frame (void);
59
60private:
61 std::size_t now (void) const;
62 std::size_t delay (std::size_t ms) const;
63
64private:
65 std::size_t cur_time; // Current time
66 std::size_t last_time; // Last time
67
68 std::size_t max_fps; // Maximum frames per second
69 std::size_t frame_count; // Amount of calls to nextFrame
70
71 WallTimer timer; // High-resolution timer
72};
73
74/* ---------------------------------------------------------------- */
75
76inline
77FrameTimer::FrameTimer (void)
78{
79 this->cur_time = now();
80 this->last_time = this->cur_time;
81 this->max_fps = 60;
82 this->frame_count = 0;
83}
84
85inline void
86FrameTimer::set_max_fps (std::size_t fps)
87{
88 this->max_fps = fps;
89}
90
91inline std::size_t
92FrameTimer::get_max_fps (void) const
93{
94 return this->max_fps;
95}
96
97inline std::size_t
98FrameTimer::get_time (void) const
99{
100 return this->cur_time;
101}
102
103inline float
104FrameTimer::get_time_sec (void) const
105{
106 return (1.0f / 1000.0f) * (float)this->cur_time;
107}
108
109inline std::size_t
110FrameTimer::get_frame_count (void) const
111{
112 return this->frame_count;
113}
114
115inline void
116FrameTimer::next_frame (void)
117{
118 this->last_time = this->cur_time;
119 this->cur_time = this->now();
120
121 if (this->max_fps != 0)
122 {
123 std::size_t diff = this->cur_time - this->last_time;
124 std::size_t frame_ms = 1000 / this->max_fps;
125
126 if (diff < frame_ms)
127 this->cur_time = delay(frame_ms - diff);
128 }
129
130 this->frame_count += 1;
131}
132
133inline std::size_t
134FrameTimer::now (void) const
135{
136 return this->timer.get_elapsed();
137}
138
139inline std::size_t
140FrameTimer::delay (std::size_t ms) const
141{
142 std::size_t curTime = this->cur_time;
143
144#if FRAME_TIMER_BUSY_WAITING
145 std::size_t endTime = cur_time + ms;
146 while (curTime < endTime)
147 curTime = now();
148#else
149 system::sleep(ms);
150 curTime = now();
151#endif
152
153 return curTime;
154}
155
157
158#endif /* UTIL_FRAME_TIMER_HEADER */
A timer class for frame-based applications.
Definition frame_timer.h:32
Cross-platform high-resolution real-time timer.
Definition timer.h:30
#define UTIL_NAMESPACE_BEGIN
Definition defines.h:13
#define UTIL_NAMESPACE_END
Definition defines.h:14