Try to make Frame Advance a bit more reliable

This commit is contained in:
Henrik Rydgård 2024-09-18 15:17:20 +02:00
parent 476c69c675
commit 42914c3d7c
3 changed files with 21 additions and 11 deletions

View File

@ -715,16 +715,9 @@ void EmuScreen::onVKey(int virtualKeyCode, bool down) {
break;
case VIRTKEY_FRAME_ADVANCE:
if (!Achievements::WarnUserIfHardcoreModeActive(false)) {
if (down) {
// If game is running, pause emulation immediately. Otherwise, advance a single frame.
if (Core_IsStepping()) {
frameStep_ = true;
Core_EnableStepping(false);
} else if (!frameStep_) {
Core_EnableStepping(true, "ui.frameAdvance", 0);
}
}
// Can't do this reliably in an async fashion, so we just set a variable.
if (down) {
doFrameAdvance_.store(true);
}
break;
@ -1422,6 +1415,19 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
Core_UpdateDebugStats((DebugOverlay)g_Config.iDebugOverlay == DebugOverlay::DEBUG_STATS || g_Config.bLogFrameDrops);
if (doFrameAdvance_.exchange(false)) {
if (!Achievements::WarnUserIfHardcoreModeActive(false)) {
// If game is running, pause emulation immediately. Otherwise, advance a single frame.
if (Core_IsStepping()) {
frameStep_ = true;
Core_EnableStepping(false);
} else if (!frameStep_) {
lastNumFlips = gpuStats.numFlips;
Core_EnableStepping(true, "ui.frameAdvance", 0);
}
}
}
bool blockedExecution = Achievements::IsBlockingExecution();
uint32_t clearColor = 0;
if (!blockedExecution) {

View File

@ -121,5 +121,7 @@ private:
std::string extraAssertInfoStr_;
std::atomic<bool> doFrameAdvance_{};
ControlMapper controlMapper_;
};

View File

@ -205,7 +205,9 @@ void GameScreen::CreateViews() {
rightColumnItems->SetSpacing(0.0f);
rightColumn->Add(rightColumnItems);
rightColumnItems->Add(new Choice(ga->T("Play")))->OnClick.Handle(this, &GameScreen::OnPlay);
if (!inGame_) {
rightColumnItems->Add(new Choice(ga->T("Play")))->OnClick.Handle(this, &GameScreen::OnPlay);
}
btnGameSettings_ = rightColumnItems->Add(new Choice(ga->T("Game Settings")));
btnGameSettings_->OnClick.Handle(this, &GameScreen::OnGameSettings);