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
This commit is contained in:
cutealien 2023-04-03 15:32:41 +00:00
parent 920e327d33
commit a3adfc196b
9 changed files with 21 additions and 10 deletions

@ -1,6 +1,9 @@
-------------------------- --------------------------
Changes in 1.9 (not yet released) Changes in 1.9 (not yet released)
- CIrrDeviceWin32::yield() now uses Sleep(0) instead of Sleep(1).
We had Sleep(1) to allow yielding to all processes back in Windows XP time.
But a) This caused Windows apps to sleep for 15ms usually and b) behavior for Sleep(0) was changed after Window XP to do what we want it to do.
- Add ICursorControl::getReferenceRect - Add ICursorControl::getReferenceRect
- Fix: Listbox no longer sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED when pressed mouse was moved over item before releasing the mouse button - Fix: Listbox no longer sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED when pressed mouse was moved over item before releasing the mouse button
- Listbox items can now change individual background colors - Listbox items can now change individual background colors

@ -168,6 +168,7 @@ int main()
device->setWindowCaption(str.c_str()); device->setWindowCaption(str.c_str());
lastFPS = fps; lastFPS = fps;
} }
device->yield();
} }
else else
device->yield(); device->yield();

@ -884,7 +884,7 @@ bool CApp::update()
} }
// be nice // be nice
Device->sleep( 5 ); Device->yield();
return true; return true;
} }

@ -564,7 +564,7 @@ int main()
} }
else else
{ {
device->sleep(10); device->yield(); // be nice
} }
} }

@ -500,7 +500,7 @@ int main()
app.Gui->drawAll(); app.Gui->drawAll();
app.Driver->endScene(); app.Driver->endScene();
} }
app.Device->sleep(10); app.Device->yield(); // be nice
} }
//app destroys device in destructor //app destroys device in destructor

@ -76,13 +76,17 @@ namespace irr
virtual bool run() = 0; virtual bool run() = 0;
//! Cause the device to temporarily pause execution and let other processes run. //! Cause the device to temporarily pause execution and let other processes run.
/** This should bring down processor usage without major /** This should bring down processor usage without major performance loss for Irrlicht.
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; virtual void yield() = 0;
//! Pause execution and let other processes to run for a specified amount of time. //! 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 /** 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. \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 \param pauseTimer: If true, pauses the device timer while sleeping
*/ */
virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0; virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0;

@ -1231,7 +1231,7 @@ bool CIrrDeviceWin32::run()
//! Pause the current process for the minimum time allowed only to allow other processes to execute //! Pause the current process for the minimum time allowed only to allow other processes to execute
void CIrrDeviceWin32::yield() void CIrrDeviceWin32::yield()
{ {
Sleep(1); Sleep(0);
} }
//! Pause execution and let other processes to run for a specified amount of time. //! Pause execution and let other processes to run for a specified amount of time.

@ -168,7 +168,7 @@
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" /> <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" /> <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Irrlicht.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" /> <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" /> <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" /> <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
@ -217,6 +217,9 @@
<LibraryPath Condition="'$(Configuration)|$(Platform)'=='Static lib - Release|x64'">$(DXSDK_DIR)Lib\x64;$(LibraryPath);$(VSInstallDir);$(VSInstallDir)lib\amd64</LibraryPath> <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Static lib - Release|x64'">$(DXSDK_DIR)Lib\x64;$(LibraryPath);$(VSInstallDir);$(VSInstallDir)lib\amd64</LibraryPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<EnableMicrosoftCodeAnalysis>false</EnableMicrosoftCodeAnalysis>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Midl> <Midl>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

@ -72,7 +72,7 @@ int main()
} }
// be nice to CPU // be nice to CPU
device->sleep(10); device->yield();
if (!device->isWindowActive()) if (!device->isWindowActive())
device->sleep(90); device->sleep(90);
} }