由于我在时间等方面的经验很少,所以在下一步之前我想问你们
我目前正在编写一个带SDL的游戏引擎,并使用函数SDL_GetTicks()
来计算GameLoop中的deltaTime。
由于我需要一个计时器功能来控制资产的生命周期(我想从缓存中删除资产,当它没有被使用了一段特定的时间)我找了一些方法来实现它。 />
我发现<chrono>
标头适合该任务,但记得我已经在内部使用SDL_GetTicks()
作为deltaTime。
对我来说,听起来使用两个不同的计时器可能会导致一些问题
有什么我应该注意的,或者只是坚持SDL_GetTicks()
所有时间问题?
答案 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;
}