Я работаю над реализацией DMG-01 (также известного как gameboy 1989) на моем github. Я уже реализовал и APU, и PPU с (почти) идеальной синхронизацией на моем компьютере (и компьютере моих друзей). Однако, когда я запускаю эмулятор на компьютере одного из моих друзей, он работает вдвое быстрее, чем мой или остальных моих друзей.
Код для синхронизации часов (между геймбоем и компьютером, на котором он работает) выглядит следующим образом:
Заголовочный файл 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();
}
}
// ...
}
Есть ли причина, по которой хроно в этом случае будет по-другому влиять на другие компьютеры? Время абсолютно, я бы понял, почему на одном компьютере запуск эмулятора будет медленнее, но почему быстрее? Я проверил тип своих часов (high_resolution_clock), но не понимаю, почему это так. Спасибо!
period
std::high_resolution_clock
, различается ли он между двумя системами ? - person Some programmer dude   schedule 14.10.2020std::ratio
a>num
иden
членов вашей программы. - person Some programmer dude   schedule 14.10.2020