Avoid draw list and shadow map update in the same frame to reduce dtime jitter (#11393)

* Separate draw list and shadows update to reduce jitter

* Avoid draw list update and shadow update in the same frame

* Force-update shadows when camera offset changes
This commit is contained in:
x2048 2021-07-11 19:57:29 +02:00 committed by GitHub
parent f5706d444b
commit effb5356ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -609,6 +609,7 @@ struct GameRunData {
float jump_timer; float jump_timer;
float damage_flash; float damage_flash;
float update_draw_list_timer; float update_draw_list_timer;
float update_shadows_timer;
f32 fog_range; f32 fog_range;
@ -3874,10 +3875,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
changed much changed much
*/ */
runData.update_draw_list_timer += dtime; runData.update_draw_list_timer += dtime;
runData.update_shadows_timer += dtime;
float update_draw_list_delta = 0.2f; float update_draw_list_delta = 0.2f;
if (ShadowRenderer *shadow = RenderingEngine::get_shadow_renderer()) bool draw_list_updated = false;
update_draw_list_delta = shadow->getUpdateDelta();
v3f camera_direction = camera->getDirection(); v3f camera_direction = camera->getDirection();
if (runData.update_draw_list_timer >= update_draw_list_delta if (runData.update_draw_list_timer >= update_draw_list_delta
@ -3887,8 +3888,18 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
runData.update_draw_list_timer = 0; runData.update_draw_list_timer = 0;
client->getEnv().getClientMap().updateDrawList(); client->getEnv().getClientMap().updateDrawList();
runData.update_draw_list_last_cam_dir = camera_direction; runData.update_draw_list_last_cam_dir = camera_direction;
draw_list_updated = true;
}
updateShadows(); 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();
}
} }
m_game_ui->update(*stats, client, draw_control, cam, runData.pointed_old, gui_chat_console, dtime); m_game_ui->update(*stats, client, draw_control, cam, runData.pointed_old, gui_chat_console, dtime);