65 lines
1.6 KiB
Rust
65 lines
1.6 KiB
Rust
use std::time::Instant;
|
|
const UPDATE_INTERVAL: u32 = 40;
|
|
const MAX_FRAMESKIP: u32 = 5;
|
|
|
|
fn main() {
|
|
// track the delta time (the duration of the previous loop in milliseconds)
|
|
let mut delta_time: u32 = 0;
|
|
|
|
loop {
|
|
// start per-loop delay timer
|
|
let timer = Instant::now();
|
|
|
|
// track the number of update ticks
|
|
let mut ticks: u32 = 0;
|
|
|
|
update(&mut delta_time, &mut ticks);
|
|
|
|
display();
|
|
|
|
// update the delta time
|
|
let elapsed_time: u32 = timer.elapsed().as_millis() as u32;
|
|
delta_time += elapsed_time;
|
|
}
|
|
}
|
|
|
|
// update function
|
|
fn update(delta_time: &mut u32, ticks: &mut u32) {
|
|
// keep going even if frames aren't displaying, but halt if there are too many frameskips
|
|
while *delta_time >= UPDATE_INTERVAL && *ticks < MAX_FRAMESKIP {
|
|
println!("Updating...");
|
|
waste_time(64);
|
|
|
|
// record the tick and reset the delta time
|
|
*ticks += 1;
|
|
*delta_time = 0;
|
|
}
|
|
}
|
|
|
|
// render function
|
|
fn display() {
|
|
println!("Displaying...");
|
|
waste_time(32);
|
|
}
|
|
|
|
// 1D linear interpolation
|
|
fn lerp_1d(x: f64, y: f64, a: f64) -> f64 {
|
|
x + ((y - x) * a)
|
|
}
|
|
|
|
// busywork function
|
|
fn waste_time(repeat: u32) {
|
|
const BUFFER_RESOLUTION: usize = 512;
|
|
|
|
// create an RGBA buffer and change every pixel one-by-one
|
|
let mut rgba_buffer = vec![[[0.0f32; 4]; BUFFER_RESOLUTION]; BUFFER_RESOLUTION];
|
|
|
|
// change every pixel in the buffer (repeat) times
|
|
for _n in 0..repeat {
|
|
for u in 0..BUFFER_RESOLUTION {
|
|
for v in 0..BUFFER_RESOLUTION {
|
|
rgba_buffer[u][v] = [1.0f32; 4];
|
|
}
|
|
}
|
|
}
|
|
} |