C++ 标准::计时不同结果-固定时间步长循环
谁能帮我找出区别在哪里?因为第一个代码:C++ 标准::计时不同结果-固定时间步长循环,c++,chrono,game-loop,C++,Chrono,Game Loop,谁能帮我找出区别在哪里?因为第一个代码: #include <iostream> #include <chrono> #include <ratio> using namespace std::chrono; const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(
#include <iostream>
#include <chrono>
#include <ratio>
using namespace std::chrono;
const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1));
nanoseconds accumulator(0);
nanoseconds counter(0);
steady_clock::time_point begin;
int i = 0;
int main()
{
while(true)
{
begin = steady_clock::now();
while(accumulator >= timePerFrame)
{
accumulator -= timePerFrame;
++i;
}
accumulator += steady_clock::now() - begin;
counter += steady_clock::now() - begin;
if(counter >= seconds(1))
{
std::cout << i << std::endl;
break;
}
}
}
#包括
#包括
#包括
使用名称空间std::chrono;
const纳秒timePerFrame=持续时间(持续时间(1));
纳秒累加器(0);
纳秒计数器(0);
稳定时钟:时间点开始;
int i=0;
int main()
{
while(true)
{
开始=稳定的时钟::现在();
while(累加器>=时间性能帧)
{
累加器-=时间性能帧;
++一,;
}
累加器+=稳定时钟::现在()-开始;
计数器+=稳定时钟::现在()-开始;
如果(计数器>=秒(1))
{
标准::cout=秒(1))
{
区别在于这里
accumulator += steady_clock::now() - begin;
counter += steady_clock::now() - begin;
now()
的两个实例返回两个不同的值,因此计数器
将不会与累加器
同步,下一个if条件将比
end = steady_clock::now();
accumulator += end - begin;
counter += end - begin;
因为这里,累加器
和计数器
的增量相同
您可以通过将两条语句的顺序更改为
counter += steady_clock::now() - begin;
accumulator += steady_clock::now() - begin;
这将产生相当不可预测的产出
为了使代码更具可读性,我将这样编写:
auto delta = end - begin;
accumulator += delta;
counter += delta;
避免多次键入完全相同的内容总是很好的。在这种情况下,它们的增量是否相同真的很重要,所以为什么不在代码中显式显示呢
TL;DR稳定时钟::现在()
与结束=稳定时钟::现在()
是“相同的”,但是稳定时钟::现在()
在你调用两次时不会返回相同的值。我忽略了它。谢谢你的快速回答。现在一切都清楚了。:)
auto delta = end - begin;
accumulator += delta;
counter += delta;