From c2dd664fc60b843689d232c255b9718ca646e86f Mon Sep 17 00:00:00 2001 From: cutealien Date: Mon, 3 Apr 2023 15:32:41 +0000 Subject: [PATCH] CIrrDeviceWin32::yield() now uses Sleep(0) instead of Sleep(1). We had changed that once before in the other direction in svn r421 Reason back then was "Sleep(0) doesn't allow any lower priority threads to execute" But Microsoft changed the behaviour of Sleep(0) after Windows XP so that's no longer true. And the costs of it is pretty high - due to this using a timer with a 15ms resolutions it meant not just giving up the thread but it also always waited for 15ms on Windows. I also replaced a few sleep calls in examples for that reason with yield() calls. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6459 dfc29bdd-3216-0410-991c-e03cc46cb475 --- include/IrrlichtDevice.h | 12 ++++++++---- source/Irrlicht/CIrrDeviceWin32.cpp | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/IrrlichtDevice.h b/include/IrrlichtDevice.h index ad38ada5..6dcdb499 100644 --- a/include/IrrlichtDevice.h +++ b/include/IrrlichtDevice.h @@ -76,13 +76,17 @@ namespace irr virtual bool run() = 0; //! Cause the device to temporarily pause execution and let other processes run. - /** This should bring down processor usage without major - performance loss for Irrlicht */ + /** This should bring down processor usage without major performance loss for Irrlicht. + But this is system dependent, so there's a chance your thread won't get control back quickly. + */ virtual void yield() = 0; //! Pause execution and let other processes to run for a specified amount of time. - /** It may not wait the full given time, as sleep may be interrupted - \param timeMs: Time to sleep for in milliseconds. + /** It may not wait the full given time, as sleep may be interrupted and also may wait longer on some OS. + \param timeMs: Time to sleep for in milliseconds. Note that the OS can round up this number. + On Windows you usually get at least 15ms sleep time minium for any value > 0. + So if you call this in your main loop you can't get more than 65 FPS anymore in your game. + On most Linux systems it's relatively exact, but also no guarantee. \param pauseTimer: If true, pauses the device timer while sleeping */ virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0; diff --git a/source/Irrlicht/CIrrDeviceWin32.cpp b/source/Irrlicht/CIrrDeviceWin32.cpp index b96b165b..e8e0e385 100644 --- a/source/Irrlicht/CIrrDeviceWin32.cpp +++ b/source/Irrlicht/CIrrDeviceWin32.cpp @@ -1024,7 +1024,7 @@ bool CIrrDeviceWin32::run() //! Pause the current process for the minimum time allowed only to allow other processes to execute void CIrrDeviceWin32::yield() { - Sleep(1); + Sleep(0); } //! Pause execution and let other processes to run for a specified amount of time.