微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不同计算机上的时钟时序更改

如何解决不同计算机上的时钟时序更改

我正在github上为DMG-01(又名Gameboy 1989)实现。 我已经实现了APU和PPU,并且在我的PC(以及我的朋友的PC)上(几乎)完美的时序。 但是,当我在朋友的一台PC上运行该仿真器时,它的运行速度两次,是我或其他朋友的。

用于同步时钟(在Gameboy和运行它的PC之间)的代码如下:

Clock.h头文件

class Clock
{
// ...
public:
    void Syncclock();

private:
    /* API::LR35902_HZ_CLOCK is 4'194'304 */
    using lr35902_clock_period = std::chrono::duration<int64_t,std::ratio<1,API::LR35902_HZ_CLOCK>>;
    static constexpr lr35902_clock_period one_clock_period{1};
    using clock = std::chrono::high_resolution_clock;

private:
    decltype(clock::Now()) _last_tick{std::chrono::time_point_cast<clock::duration>(clock::Now() + one_clock_period)};
};

Clock.cpp文件

void Clock::Syncclock()
{
    // Sleep until one tick has passed.
    std::this_thread::sleep_until(this->_last_tick);

    // Use time_point_cast to convert (via truncation towards zero) back to
    // the "native" duration of high_resolution_clock
    this->_last_tick = std::chrono::time_point_cast<clock::duration>(this->_last_tick + one_clock_period);
}

哪个在main.cpp中被调用是这样的

int main()
{
    // ...
    while (true)
    {
        // processor.Clock() returns the number of clocks it took for the processor to run the
        // current instruction. We need to sleep this thread for each clock passed.
        for (std::size_t current_clock = processor.Clock(); current_clock > 0; --current_clock)
        {
            clock.Syncclock();
        }
    }
    // ...
}

在这种情况下,为什么计时会在其他计算机上以不同的方式受到影响?时间是绝对的,我会明白为什么在一台PC上运行模拟器会更慢,但是为什么会更快? 我检查了我的时钟类型(high_resolution_clock),但是我不明白为什么会这样。 谢谢!

解决方法

我认为您可能在<chrono>的掩盖下陷入困境。

表达式:

clock::now() + one_clock_period

有问题。 clockhigh_resolution_clock,通常具有nanoseconds分辨率。 one_clock_period的单位为1/4'194'304。结果表达式将是time_pointperiod的{​​{1}}。

使用带符号的64位整数类型,1/8'192'000'000'000的精度只有13天多一点。因此,如果max()返回的clock::now()超过13天,则.time_since_epoch()将会溢出,有时可能是负数(取决于_last_tick超过13天的时间)

要纠正此问题,请尝试立即将clock::now()强制转换为one_clock_period的精度:

clock

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。