Added benchmarks and lib.rs
parent
4d604add7a
commit
4148929de5
@ -0,0 +1,78 @@
|
||||
use bencher::Bencher;
|
||||
use pixels::Pixels;
|
||||
use pixels::SurfaceTexture;
|
||||
use rand::Rng;
|
||||
|
||||
#[macro_use]
|
||||
extern crate bencher;
|
||||
|
||||
use purple_rain::draw;
|
||||
use purple_rain::Drop;
|
||||
use winit::event_loop::EventLoop;
|
||||
use winit::window::WindowBuilder;
|
||||
|
||||
pub const WIDTH: u32 = 400;
|
||||
pub const HEIGHT: u32 = 300;
|
||||
|
||||
fn ten_drops(bench: &mut Bencher) {
|
||||
let event_loop = EventLoop::new();
|
||||
let window = WindowBuilder::new()
|
||||
.with_visible(false)
|
||||
.build(&event_loop)
|
||||
.unwrap();
|
||||
|
||||
window.set_visible(false);
|
||||
let mut pixels = {
|
||||
let window_size = window.inner_size();
|
||||
let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window);
|
||||
Pixels::new(WIDTH, HEIGHT, surface_texture)
|
||||
}
|
||||
.unwrap();
|
||||
|
||||
let mut drops = Vec::new();
|
||||
let mut rng = rand::thread_rng();
|
||||
for _i in 0..200 {
|
||||
drops.push(Drop {
|
||||
x: (rng.gen_range(0..WIDTH as i32)),
|
||||
y: (rng.gen_range(0..HEIGHT as i32)),
|
||||
z: (rng.gen_range(1..20)),
|
||||
})
|
||||
}
|
||||
|
||||
bench.iter(|| {
|
||||
draw(&mut drops, pixels.get_frame());
|
||||
})
|
||||
}
|
||||
|
||||
fn one_hundred_drops(bench: &mut Bencher) {
|
||||
let event_loop = EventLoop::new();
|
||||
let window = WindowBuilder::new()
|
||||
.with_visible(false)
|
||||
.build(&event_loop)
|
||||
.unwrap();
|
||||
|
||||
window.set_visible(false);
|
||||
let mut pixels = {
|
||||
let window_size = window.inner_size();
|
||||
let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window);
|
||||
Pixels::new(WIDTH, HEIGHT, surface_texture)
|
||||
}
|
||||
.unwrap();
|
||||
|
||||
let mut drops = Vec::new();
|
||||
let mut rng = rand::thread_rng();
|
||||
for _i in 0..2000 {
|
||||
drops.push(Drop {
|
||||
x: (rng.gen_range(0..WIDTH as i32)),
|
||||
y: (rng.gen_range(0..HEIGHT as i32)),
|
||||
z: (rng.gen_range(1..20)),
|
||||
})
|
||||
}
|
||||
|
||||
bench.iter(|| {
|
||||
draw(&mut drops, pixels.get_frame());
|
||||
})
|
||||
}
|
||||
|
||||
benchmark_group!(drops, ten_drops, one_hundred_drops);
|
||||
benchmark_main!(drops);
|
||||
@ -0,0 +1,44 @@
|
||||
|
||||
pub const WIDTH: u32 = 400;
|
||||
pub const HEIGHT: u32 = 300;
|
||||
|
||||
pub fn draw(drops: &mut Vec<Drop>, frame: &mut [u8]) {
|
||||
let pixels = frame.chunks_exact_mut(4);
|
||||
for pixel in pixels {
|
||||
pixel.copy_from_slice(&[0xd3, 0xb7, 0xf7, 0xff]);
|
||||
}
|
||||
|
||||
drops.iter_mut().for_each(|d| d.update());
|
||||
|
||||
for drop in drops {
|
||||
let mut drawn = false;
|
||||
for y in drop.y..(drop.y + drop.z) {
|
||||
for x in drop.x..(drop.x + drop.z/4) {
|
||||
let res = (y * (WIDTH as i32) * 4 + x * 4).try_into();
|
||||
if res.is_ok() {
|
||||
let i = res.unwrap();
|
||||
|
||||
if i < frame.len() {
|
||||
drawn = true;
|
||||
frame[i..i + 4].copy_from_slice(&[207, 100, 219, 0xff]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if !drawn {
|
||||
drop.y = -drop.z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Drop {
|
||||
pub x: i32,
|
||||
pub y: i32,
|
||||
pub z: i32,
|
||||
}
|
||||
|
||||
impl Drop {
|
||||
fn update(&mut self) {
|
||||
self.y += std::cmp::max(self.z/4, 1);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue