用 C++ 写一个定时器 class

Writing a Timer class in c++

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

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

P.S:如果这属于 "Game Development" 部分,我深表歉意,但我认为这是一个一般性问题

听起来 std::chrono 通常对您有用,除非您不能将 if 用于滴答计数,因为您使用 SDL_GetTicks() 来获取该信息。那你为什么不能只使用 std::chrono::duration 和那个函数的结果呢?

For me it sounds like using two different timers could cause some problems. Is there anything I should watch out for, or simply just stick with SDL_GetTicks() for all timing issues?

除非我遗漏了什么,否则使用 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;
}

如果对你有帮助(我真的不知道),你可以通过围绕它构建自定义时钟将 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
}

现在您可以像使用 std::chrono::steady_clock 一样使用 GetTicks_clock。这为您提供了一个类型安全的计时基础设施(持续时间和 time_points),所有这些都基于您现有的 SDL_GetTicks()。您甚至可以使用自定义时钟睡觉或等待:

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