From a3e3b724d4fe97f251e830197527f3a106b0a890 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 12 Jan 2025 01:12:34 +0100 Subject: enable persistant cache + print timing info --- Cargo.lock | 1 + client/Cargo.toml | 1 + client/src/download.rs | 5 +++++ client/src/scene_prepare.rs | 26 ++++++++++++++++++++------ client/src/state.rs | 4 +++- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f36056..2b1f2b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3022,6 +3022,7 @@ dependencies = [ "weareshared", "wgpu", "winit", + "xdg", ] [[package]] diff --git a/client/Cargo.toml b/client/Cargo.toml index a020315..77149b2 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -20,3 +20,4 @@ image = "0.25.5" egui-wgpu = "0.30.0" egui = { version = "0.30.0", features = ["bytemuck"] } bytemuck = "1.21.0" +xdg = "2.5.2" diff --git a/client/src/download.rs b/client/src/download.rs index bc3de09..85cce32 100644 --- a/client/src/download.rs +++ b/client/src/download.rs @@ -55,6 +55,11 @@ impl Downloader { let mut state = self.inner.write().unwrap(); if state.have.contains(&hash) { state.store.get_raw(hash) + } else if state.need.contains(&hash) { + Ok(None) + } else if let Some(res) = state.store.get_raw(hash)? { + state.have.insert(hash); + Ok(Some(res)) } else { state.need.insert(hash); Ok(None) diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index 0fb38cc..8b2453a 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -17,13 +17,14 @@ use crate::download::Downloader; use anyhow::Result; use image::ImageReader; -use log::debug; +use log::{debug, info}; use std::{ collections::{HashMap, HashSet}, hash::Hash, io::Cursor, marker::PhantomData, sync::{Arc, RwLock}, + time::Instant, }; use weareshared::{ Affine3A, @@ -129,6 +130,7 @@ impl ScenePreparer { } } for pres in self.index_buffers.needed() { + let start = Instant::now(); if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf .into_iter() @@ -145,12 +147,14 @@ impl ScenePreparer { (Arc::new(buffer), (buf.len() / size_of::()) as u32), ); debug!( - "index buffer created (len={}) {pres}", - buf.len() / size_of::() + "index buffer created (len={}, took {:?}) {pres}", + buf.len() / size_of::(), + start.elapsed(), ); } } for pres in self.vertex_buffers.needed() { + let start = Instant::now(); if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf .into_iter() @@ -166,15 +170,18 @@ impl ScenePreparer { (Arc::new(buffer), (buf.len() / size_of::()) as u32), ); debug!( - "vertex attribute buffer created (len={}) {pres}", - buf.len() / size_of::() + "vertex attribute buffer created (len={}, took {:?}) {pres}", + buf.len() / size_of::(), + start.elapsed() ); } } for pres in self.textures.needed() { + let start = Instant::now(); if let Some(buf) = dls.try_get(pres.clone())? { let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; let image = image.decode()?; + let dims = (image.width(), image.height()); let image = image.to_rgba8(); let image_raw = image.to_vec(); let tex_bg = create_texture( @@ -186,6 +193,12 @@ impl ScenePreparer { image.height(), ); self.textures.insert(pres.clone(), tex_bg); + info!( + "texture created (res={}x{}, took {:?})", + dims.0, + dims.1, + start.elapsed() + ) } } for pres in self.placeholder_textures.needed() { @@ -200,6 +213,7 @@ impl ScenePreparer { self.placeholder_textures.insert(pres, tex_bg); } for pres in self.mesh_parts.needed() { + let start = Instant::now(); if let Some(part) = dls.try_get(pres.clone())? { if let (Some(indexres), Some(positionres)) = (part.index, part.va_position) { let index = self.index_buffers.try_get(indexres); @@ -258,7 +272,7 @@ impl ScenePreparer { Some(tex_albedo), ) = (normal, index, texcoord, position, tex_normal, tex_albedo) { - debug!("part created ({pres})"); + debug!("part created (took {:?}) {pres}", start.elapsed()); self.mesh_parts.insert( pres, Arc::new(RMeshPart { diff --git a/client/src/state.rs b/client/src/state.rs index cb7316d..623caaa 100644 --- a/client/src/state.rs +++ b/client/src/state.rs @@ -52,7 +52,9 @@ pub struct InputState { impl<'a> State<'a> { pub fn new(conn: TcpStream, window: &'a winit::window::Window) -> Result> { info!("new state"); - let downloader = Arc::new(Downloader::new(ResourceStore::new_memory())); + let downloader = Arc::new(Downloader::new(ResourceStore::new_persistent( + &xdg::BaseDirectories::with_prefix("weareclient")?.place_cache_file("resources")?, + )?)); Ok(Self { camera: Camera::new(), network: Network::new(conn).into(), -- cgit v1.2.3-70-g09d2