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