summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-08-25 23:47:29 -0300
committerGravatar Yuri Kunde Schlesner2015-08-30 00:07:02 -0300
commit18c1c39d5e3c096fdcfafa38487f735501c543fb (patch)
treece81914258487068cd068091f8e85738b1142028
parentMerge pull request #1048 from yuriks/microprofile (diff)
downloadyuzu-18c1c39d5e3c096fdcfafa38487f735501c543fb.tar.gz
yuzu-18c1c39d5e3c096fdcfafa38487f735501c543fb.tar.xz
yuzu-18c1c39d5e3c096fdcfafa38487f735501c543fb.zip
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.
-rw-r--r--src/core/hle/svc.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 19f750d72..45d5f3c5d 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -755,7 +755,10 @@ static void SleepThread(s64 nanoseconds) {
755 755
756/// This returns the total CPU ticks elapsed since the CPU was powered-on 756/// This returns the total CPU ticks elapsed since the CPU was powered-on
757static s64 GetSystemTick() { 757static s64 GetSystemTick() {
758 return (s64)CoreTiming::GetTicks(); 758 s64 result = CoreTiming::GetTicks();
759 // Advance time to defeat dumb games (like Cubic Ninja) that busy-wait for the frame to end.
760 Core::g_app_core->AddTicks(150); // Measured time between two calls on a 9.2 o3DS with Ninjhax 1.1b
761 return result;
759} 762}
760 763
761/// Creates a memory block at the specified address with the specified permissions and size 764/// Creates a memory block at the specified address with the specified permissions and size