Threaded loading chunks

This commit is contained in:
Piotrek
2021-05-14 12:10:44 +02:00
parent 120049d9f7
commit c1f3d0f398
4 changed files with 41 additions and 12 deletions
+2 -2
View File
@@ -6,13 +6,13 @@ pub const SIZE_QB: usize = SIZE*SIZE*SIZE;
#[derive(Clone)] #[derive(Clone)]
pub struct WorldBlock { pub struct WorldBlock {
pub materials: [u8;SIZE_QB] pub materials: Box<[u8;SIZE_QB]>
} }
impl WorldBlock { impl WorldBlock {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
materials: [0_u8; SIZE_QB] materials: Box::new([0_u8; SIZE_QB])
} }
} }
+33 -4
View File
@@ -1,3 +1,7 @@
use std::sync::Arc;
use std::time::Instant;
use std::thread;
use std::sync::mpsc;
use crate::game::RendererView; use crate::game::RendererView;
use byteorder::LittleEndian; use byteorder::LittleEndian;
use byteorder::ByteOrder; use byteorder::ByteOrder;
@@ -9,6 +13,8 @@ pub const SIZE: usize = 32;
const SIZE_SQ: usize = SIZE*SIZE; const SIZE_SQ: usize = SIZE*SIZE;
const SIZE_QB: usize = SIZE*SIZE*SIZE; const SIZE_QB: usize = SIZE*SIZE*SIZE;
const NUM_WORKERS: usize = 8;
// 1 chunk times on i7-5930K // 1 chunk times on i7-5930K
// alg | size | compr | decom // alg | size | compr | decom
// raw 32.89kB 0.06s 1.19s // raw 32.89kB 0.06s 1.19s
@@ -47,16 +53,39 @@ impl WorldChunk {
} }
// Blocks // Blocks
let timer = Instant::now();
let mut block_bytes = vec![0_u8; num_blocks*SIZE_QB]; let mut block_bytes = vec![0_u8; num_blocks*SIZE_QB];
lz4::decompress(&block_bytes_compressed, &mut block_bytes[0..num_blocks*SIZE_QB]).unwrap(); lz4::decompress(&block_bytes_compressed, &mut block_bytes[0..num_blocks*SIZE_QB]).unwrap();
let block_bytes = Arc::new(block_bytes);
for i in 0..num_blocks { // Spawn workers
let (tx, rx) = mpsc::channel();
let per_worker = num_blocks / NUM_WORKERS;
let mut workers = vec![];
for t in 0..NUM_WORKERS {
let by = block_bytes.clone();
let tx = tx.clone();
// Each worker will process their part
workers.push(thread::spawn(move || {
for i in t*per_worker..(t+1)*per_worker {
let mut block = WorldBlock::new(); let mut block = WorldBlock::new();
let idx = i * block::SIZE_QB; let idx = i * block::SIZE_QB;
block.materials.clone_from_slice(&block_bytes[idx..idx+block::SIZE_QB]); block.materials.clone_from_slice(&by[idx..idx+block::SIZE_QB]);
instance.blocks.push(block); tx.send((i, block)).unwrap();
}
}));
} }
// Wait for workers to finish.
for handle in workers { handle.join().unwrap(); }
let mut blocks: Vec<(usize, WorldBlock)> = rx.try_iter().collect();
// Sort and add result blocks to chunk
blocks.sort_by(|a, b| (*a).0.cmp(&(*b).0));
for b in blocks { instance.blocks.push(b.1); }
println!("Blocks: {} ms, {}", timer.elapsed().as_millis(), instance.blocks.len());
instance instance
} }
@@ -76,7 +105,7 @@ impl WorldChunk {
// Blocks // Blocks
let mut buf = Vec::new(); let mut buf = Vec::new();
for block in self.blocks.iter() { for block in self.blocks.iter() {
buf.extend(&block.materials); buf.extend(&block.materials[..]);
} }
lz4::compress_to_vec(&buf, &mut bytes, lz4::ACC_LEVEL_DEFAULT).unwrap(); lz4::compress_to_vec(&buf, &mut bytes, lz4::ACC_LEVEL_DEFAULT).unwrap();
+1 -1
View File
@@ -127,7 +127,7 @@ impl Content {
let block_origin = wgpu::Origin3d{ x: (x*BLOCK_SIZE) as u32, y: (y*BLOCK_SIZE) as u32, z: (z*BLOCK_SIZE) as u32 }; let block_origin = wgpu::Origin3d{ x: (x*BLOCK_SIZE) as u32, y: (y*BLOCK_SIZE) as u32, z: (z*BLOCK_SIZE) as u32 };
let block_size = wgpu::Extent3d{ width: BLOCK_SIZE as u32, height: BLOCK_SIZE as u32, depth: BLOCK_SIZE as u32 }; let block_size = wgpu::Extent3d{ width: BLOCK_SIZE as u32, height: BLOCK_SIZE as u32, depth: BLOCK_SIZE as u32 };
let block_bytes : [u8;BLOCK_SIZE*BLOCK_SIZE*BLOCK_SIZE] = block.materials.try_into().unwrap(); let block_bytes : [u8;BLOCK_SIZE*BLOCK_SIZE*BLOCK_SIZE] = block.materials[..].try_into().unwrap();
//println!("Y: {} Z: {}", y, z); //println!("Y: {} Z: {}", y, z);
+3 -3
View File
@@ -19,9 +19,9 @@ impl RendererView for Renderer {
} }
fn shift(&mut self, offset: &Vector3<i32>) { fn shift(&mut self, offset: &Vector3<i32>) {
self.buffers.content.shift(offset); //self.buffers.content.shift(offset);
self.world_offset += *offset; //self.world_offset += *offset;
println!("World shifted by {:?}. World offset is now {:?}", offset, self.world_offset); //println!("World shifted by {:?}. World offset is now {:?}", offset, self.world_offset);
} }
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform { fn get_camera_transform(&mut self) -> &mut dyn CameraTransform {