From 00d9d96e48ec3337c415dbc600b0b0800eaecfad Mon Sep 17 00:00:00 2001 From: grorp Date: Tue, 19 Dec 2023 20:18:28 +0100 Subject: [PATCH] Android: Pause rendering while the app is paused (#14058) --- src/client/game.cpp | 63 +++++++++++++++++++----------------- src/client/renderingengine.h | 11 +++++++ src/gui/guiEngine.cpp | 53 +++++++++++++++--------------- 3 files changed, 72 insertions(+), 55 deletions(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index f7d31bc3b..8712f1aa8 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -4010,31 +4010,6 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, */ client->getParticleManager()->step(dtime); - /* - Fog - */ - if (m_cache_enable_fog) { - driver->setFog( - sky->getBgColor(), - video::EFT_FOG_LINEAR, - runData.fog_range * sky->getFogStart(), - runData.fog_range * 1.0, - 0.01, - false, // pixel fog - true // range fog - ); - } else { - driver->setFog( - sky->getBgColor(), - video::EFT_FOG_LINEAR, - 100000 * BS, - 110000 * BS, - 0.01f, - false, // pixel fog - false // range fog - ); - } - /* Damage camera tilt */ @@ -4134,7 +4109,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, /* ==================== Drawing begins ==================== */ - drawScene(graph, stats); + if (RenderingEngine::shouldRender()) + drawScene(graph, stats); /* ==================== End scene ==================== */ @@ -4214,10 +4190,39 @@ void Game::updateShadows() void Game::drawScene(ProfilerGraph *graph, RunStats *stats) { - const video::SColor skycolor = this->sky->getSkyColor(); + const video::SColor bg_color = this->sky->getBgColor(); + const video::SColor sky_color = this->sky->getSkyColor(); + /* + Fog + */ + if (this->m_cache_enable_fog) { + this->driver->setFog( + bg_color, + video::EFT_FOG_LINEAR, + this->runData.fog_range * this->sky->getFogStart(), + this->runData.fog_range * 1.0f, + 0.01f, + false, // pixel fog + true // range fog + ); + } else { + this->driver->setFog( + bg_color, + video::EFT_FOG_LINEAR, + 100000 * BS, + 110000 * BS, + 0.01f, + false, // pixel fog + false // range fog + ); + } + + /* + Drawing + */ TimeTaker tt_draw("Draw scene", nullptr, PRECISION_MICRO); - this->driver->beginScene(true, true, skycolor); + this->driver->beginScene(true, true, sky_color); const LocalPlayer *player = this->client->getEnv().getLocalPlayer(); bool draw_wield_tool = (this->m_game_ui->m_flags.show_hud && @@ -4230,7 +4235,7 @@ void Game::drawScene(ProfilerGraph *graph, RunStats *stats) if (this->isNoCrosshairAllowed()) draw_crosshair = false; #endif - this->m_rendering_engine->draw_scene(skycolor, this->m_game_ui->m_flags.show_hud, + this->m_rendering_engine->draw_scene(sky_color, this->m_game_ui->m_flags.show_hud, this->m_game_ui->m_flags.show_minimap, draw_wield_tool, draw_crosshair); /* diff --git a/src/client/renderingengine.h b/src/client/renderingengine.h index 22b8a3946..801649ad4 100644 --- a/src/client/renderingengine.h +++ b/src/client/renderingengine.h @@ -138,6 +138,17 @@ public: const irr::core::dimension2d initial_screen_size, const bool initial_window_maximized); + static bool shouldRender() + { + // On Android, pause rendering while the app is in background (generally not visible). + // Don't do this on desktop because windows can be partially visible. +#ifdef __ANDROID__ + return get_raw_device()->isWindowActive(); +#else + return true; +#endif + }; + private: v2u32 _getWindowSize() const; diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index 7bdc067ac..4bb7b041f 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -265,35 +265,36 @@ void GUIEngine::run() f32 dtime = 0.0f; while (m_rendering_engine->run() && (!m_startgame) && (!m_kill)) { + if (RenderingEngine::shouldRender()) { + // check if we need to update the "upper left corner"-text + if (text_height != g_fontengine->getTextHeight()) { + updateTopLeftTextSize(); + text_height = g_fontengine->getTextHeight(); + } - //check if we need to update the "upper left corner"-text - if (text_height != g_fontengine->getTextHeight()) { - updateTopLeftTextSize(); - text_height = g_fontengine->getTextHeight(); + driver->beginScene(true, true, RenderingEngine::MENU_SKY_COLOR); + + if (m_clouds_enabled) + { + cloudPreProcess(); + drawOverlay(driver); + } + else + drawBackground(driver); + + drawFooter(driver); + + m_rendering_engine->get_gui_env()->drawAll(); + + // The header *must* be drawn after the menu because it uses + // GUIFormspecMenu::getAbsoluteRect(). + // The header *can* be drawn after the menu because it never intersects + // the menu. + drawHeader(driver); + + driver->endScene(); } - driver->beginScene(true, true, RenderingEngine::MENU_SKY_COLOR); - - if (m_clouds_enabled) - { - cloudPreProcess(); - drawOverlay(driver); - } - else - drawBackground(driver); - - drawFooter(driver); - - m_rendering_engine->get_gui_env()->drawAll(); - - // The header *must* be drawn after the menu because it uses - // GUIFormspecMenu::getAbsoluteRect(). - // The header *can* be drawn after the menu because it never intersects - // the menu. - drawHeader(driver); - - driver->endScene(); - IrrlichtDevice *device = m_rendering_engine->get_raw_device(); u32 frametime_min = 1000 / (device->isWindowFocused()