Periodically release all mesh HW buffers to avoid an Irrlicht bottleneck.

This commit is contained in:
Lars 2020-10-15 00:06:37 -07:00 committed by lhofhansl
parent ed22260822
commit 738f624218

@ -909,6 +909,7 @@ private:
bool m_does_lost_focus_pause_game = false;
int m_reset_HW_buffer_counter = 0;
#ifdef __ANDROID__
bool m_cache_hold_aux1;
bool m_android_chat_open;
@ -3686,7 +3687,6 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
camera->setDigging(0); // Dig animation
}
void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
const CameraOrientation &cam)
{
@ -3937,6 +3937,27 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
/*
End scene
*/
if (++m_reset_HW_buffer_counter > 500) {
/*
Periodically remove all mesh HW buffers.
Work around for a quirk in Irrlicht where a HW buffer is only
released after 20000 iterations (triggered from endScene()).
Without this, all loaded but unused meshes will retain their HW
buffers for at least 5 minutes, at which point looking up the HW buffers
becomes a bottleneck and the framerate drops (as much as 30%).
Tests showed that numbers between 50 and 1000 are good, so picked 500.
There are no other public Irrlicht APIs that allow interacting with the
HW buffers without tracking the status of every individual mesh.
The HW buffers for _visible_ meshes will be reinitialized in the next frame.
*/
infostream << "Game::updateFrame(): Removing all HW buffers." << std::endl;
driver->removeAllHardwareBuffers();
m_reset_HW_buffer_counter = 0;
}
driver->endScene();
stats->drawtime = tt_draw.stop(true);