mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +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:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user