summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--client/Cargo.toml1
-rw-r--r--client/src/download.rs5
-rw-r--r--client/src/scene_prepare.rs26
-rw-r--r--client/src/state.rs4
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::<u32>()) as u32),
);
debug!(
- "index buffer created (len={}) {pres}",
- buf.len() / size_of::<u32>()
+ "index buffer created (len={}, took {:?}) {pres}",
+ buf.len() / size_of::<u32>(),
+ 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::<f32>()) as u32),
);
debug!(
- "vertex attribute buffer created (len={}) {pres}",
- buf.len() / size_of::<f32>()
+ "vertex attribute buffer created (len={}, took {:?}) {pres}",
+ buf.len() / size_of::<f32>(),
+ 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<State<'a>> {
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(),