diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index cb9ebf8706..fbee4f5133 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -328,13 +328,13 @@ static void __IoAsyncNotify(u64 userdata, int cyclesLate) { CoreTiming::ScheduleEvent(usToCycles(500) - cyclesLate, asyncNotifyEvent, userdata); return; } - } - - u64 finishTicks = __IoCompleteAsyncIO(f); - if (finishTicks > CoreTiming::GetTicks()) { - // Reschedule for later, since we now know how long it ought to take. - CoreTiming::ScheduleEvent(finishTicks - CoreTiming::GetTicks(), asyncNotifyEvent, userdata); - return; + } else if (g_Config.iIOTimingMethod == IOTIMING_REALISTIC) { + u64 finishTicks = __IoCompleteAsyncIO(f); + if (finishTicks > CoreTiming::GetTicks()) { + // Reschedule for later, since we now know how long it ought to take. + CoreTiming::ScheduleEvent(finishTicks - CoreTiming::GetTicks(), asyncNotifyEvent, userdata); + return; + } } if (f->waitingThreads.empty()) { @@ -379,13 +379,13 @@ static void __IoSyncNotify(u64 userdata, int cyclesLate) { CoreTiming::ScheduleEvent(usToCycles(500) - cyclesLate, syncNotifyEvent, userdata); return; } - } - - u64 finishTicks = ioManager.ResultFinishTicks(f->handle); - if (finishTicks > CoreTiming::GetTicks()) { - // Reschedule for later when the result should finish. - CoreTiming::ScheduleEvent(finishTicks - CoreTiming::GetTicks(), syncNotifyEvent, userdata); - return; + } else if (g_Config.iIOTimingMethod == IOTIMING_REALISTIC) { + u64 finishTicks = ioManager.ResultFinishTicks(f->handle); + if (finishTicks > CoreTiming::GetTicks()) { + // Reschedule for later when the result should finish. + CoreTiming::ScheduleEvent(finishTicks - CoreTiming::GetTicks(), syncNotifyEvent, userdata); + return; + } } f->pendingAsyncResult = false; @@ -610,9 +610,11 @@ static u32 sceKernelStderr() { } u64 __IoCompleteAsyncIO(FileNode *f) { - u64 finishTicks = ioManager.ResultFinishTicks(f->handle); - if (finishTicks > CoreTiming::GetTicks()) { - return finishTicks; + if (g_Config.iIOTimingMethod == IOTIMING_REALISTIC) { + u64 finishTicks = ioManager.ResultFinishTicks(f->handle); + if (finishTicks > CoreTiming::GetTicks()) { + return finishTicks; + } } AsyncIOResult managerResult; if (ioManager.WaitResult(f->handle, managerResult)) { diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index b26ba3a0ae..673082d144 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -392,7 +392,7 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new CheckBox(&g_Config.bSeparateCPUThread, s->T("Multithreaded (experimental)"))); systemSettings->Add(new CheckBox(&g_Config.bSeparateIOThread, s->T("I/O on thread (experimental)")))->SetEnabled(!PSP_IsInited()); - static const char *ioTimingMethods[] = { "Fast (lag on slow storage)", "Host (bugs, less lag)" }; + static const char *ioTimingMethods[] = { "Fast (lag on slow storage)", "Host (bugs, less lag)", "Simulate UMD delays" }; View *ioTimingMethod = systemSettings->Add(new PopupMultiChoice(&g_Config.iIOTimingMethod, s->T("IO timing method"), ioTimingMethods, 0, ARRAY_SIZE(ioTimingMethods), s, screenManager())); ioTimingMethod->SetEnabledPtr(&g_Config.bSeparateIOThread); systemSettings->Add(new CheckBox(&g_Config.bForceLagSync, s->T("Force real clock sync (slower, less lag)")));