summaryrefslogtreecommitdiff
path: root/src/core
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 /src/core
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.
Diffstat (limited to 'src/core')
-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