mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
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:
parent
f5706d444b
commit
effb5356ca
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user