mirror of
https://github.com/gopher64/gopher64.git
synced 2026-07-11 01:25:20 +02:00
rework frame limiter
This commit is contained in:
@@ -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
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user