fix(topola-egui): Add another condition to prevent stuttering

This commit is contained in:
Mikolaj Wielgus 2025-10-28 18:13:46 +01:00
parent ba5a254e11
commit b9f7d4ec4f
2 changed files with 17 additions and 2 deletions

View File

@ -59,6 +59,8 @@ impl Viewport {
if i.stable_dt <= i.predicted_dt {
i.stable_dt
} else {
// Clamp dt to egui's predicted dt to
// additionally safeguard against stuttering.
i.predicted_dt
}
}),

View File

@ -5,6 +5,7 @@
use std::{
ops::ControlFlow,
sync::mpsc::{channel, Receiver, Sender},
time::Instant,
};
use topola::{
@ -77,14 +78,26 @@ impl Workspace {
error_dialog: &mut ErrorDialog,
frame_timestep: f32,
interactive_input: &InteractiveInput,
) {
) -> bool {
let instant = Instant::now();
self.update_counter += interactive_input.dt;
while self.update_counter >= frame_timestep {
self.update_counter -= frame_timestep;
if let ControlFlow::Break(()) = self.update_state(tr, error_dialog, interactive_input) {
break;
return true;
}
// Hard limit: never spend more time on advancing state than the
// duration of last frame to prevent stuttering.
// Of course, this does not safeguard against infinite loops.
if instant.elapsed().as_secs_f32() >= interactive_input.dt {
return false;
}
}
true
}
pub fn update_state_for_event(