summaryrefslogtreecommitdiff
path: root/src/video/win32_v.cpp
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-02-17 15:19:33 +0100
committerPatric Stout <github@truebrain.nl>2021-02-19 10:43:15 +0100
commiteb9b1ad68d84ddbebb3d9e50f3ec8d3ad195c75c (patch)
tree93a26d1a0681b85653a6b115a4931a240eed34e7 /src/video/win32_v.cpp
parentae7a2b9f02b4becdcc7cb96f79031c840198989f (diff)
downloadopenttd-eb9b1ad68d84ddbebb3d9e50f3ec8d3ad195c75c.tar.xz
Change: sleep till the next tick in the main loop
Sleep for 1ms (which is always (a lot) more than 1ms) is just randomly guessing and hoping you hit your deadline, give or take. But given we can calculate when our next frame is happening, we can just sleep for that exact amount. As these values are often a bit larger, it is also more likely the OS can schedule us back in close to our requested target. This means it is more likely we hit our deadlines, which makes the FPS a lot more stable.
Diffstat (limited to 'src/video/win32_v.cpp')
-rw-r--r--src/video/win32_v.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp
index 2fe5f67f0..42fcf3f4b 100644
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -1258,13 +1258,20 @@ void VideoDriver_Win32::MainLoop()
CheckPaletteAnim();
}
+ /* If we are not in fast-forward, create some time between calls to ease up CPU usage. */
if (!_fast_forward || _pause_mode) {
- /* Flush GDI buffer to ensure we don't conflict with the drawing thread. */
- GdiFlush();
+ /* See how much time there is till we have to process the next event, and try to hit that as close as possible. */
+ auto next_tick = std::min(next_draw_tick, next_game_tick);
+ auto now = std::chrono::steady_clock::now();
- if (_draw_mutex != nullptr) draw_lock.unlock();
- CSleep(1);
- if (_draw_mutex != nullptr) draw_lock.lock();
+ if (next_tick > now) {
+ /* Flush GDI buffer to ensure we don't conflict with the drawing thread. */
+ GdiFlush();
+
+ if (_draw_mutex != nullptr) draw_lock.unlock();
+ std::this_thread::sleep_for(next_tick - now);
+ if (_draw_mutex != nullptr) draw_lock.lock();
+ }
}
}