diff --git a/src/client.rs b/src/client.rs index 40630bb29..806636b7e 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1203,6 +1203,7 @@ pub struct LoginConfigHandler { pub save_ab_password_to_recent: bool, // true: connected with ab password pub other_server: Option<(String, String, String)>, pub custom_fps: Arc>>, + pub last_auto_fps: Option, pub adapter_luid: Option, pub mark_unsupported: Vec, pub selected_windows_session_id: Option, diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index 33c39f359..81474f8b8 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -1002,8 +1002,9 @@ impl Remote { if limited_fps > custom_fps { limited_fps = custom_fps; } + let last_auto_fps = self.handler.lc.read().unwrap().last_auto_fps.clone(); let should_decrease = (len > 1 - && ctl.last_auto_fps.clone().unwrap_or(custom_fps as _) > limited_fps) + && last_auto_fps.clone().unwrap_or(custom_fps as _) > limited_fps) || len > std::cmp::max(1, limited_fps / 2); // increase judgement @@ -1015,14 +1016,14 @@ impl Remote { ctl.idle_counter = 0; } let mut should_increase = false; - if let Some(last_auto_fps) = ctl.last_auto_fps.clone() { + if let Some(last_auto_fps) = last_auto_fps.clone() { // ever set if last_auto_fps + 3 <= limited_fps && ctl.idle_counter > 3 { // limited_fps is 3 larger than last set, and idle time is more than 3 seconds should_increase = true; } } - if ctl.last_auto_fps.is_none() || should_decrease || should_increase { + if last_auto_fps.is_none() || should_decrease || should_increase { // limited_fps to ensure decoding is faster than encoding let mut auto_fps = limited_fps; if should_decrease && limited_fps < len { @@ -1041,7 +1042,7 @@ impl Remote { self.sender.send(Data::Message(msg)).ok(); log::info!("Set fps to {}", auto_fps); ctl.last_queue_size = len; - ctl.last_auto_fps = Some(auto_fps); + self.handler.lc.write().unwrap().last_auto_fps = Some(auto_fps); } // send refresh for (display, video_queue) in self.video_queue_map.read().unwrap().iter() { @@ -1858,7 +1859,6 @@ struct FpsControl { last_queue_size: usize, refresh_times: usize, last_refresh_instant: Instant, - last_auto_fps: Option, idle_counter: usize, last_active_time: HashMap, } @@ -1869,7 +1869,6 @@ impl Default for FpsControl { last_queue_size: Default::default(), refresh_times: Default::default(), last_refresh_instant: Instant::now(), - last_auto_fps: Default::default(), idle_counter: 0, last_active_time: Default::default(), } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index b60711a0c..bb9c68163 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -410,9 +410,12 @@ impl Session { self.send(Data::Message(msg)); } if value != "custom" { - // non custom quality use 30 fps - let msg = self.lc.write().unwrap().set_custom_fps(30, false); - self.send(Data::Message(msg)); + let last_auto_fps = self.lc.read().unwrap().last_auto_fps; + if last_auto_fps.unwrap_or(usize::MAX) >= 30 { + // non custom quality use 30 fps + let msg = self.lc.write().unwrap().set_custom_fps(30, false); + self.send(Data::Message(msg)); + } } }