diff options
| author | 2015-08-25 23:47:29 -0300 | |
|---|---|---|
| committer | 2015-08-30 00:07:02 -0300 | |
| commit | 18c1c39d5e3c096fdcfafa38487f735501c543fb (patch) | |
| tree | ce81914258487068cd068091f8e85738b1142028 | |
| parent | Merge pull request #1048 from yuriks/microprofile (diff) | |
| download | yuzu-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.cpp | 5 |
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 |
| 757 | static s64 GetSystemTick() { | 757 | static 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 |