1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
namespace setup::time {
using MiliSec = std::chrono::duration<float, std::milli>;
static constexpr float_t FPS = 60.f;
template<typename TimeTy = MiliSec>
static constexpr TimeTy TimeUnit = TimeTy(1000.f);
static constexpr float_t Milisec = TimeUnit<MiliSec>.count();
static const MiliSec FramePerSecond = TimeUnit<MiliSec> / FPS;
}
using MiliSec = setup::time::MiliSec;
const MiliSec TimeUnit = setup::time::TimeUnit<MiliSec>;
const float_t Milisec = setup::time::Milisec;
const MiliSec FramePerSecond = setup::time::FramePerSecond;
MiliSec Delta;
std::chrono::time_point<std::chrono::system_clock> prev_time{ std::chrono::system_clock::now() };
std::chrono::time_point<std::chrono::system_clock> current_time { std::chrono::system_clock::now()};
// slowly.... faster....
float_t timeScale{ 1.f };
inline auto DeltaTime()const& noexcept {
return (Delta.count() / Milisec) * timeScale ;
}
bool Update() & noexcept;;
bool Time::Update() & noexcept {
while (true) {
current_time = std::chrono::system_clock::now();
Delta = std::chrono::duration_cast<MiliSec>(current_time - prev_time);
if (Delta >= FramePerSecond) {
// Delta - FramePerSecond; 짜투리 시간
prev_time = current_time;
auto hdc = window::get_hdc().lock();
auto delta_print = window::format_text("Delta Time : ", Delta.count());
TextOut(hdc.get(), 100, 100, delta_print.c_str(), delta_print.size());
break;
}
else {
// 프레임 제한에 의해 다음 처리까지 남은 시간동안 재운다.
std::this_thread::sleep_for((prev_time + Delta) - current_time);
}
}
return true;
}
|
cs |
스레드를 안재우고 while 에서 폴링시키거나 계산 안하고 1ms 정도씩 재우면 DeltaTime 오차범위가 16ms ~ 18ms 정도나온다.
prev_time + Delta - current time 으로 계산해서 재워주면 오차범위 소숫점 3~4정도 자리까지 줄어든다.