refactor(gameplay): use steady clock and sleep_until for tick loop timing

This commit is contained in:
2026-06-26 22:00:36 +08:00
parent 932ef9ace4
commit 09fc46d306
2 changed files with 14 additions and 13 deletions

View File

@@ -289,17 +289,17 @@ void ClientWorld::hot_reload() {
void ClientWorld::client_run(std::stop_token stoken) { void ClientWorld::client_run(std::stop_token stoken) {
Logger::info("Client Thread Started"); Logger::info("Client Thread Started");
while (!stoken.stop_requested()) { using Clock = std::chrono::steady_clock;
auto t1 = system_clock::now();
constexpr auto TICK = std::chrono::milliseconds(DEFAULT_PER_TICK_TIME);
auto next = Clock::now();
while (!stoken.stop_requested()) {
next += TICK;
for (auto& x : m_timers) { for (auto& x : m_timers) {
x.second.update(); x.second.update();
} }
std::this_thread::sleep_until(next);
auto t2 = system_clock::now();
auto dt = duration_cast<microseconds>(t2 - t1);
auto st = std::max(dt, milliseconds(DEFAULT_PER_TICK_TIME) - dt);
std::this_thread::sleep_for(st);
} }
} }

View File

@@ -299,18 +299,19 @@ void ServerWorld::stop_thread_pool() {
void ServerWorld::serever_run(std::stop_token stoken) { void ServerWorld::serever_run(std::stop_token stoken) {
Logger::info("Server Thread Started!"); Logger::info("Server Thread Started!");
while (!stoken.stop_requested()) {
auto t1 = system_clock::now();
using Clock = std::chrono::steady_clock;
constexpr auto TICK = std::chrono::milliseconds(DEFAULT_PER_TICK_TIME);
auto next = Clock::now();
while (!stoken.stop_requested()) {
next += TICK;
if (m_tick_running) { if (m_tick_running) {
++m_game_ticks; ++m_game_ticks;
m_day_tick = (m_day_tick + 1) % DAY_TIME; m_day_tick = (m_day_tick + 1) % DAY_TIME;
} }
update(); update();
auto t2 = system_clock::now(); std::this_thread::sleep_until(next);
auto dt = duration_cast<microseconds>(t2 - t1);
auto st = std::max(dt, milliseconds(m_per_tick_time) - dt);
std::this_thread::sleep_for(st);
} }
Logger::info("Server Thread Stopped!"); Logger::info("Server Thread Stopped!");
} }