Noa*_*rik 3 c++ timing gameboy c++-chrono c++17
我正在我的 github 上开发 DMG-01(又名 gameboy 1989)的实现。我已经实现了 APU 和 PPU,并且在我的电脑(以及我朋友的电脑)上实现了(几乎)完美的计时。然而,当我在我朋友的一台电脑上运行模拟器时,它的运行速度是我或我其他朋友的两倍。
同步时钟(Gameboy 和运行它的电脑之间)的代码如下:
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)};
};
Run Code Online (Sandbox Code Playgroud)
时钟.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);
}
Run Code Online (Sandbox Code Playgroud)
在 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();
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,计时是否会在其他计算机上以不同的方式受到影响?时间是绝对的,我明白为什么在一台电脑上,运行模拟器会更慢,但为什么更快呢?我检查了时钟的类型(high_resolution_clock),但我不明白为什么会出现这种情况。谢谢!
我认为您可能会在<chrono>.
表达方式:
clock::now() + one_clock_period
Run Code Online (Sandbox Code Playgroud)
是有问题的。 clock是high_resolution_clock,并且通常有nanoseconds分辨率。 one_clock_period单位为1/4'194'304. 结果表达式将是 atime_point和 a periodof 1/8'192'000'000'000。
使用有符号 64 位整数类型,max()这样的精度略高于 13 天。因此,如果clock::now()返回.time_since_epoch()大于 13 天,_last_tick就会溢出,并且有时可能为负值(取决于clock::now()超出 13 天的量)。
要纠正,请尝试立即转换one_clock_period为精度clock:
static constexpr clock::duration one_clock_period{
std::chrono::duration_cast<clock::duration>(lr35902_clock_period{1})};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |