用 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));
由于我对时间等问题的经验很少,所以在进行下一步之前,我想问问你们。
我目前正在使用 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));