From 9335f7193ae666c378f5011e1eb90db5721e43fd Mon Sep 17 00:00:00 2001 From: metamuffin Date: Fri, 10 Jan 2025 17:49:37 +0100 Subject: multithreaded world loading --- client/src/scene_prepare.rs | 46 +++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) (limited to 'client/src/scene_prepare.rs') diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index f74277c..ae7e599 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -22,7 +22,7 @@ use std::{ collections::{HashMap, HashSet}, hash::Hash, io::Cursor, - sync::Arc, + sync::{Arc, RwLock}, }; use weareshared::{ Affine3A, @@ -37,25 +37,36 @@ use wgpu::{ }; pub struct DemandMap { + inner: RwLock>, +} +struct DemandMapState { values: HashMap, needed: HashSet, } -impl DemandMap { +impl DemandMap { pub fn new() -> Self { Self { - needed: HashSet::new(), - values: HashMap::new(), + inner: DemandMapState { + needed: HashSet::new(), + values: HashMap::new(), + } + .into(), } } - pub fn insert(&mut self, key: K, value: V) { - self.needed.remove(&key); - self.values.insert(key, value); + pub fn needed(&self) -> Vec { + self.inner.read().unwrap().needed.iter().cloned().collect() + } + pub fn insert(&self, key: K, value: V) { + let mut s = self.inner.write().unwrap(); + s.needed.remove(&key); + s.values.insert(key, value); } - pub fn try_get(&mut self, key: K) -> Option { - if let Some(k) = self.values.get(&key) { + pub fn try_get(&self, key: K) -> Option { + let mut s = self.inner.write().unwrap(); + if let Some(k) = s.values.get(&key) { Some(k.to_owned()) } else { - self.needed.insert(key); + s.needed.insert(key); None } } @@ -100,8 +111,8 @@ impl ScenePreparer { queue, } } - pub fn update(&mut self, dls: &mut Downloader) -> Result<()> { - for pres in self.prefabs.needed.clone() { + pub fn update(&self, dls: &Downloader) -> Result<()> { + for pres in self.prefabs.needed() { if let Some(prefab) = dls.try_get(pres.clone())? { let mut rprefab = RPrefab(Vec::new()); for (aff, partres) in &prefab.mesh { @@ -115,7 +126,7 @@ impl ScenePreparer { } } } - for pres in self.index_buffers.needed.clone() { + for pres in self.index_buffers.needed() { if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf .0 @@ -133,7 +144,7 @@ impl ScenePreparer { debug!("index buffer created (len={}) {pres}", buf.len() / 2); } } - for pres in self.vertex_buffers.needed.clone() { + for pres in self.vertex_buffers.needed() { if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf .0 @@ -154,7 +165,7 @@ impl ScenePreparer { ); } } - for pres in self.textures.needed.clone() { + for pres in self.textures.needed() { if let Some(buf) = dls.try_get(pres.clone())? { let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; let image = image.decode()?; @@ -171,7 +182,7 @@ impl ScenePreparer { self.textures.insert(pres.clone(), tex_bg); } } - for pres in self.placeholder_textures.needed.clone() { + for pres in self.placeholder_textures.needed() { let tex_bg = create_texture( &self.device, &self.queue, @@ -182,12 +193,11 @@ impl ScenePreparer { ); self.placeholder_textures.insert(pres, tex_bg); } - for pres in self.mesh_parts.needed.clone() { + for pres in self.mesh_parts.needed() { if let Some(part) = dls.try_get(pres.clone())? { if let (Some(indexres), Some(positionres)) = (part.index, part.va_position) { let Some((index, index_count)) = self.index_buffers.try_get(indexres.clone()) else { - self.index_buffers.needed.insert(indexres); continue; }; let mut position = Vec::new(); -- cgit v1.2.3-70-g09d2