Compare commits
4 Commits
master
...
2d22de28b9
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d22de28b9 | |||
| 9bb2f4c20d | |||
| 72ebb412f0 | |||
| f3167ac12d |
@@ -10,4 +10,10 @@ bytemuck = "1.14.0"
|
|||||||
env_logger = "0.10.0"
|
env_logger = "0.10.0"
|
||||||
pollster = "0.3.0"
|
pollster = "0.3.0"
|
||||||
wgpu = "0.17.0"
|
wgpu = "0.17.0"
|
||||||
winit = "0.28.6"
|
winit = "0.28.6"
|
||||||
|
criterion = { version = "0.4", features = ["html_reports"] }
|
||||||
|
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
name = "voxel_map_benchmark"
|
||||||
|
harness = false
|
||||||
37
benches/voxel_map_benchmark.rs
Normal file
37
benches/voxel_map_benchmark.rs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
||||||
|
|
||||||
|
const MAP_WIDTH: usize = 100;
|
||||||
|
const MAP_HEIGHT: usize = 100;
|
||||||
|
const MAP_DEPTH: usize = 100;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
struct Voxel {
|
||||||
|
r: u8, g: u8, b: u8
|
||||||
|
}
|
||||||
|
|
||||||
|
fn voxel_vec_1d(data: Vec<Voxel>) -> Voxel {
|
||||||
|
const X: usize = 0;
|
||||||
|
const Y: usize = 0;
|
||||||
|
const Z: usize = 0;
|
||||||
|
|
||||||
|
return data[X + Y * MAP_WIDTH + Z * MAP_WIDTH * MAP_HEIGHT];
|
||||||
|
}
|
||||||
|
|
||||||
|
fn voxel_vec_3d(data: Vec<Vec<Vec<Voxel>>>) -> Voxel {
|
||||||
|
const X: usize = 0;
|
||||||
|
const Y: usize = 0;
|
||||||
|
const Z: usize = 0;
|
||||||
|
|
||||||
|
return data[X][Y][Z];
|
||||||
|
}
|
||||||
|
|
||||||
|
fn criterion_benchmark(c: &mut Criterion) {
|
||||||
|
let vec_1d = vec![Voxel { r: 0, g: 0, b: 0 }; MAP_WIDTH * MAP_HEIGHT * MAP_DEPTH];
|
||||||
|
let vec_3d = vec![vec![vec![Voxel { r: 0, g: 0, b: 0 }; MAP_DEPTH]; MAP_HEIGHT]; MAP_WIDTH];
|
||||||
|
|
||||||
|
c.bench_function("voxels in 1d vector", |b| b.iter(|| voxel_vec_1d(black_box(vec_1d.clone()))));
|
||||||
|
c.bench_function("voxels in 3d vector", |b| b.iter(|| voxel_vec_3d(black_box(vec_3d.clone()))));
|
||||||
|
}
|
||||||
|
|
||||||
|
criterion_group!(benches, criterion_benchmark);
|
||||||
|
criterion_main!(benches);
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
mod voxel;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use winit::{
|
use winit::{
|
||||||
event::{Event, WindowEvent},
|
event::{Event, WindowEvent},
|
||||||
|
|||||||
59
src/voxel.rs
Normal file
59
src/voxel.rs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#[derive(PartialEq, Clone, Copy, Debug)]
|
||||||
|
struct Voxel {
|
||||||
|
r: u8, g: u8, b: u8
|
||||||
|
}
|
||||||
|
|
||||||
|
const AIR_VOXEL: Voxel = Voxel { r: 0, g: 0, b: 0 };
|
||||||
|
|
||||||
|
struct VoxelMap {
|
||||||
|
data: Vec<Voxel>,
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
depth: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VoxelMap {
|
||||||
|
fn new(width: usize, height: usize, depth: usize) -> Self {
|
||||||
|
Self {
|
||||||
|
data: vec![AIR_VOXEL; width * height * depth],
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
depth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set(&mut self, x: usize, y: usize, z: usize, voxel: Voxel) {
|
||||||
|
if x < self.width && y < self.height && z < self.depth {
|
||||||
|
self.data[x + y * self.width + z * self.width * self.height] = voxel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, x: usize, y: usize, z: usize) -> Voxel {
|
||||||
|
if x < self.width && y < self.height && z < self.depth {
|
||||||
|
self.data[x + y * self.width + z * self.width * self.height]
|
||||||
|
} else {
|
||||||
|
AIR_VOXEL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_voxel_map() {
|
||||||
|
let mut map = VoxelMap::new(10, 10, 10);
|
||||||
|
map.set(0, 0, 0, Voxel { r: 255, g: 0, b: 0 });
|
||||||
|
assert_eq!(map.get(0, 0, 0), Voxel { r: 255, g: 0, b: 0 });
|
||||||
|
assert_eq!(map.get(1, 0, 0), AIR_VOXEL);
|
||||||
|
assert_eq!(map.get(0, 1, 0), AIR_VOXEL);
|
||||||
|
assert_eq!(map.get(0, 0, 1), AIR_VOXEL);
|
||||||
|
assert_eq!(map.get(10, 0, 0), AIR_VOXEL);
|
||||||
|
assert_eq!(map.get(0, 10, 0), AIR_VOXEL);
|
||||||
|
assert_eq!(map.get(0, 0, 10), AIR_VOXEL);
|
||||||
|
|
||||||
|
// out of bounds
|
||||||
|
assert_eq!(map.get(0, 0, 11), AIR_VOXEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user