본문 바로가기

카테고리 없음

Game Loop Frame Limit DeltaSec Control

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(), 100100, 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정도 자리까지 줄어든다.