Added rate limiter for SDL error messages.

Workaround for issue #158.
This commit is contained in:
Muzychenko Andrey 2022-10-11 13:39:33 +03:00
parent cfaab257ed
commit 3c6e1c9d47
2 changed files with 53 additions and 20 deletions

View File

@ -37,7 +37,8 @@ bool winmain::LaunchBallEnabled = true;
bool winmain::HighScoresEnabled = true;
bool winmain::DemoActive = false;
int winmain::MainMenuHeight = 0;
std::string winmain::FpsDetails;
std::string winmain::FpsDetails, winmain::PrevSdlError;
unsigned winmain::PrevSdlErrorCount = 0;
double winmain::UpdateToFrameRatio;
winmain::DurationMs winmain::TargetFrameTime;
optionsStruct& winmain::Options = options::Options;
@ -253,7 +254,8 @@ int winmain::WinMain(LPCSTR lpCmdLine)
if (xMod != 0 || yMod != 0)
{
// Mouse warp does not work over remote desktop or in some VMs
x = abs(x - xMod); y = abs(y - yMod);
x = abs(x - xMod);
y = abs(y - yMod);
SDL_WarpMouseInWindow(window, x, y);
}
@ -310,11 +312,29 @@ int winmain::WinMain(LPCSTR lpCmdLine)
}
auto sdlError = SDL_GetError();
if (sdlError[0])
if (sdlError[0] || !PrevSdlError.empty())
{
if (sdlError[0])
SDL_ClearError();
// Rate limit duplicate SDL error messages.
if (sdlError != PrevSdlError)
{
PrevSdlError = sdlError;
if (PrevSdlErrorCount > 0)
{
printf("SDL Error: ^ Previous Error Repeated %u Times\n", PrevSdlErrorCount + 1);
PrevSdlErrorCount = 0;
}
if (sdlError[0])
printf("SDL Error: %s\n", sdlError);
}
else
{
PrevSdlErrorCount++;
}
}
auto updateEnd = Clock::now();
auto targetTimeDelta = TargetFrameTime - DurationMs(updateEnd - frameStart) - sleepRemainder;
@ -334,13 +354,19 @@ int winmain::WinMain(LPCSTR lpCmdLine)
}
// Limit duration to 2 * target time
sleepRemainder = Clamp(DurationMs(frameEnd - updateEnd) - targetTimeDelta, -TargetFrameTime, TargetFrameTime);
sleepRemainder = Clamp(DurationMs(frameEnd - updateEnd) - targetTimeDelta, -TargetFrameTime,
TargetFrameTime);
frameDuration = std::min<DurationMs>(DurationMs(frameEnd - frameStart), 2 * TargetFrameTime);
frameStart = frameEnd;
UpdateToFrameCounter++;
}
}
if (PrevSdlErrorCount > 0)
{
printf("SDL Error: ^ Previous Error Repeated %u Times\n", PrevSdlErrorCount);
}
SDL_free(basePath);
SDL_free(prefPath);
delete gfr_display;
@ -504,7 +530,8 @@ void winmain::RenderUi()
options::toggle(Menu1::SoundStereo);
}
ImGui::TextUnformatted("Sound Volume");
if (ImGui::SliderInt("##Sound Volume", &Options.SoundVolume, options::MinVolume, options::MaxVolume, "%d",
if (ImGui::SliderInt("##Sound Volume", &Options.SoundVolume, options::MinVolume, options::MaxVolume,
"%d",
ImGuiSliderFlags_AlwaysClamp))
{
Sound::SetVolume(Options.SoundVolume);
@ -522,7 +549,8 @@ void winmain::RenderUi()
options::toggle(Menu1::Music);
}
ImGui::TextUnformatted("Music Volume");
if (ImGui::SliderInt("##Music Volume", &Options.MusicVolume, options::MinVolume, options::MaxVolume, "%d",
if (ImGui::SliderInt("##Music Volume", &Options.MusicVolume, options::MinVolume, options::MaxVolume,
"%d",
ImGuiSliderFlags_AlwaysClamp))
{
midi::SetVolume(Options.MusicVolume);
@ -597,10 +625,14 @@ void winmain::RenderUi()
char buffer[20]{};
Msg resolutionStringId = Msg::Menu1_UseMaxResolution_640x480;
switch(fullscrn::GetMaxResolution()) {
case 0: resolutionStringId = Msg::Menu1_UseMaxResolution_640x480; break;
case 1: resolutionStringId = Msg::Menu1_UseMaxResolution_800x600; break;
case 2: resolutionStringId = Msg::Menu1_UseMaxResolution_1024x768; break;
switch (fullscrn::GetMaxResolution())
{
case 0: resolutionStringId = Msg::Menu1_UseMaxResolution_640x480;
break;
case 1: resolutionStringId = Msg::Menu1_UseMaxResolution_800x600;
break;
case 2: resolutionStringId = Msg::Menu1_UseMaxResolution_1024x768;
break;
}
auto maxResText = pb::get_rc_string(resolutionStringId);

View File

@ -90,7 +90,7 @@ private:
static int mouse_down, last_mouse_x, last_mouse_y;
static bool no_time_loss, activated, bQuit, has_focus, DispGRhistory;
static gdrv_bitmap8* gfr_display;
static std::string FpsDetails;
static std::string FpsDetails, PrevSdlError;
static bool restart;
static bool ShowAboutDialog;
static bool ShowImGuiDemo;
@ -100,6 +100,7 @@ private:
static struct optionsStruct& Options;
static DurationMs SpinThreshold;
static WelfordState SleepState;
static unsigned PrevSdlErrorCount;
static void RenderUi();
static void RenderFrameTimeDialog();