mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Distribute shadow map update over multiple frames to reduce stutter (#11422)
Reduces stutter and freezes when playing. * Maintains double SM and SM Color textures * Light frustum update triggers incremental generation of shadow map into secondary 'future' textures. * Every incremental update renders a portion of the shadow draw list (split equally). * After defined number of frames (currently, 4), 'future' and 'current' textures are swapped, and DirectionalLight 'commits' the new frustum to use when rendering shadows on screen. Co-authored-by: sfan5 <sfan5@live.de>
This commit is contained in:
parent
ff2d2a6e93
commit
bf3acbf388
10 changed files with 224 additions and 72 deletions
|
@ -609,7 +609,6 @@ struct GameRunData {
|
|||
float jump_timer;
|
||||
float damage_flash;
|
||||
float update_draw_list_timer;
|
||||
float update_shadows_timer;
|
||||
|
||||
f32 fog_range;
|
||||
|
||||
|
@ -3881,10 +3880,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
|
|||
changed much
|
||||
*/
|
||||
runData.update_draw_list_timer += dtime;
|
||||
runData.update_shadows_timer += dtime;
|
||||
|
||||
float update_draw_list_delta = 0.2f;
|
||||
bool draw_list_updated = false;
|
||||
|
||||
v3f camera_direction = camera->getDirection();
|
||||
if (runData.update_draw_list_timer >= update_draw_list_delta
|
||||
|
@ -3894,18 +3891,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
|
|||
runData.update_draw_list_timer = 0;
|
||||
client->getEnv().getClientMap().updateDrawList();
|
||||
runData.update_draw_list_last_cam_dir = camera_direction;
|
||||
draw_list_updated = true;
|
||||
}
|
||||
|
||||
if (ShadowRenderer *shadow = RenderingEngine::get_shadow_renderer()) {
|
||||
update_draw_list_delta = shadow->getUpdateDelta();
|
||||
|
||||
if (m_camera_offset_changed ||
|
||||
(runData.update_shadows_timer > update_draw_list_delta &&
|
||||
(!draw_list_updated || shadow->getDirectionalLightCount() == 0))) {
|
||||
runData.update_shadows_timer = 0;
|
||||
updateShadows();
|
||||
}
|
||||
if (RenderingEngine::get_shadow_renderer()) {
|
||||
updateShadows();
|
||||
}
|
||||
|
||||
m_game_ui->update(*stats, client, draw_control, cam, runData.pointed_old, gui_chat_console, dtime);
|
||||
|
@ -4062,7 +4051,7 @@ void Game::updateShadows()
|
|||
shadow->getDirectionalLight().setDirection(sun_pos);
|
||||
shadow->setTimeOfDay(in_timeofday);
|
||||
|
||||
shadow->getDirectionalLight().update_frustum(camera, client);
|
||||
shadow->getDirectionalLight().update_frustum(camera, client, m_camera_offset_changed);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue