【发布时间】:2021-10-17 05:06:01
【问题描述】:
我想在 c++ 中暂停执行时间,这是我得到的代码:
while (_run)
{
//pause code
std::this_thread::sleep_for(std::chrono::nanoseconds(_interval_ns));
//doing stuff
_counter++;
(*_mainSrcTick)(GetDeltaTime(), GetName());
for (auto obj : _physicsList)
{
PyObject_CallMethod(obj, "PhysicsTick", "(d)", GetDeltaTime());
}
//used to mesure time
LastTick = std::chrono::high_resolution_clock::now();
}
以防万一这是我的增量时间函数,它可以获取自上次滴答以来我的间隔已经过去了多少:
double difference = std::chrono::duration<double,std::nano>(std::chrono::high_resolution_clock::now() - LastTick).count();
double result = difference/_interval_ns ;
return result;
我遇到的问题是,通过不暂停显然我的代码可以在我们几个人中运行,并且暂停一点时间甚至需要几毫秒。因此,我想要一种不会对我的程序造成太大影响的暂停方式。
在你想知道我确实知道如何使用“使用命名空间”之前,这个项目在 x64 上运行(虽然我不介意它是否也可以在 x86 上运行),将 python 与 c++ 链接,并且是多线程的,虽然在仅限蟒蛇方面。所以我认为我需要一种更快的方法来暂停或至少暂停一段时间,以便它可以通过 while 循环暂停。我不想要 ANY 第三方依赖项。我使用 VS 2019。
目的是让事情以每个_interval_ns 的固定频率发生。 GetDeltaTime 是这样的,所以我可以对 dostuff 给出任何不准确之处,但如果频率准确而不是 delta 时间会更好。我正在寻找微秒精度,nano 会很好。
【问题讨论】:
-
_interval_ns的值是多少? -
取决于但通常为 1 000 000
-
如果您的 CPU 支持,请使用 felixcloutier.com/x86/umwait
-
时间延迟的预期目的是什么?示例代码让我怀疑您想要某种
next_time = get_monotomic_counter() + my_delay; while(true) { do_stuff(); delay_until_monotomic_counter(next_time); next_time += my_delay; },以便do_stuff()以固定频率(例如每秒60 次)发生,即使do_stuff()花费未知/可变的时间。 -
是的,我需要“做事”以固定频率发生,并且我想要某种控制频率的方法。这个:
next_time = get_monotomic_counter() + my_delay; while(true) { do_stuff(); delay_until_monotomic_counter(next_time); next_time += my_delay; }可以很好地实现一些方法,但thread::sleep_until太慢了。
标签: c++ performance time