]> git.lizzy.rs Git - minetest.git/commitdiff
Avoid draw list and shadow map update in the same frame to reduce dtime jitter (...
authorx2048 <codeforsmile@gmail.com>
Sun, 11 Jul 2021 17:57:29 +0000 (19:57 +0200)
committerGitHub <noreply@github.com>
Sun, 11 Jul 2021 17:57:29 +0000 (10:57 -0700)
* 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

src/client/game.cpp

index 9f643e6114f69051451faaa69dea8432df7900fd..134c74d5d80ae825bca17c219639fd9193ece3cb 100644 (file)
@@ -609,6 +609,7 @@ struct GameRunData {
        float jump_timer;
        float damage_flash;
        float update_draw_list_timer;
+       float update_shadows_timer;
 
        f32 fog_range;
 
@@ -3874,10 +3875,10 @@ 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;
-       if (ShadowRenderer *shadow = RenderingEngine::get_shadow_renderer())
-               update_draw_list_delta = shadow->getUpdateDelta();
+       bool draw_list_updated = false;
 
        v3f camera_direction = camera->getDirection();
        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;
                client->getEnv().getClientMap().updateDrawList();
                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);