rework frame limiter

This commit is contained in:
Logan McNaughton
2023-10-06 20:23:59 -06:00
parent cb4b7b878f
commit edbf10212b
2 changed files with 18 additions and 3 deletions
+1
View File
@@ -262,6 +262,7 @@ impl Device {
clock: 0,
field: 0,
delay: 0,
holdover: std::time::Duration::from_secs(0),
count_per_scanline: 0,
last_vi_time: std::time::Instant::now(),
vi_period: std::time::Duration::from_secs_f64(0.0),
+17 -3
View File
@@ -22,6 +22,7 @@ pub struct Vi {
pub clock: u64,
pub delay: u64,
pub field: u32,
pub holdover: std::time::Duration,
pub count_per_scanline: u64,
pub last_vi_time: std::time::Instant,
pub vi_period: std::time::Duration,
@@ -123,9 +124,22 @@ pub fn vertical_interrupt_event(device: &mut device::Device) {
*/
let elapsed = device.vi.last_vi_time.elapsed();
if elapsed < device.vi.vi_period {
let diff = device.vi.vi_period - elapsed;
std::thread::sleep(diff);
if elapsed <= device.vi.vi_period {
let sleep_time = device.vi.vi_period - elapsed;
let remaining_holdover_space = device.vi.vi_period - device.vi.holdover; // holdover can't exceed the vi period
if sleep_time <= remaining_holdover_space {
device.vi.holdover += sleep_time; // donate all time to the holdover
} else {
device.vi.holdover += remaining_holdover_space; // max out holdover
std::thread::sleep(sleep_time - remaining_holdover_space); // sleep the rest of the time
}
} else {
let over_time = elapsed - device.vi.vi_period; // this is how much we overshot the vi period
if over_time <= device.vi.holdover {
device.vi.holdover -= over_time; // consume some holdover
} else {
device.vi.holdover -= device.vi.holdover; // consume all holdover
}
}
device.vi.last_vi_time = std::time::Instant::now();