Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准::计时不同结果-固定时间步长循环_C++_Chrono_Game Loop - Fatal编程技术网

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;