SVC: Advance time when calling GetSystemTick to escape busy-wait loops

Cubic Ninja waited for the frame to end by spinning on a loop calling
GetSystemTick while doing nothing else. Since GetSystemTick doesn't
cause a reschedule (which advances time), this meant that very little
emulated time would pass inside that loop, causing the game to spend
most of the frame burning away CPU.
pull/1/head
Yuri Kunde Schlesner 2015-08-25 23:47:29 -03:00
parent ac0104b8b0
commit 18c1c39d5e
1 changed files with 4 additions and 1 deletions

View File

@ -755,7 +755,10 @@ static void SleepThread(s64 nanoseconds) {
/// This returns the total CPU ticks elapsed since the CPU was powered-on /// This returns the total CPU ticks elapsed since the CPU was powered-on
static s64 GetSystemTick() { static s64 GetSystemTick() {
return (s64)CoreTiming::GetTicks(); s64 result = CoreTiming::GetTicks();
// Advance time to defeat dumb games (like Cubic Ninja) that busy-wait for the frame to end.
Core::g_app_core->AddTicks(150); // Measured time between two calls on a 9.2 o3DS with Ninjhax 1.1b
return result;
} }
/// Creates a memory block at the specified address with the specified permissions and size /// Creates a memory block at the specified address with the specified permissions and size