用c ++编写Timer类

时间:2015-04-05 16:24:06

标签: c++ timer sdl chrono

由于我在时间等方面的经验很少,所以在下一步之前我想问你们 我目前正在编写一个带SDL的游戏引擎,并使用函数SDL_GetTicks()来计算GameLoop中的deltaTime。
由于我需要一个计时器功能来控制资产的生命周期(我想从缓存中删除资产,当它没有被使用了一段特定的时间)我找了一些方法来实现它。 /> 我发现<chrono>标头适合该任务,但记得我已经在内部使用SDL_GetTicks()作为deltaTime。

对我来说,听起来使用两个不同的计时器可能会导致一些问题 有什么我应该注意的,或者只是坚持SDL_GetTicks()所有时间问题?

P:如果这属于&#34;游戏开发&#34;我很抱歉部分,但我认为这是一个普遍的问题

2 个答案:

答案 0 :(得分:3)

如果它对您有帮助(我真的不知道),您可以通过围绕它构建一个自定义时钟,将SDL_GetTicks()集成到std::chrono系统中:

#include <chrono>

struct GetTicks_clock
{
    using duration   = std::chrono::milliseconds;
    using rep        = duration::rep;
    using period     = duration::period;
    using time_point = std::chrono::time_point<GetTicks_clock, duration>;
    static const bool is_steady = true;

    static time_point now() noexcept {return time_point(duration(SDL_GetTicks()));}
};

int
main()
{
    auto t0 = GetTicks_clock::now(); // has type GetTicks_clock::time_point
    // do something here
    auto t1 = GetTicks_clock::now(); // has type GetTicks_clock::time_point
    auto delta_ms = t1 - t0;  // has type std::chrono::milliseconds
}

现在,您可以完全按照GetTicks_clock使用std::chrono::steady_clock。这为您提供了基于现有SDL_GetTicks()的类型安全的时序基础结构(持续时间和时间点)。您甚至可以使用自定义时钟睡眠或等待:

std::this_thread::sleep_until(GetTicks_clock::now() + std::chrono::seconds(1));

答案 1 :(得分:0)

听起来std::chrono对您来说通常会起作用,但您不能使用if来计算滴答数,因为您使用SDL_GetTicks()来获取该信息。那么为什么你不能将std::chrono::duration与该函数的结果一起使用?

  

对我而言,听起来使用两个不同的计时器可能会导致一些问题。   有什么我应该注意的,或者只是坚持使用SDL_GetTicks()来解决所有时序问题?

除非我使用std::chrono::duration遗漏某些内容,否则不会涉及超过1个计时器(即,您仍然只使用SDL_GetTicks函数来获取计时)。您只是使用std::chrono::duration来存储SDL_GetTicks返回的结果的表示形式。

实施例

#include <chrono>
#include <iostream>

// This function is only for illustration, I don't know what type
// the real function returns
long long SDL_GetTicks()
{
    return 1234567890;
}

int main()
{
    std::chrono::milliseconds elapsedTime(0);
    elapsedTime += std::chrono::milliseconds(SDL_GetTicks());
    std::cout << elapsedTime.count() << "\n";

    return 0;
}