mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Periodically release all mesh HW buffers to avoid an Irrlicht bottleneck.
This commit is contained in:
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);
|
||||
|
Loading…
Reference in New Issue
Block a user