Skip to content
Permalink
Browse files

Periodically release all mesh HW buffers to avoid an Irrlicht bottlen…

…eck.
  • Loading branch information
lhofhansl committed Oct 17, 2020
1 parent ed22260 commit 738f62421872c0be5fcd483ad4573e5d879e7418
Showing with 22 additions and 1 deletion.
  1. +22 −1 src/client/game.cpp
@@ -909,6 +909,7 @@ class Game {

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);

0 comments on commit 738f624

Please sign in to comment.
You can’t perform that action at this time.