diff --git a/Cargo.lock b/Cargo.lock index 7bcffb27..50ff0fce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2094,7 +2094,7 @@ dependencies = [ [[package]] name = "freya" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "cfg-if", "freya-android", @@ -2117,7 +2117,7 @@ dependencies = [ [[package]] name = "freya-android" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-components", "freya-core", @@ -2130,7 +2130,7 @@ dependencies = [ [[package]] name = "freya-animation" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "easer", "freya-core", @@ -2139,7 +2139,7 @@ dependencies = [ [[package]] name = "freya-clipboard" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "copypasta", "freya-core", @@ -2148,7 +2148,7 @@ dependencies = [ [[package]] name = "freya-components" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "accesskit", "anyhow", @@ -2174,7 +2174,7 @@ dependencies = [ [[package]] name = "freya-core" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "accesskit", "async-io", @@ -2204,7 +2204,7 @@ dependencies = [ [[package]] name = "freya-edit" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "bitflags 2.13.1", "freya-clipboard", @@ -2218,7 +2218,7 @@ dependencies = [ [[package]] name = "freya-engine" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-skia-safe", ] @@ -2226,7 +2226,7 @@ dependencies = [ [[package]] name = "freya-markdown" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-components", "freya-core", @@ -2237,7 +2237,7 @@ dependencies = [ [[package]] name = "freya-performance-plugin" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-core", "freya-engine", @@ -2247,7 +2247,7 @@ dependencies = [ [[package]] name = "freya-query" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-core", "futures-util", @@ -2256,7 +2256,7 @@ dependencies = [ [[package]] name = "freya-radio" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-core", ] @@ -2264,7 +2264,7 @@ dependencies = [ [[package]] name = "freya-router" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-core", "freya-router-macro", @@ -2276,7 +2276,7 @@ dependencies = [ [[package]] name = "freya-router-macro" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "proc-macro2", "quote", @@ -2287,7 +2287,7 @@ dependencies = [ [[package]] name = "freya-sdk" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "freya-core", ] @@ -2336,7 +2336,7 @@ dependencies = [ [[package]] name = "freya-testing" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "accesskit", "freya-clipboard", @@ -2351,7 +2351,7 @@ dependencies = [ [[package]] name = "freya-winit" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "accesskit", "accesskit_winit", @@ -4906,7 +4906,7 @@ checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pathgraph" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" [[package]] name = "percent-encoding" @@ -5333,7 +5333,7 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "ragnarok" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "euclid", "hotpath", @@ -7134,7 +7134,7 @@ checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "torin" version = "0.5.0-rc.4" -source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#631db7cd14befdf6daf3b7c73e6e36117bffaf59" +source = "git+https://github.com/marc2332/freya?branch=fix%2Fskip-basic-render-driver#56c6e694084210a8405a8cf9e50a1e236a64efd3" dependencies = [ "euclid", "itertools 0.14.0", diff --git a/Cargo.toml b/Cargo.toml index 5b2592db..129d8d21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -159,3 +159,11 @@ inherits = "release" debug = true strip = false + +[profile.release-fastprofiling] +inherits = "release" + +codegen-units = 16 +debug = true +lto = false +strip = false diff --git a/packages/oneclient_app/assets/backgrounds/CavesAndCliffs.jpg b/packages/oneclient_app/assets/backgrounds/CavesAndCliffs.jpg index 7a951f7b..8b0f2e1e 100644 Binary files a/packages/oneclient_app/assets/backgrounds/CavesAndCliffs.jpg and b/packages/oneclient_app/assets/backgrounds/CavesAndCliffs.jpg differ diff --git a/packages/oneclient_app/src/layout/animated_outlet.rs b/packages/oneclient_app/src/layout/animated_outlet.rs index 859f97b4..5938c37a 100644 --- a/packages/oneclient_app/src/layout/animated_outlet.rs +++ b/packages/oneclient_app/src/layout/animated_outlet.rs @@ -218,7 +218,7 @@ impl Component for AnimatedAppOutlet { } }; - let overlay = show_overlay.then(|| appshell_overlay().opacity(chrome_opacity)); + let overlay = show_overlay.then(|| appshell_overlay(chrome_opacity)); let back = (!is_home).then(|| { rect() diff --git a/packages/oneclient_app/src/layout/app_shell.rs b/packages/oneclient_app/src/layout/app_shell.rs index f5df1122..a7ef69d6 100644 --- a/packages/oneclient_app/src/layout/app_shell.rs +++ b/packages/oneclient_app/src/layout/app_shell.rs @@ -229,7 +229,10 @@ fn copy_error_button(message: &str, dispatch: crate::Actions) -> impl IntoElemen .into_element() } -pub(crate) fn appshell_overlay() -> Rect { +pub(crate) fn appshell_overlay(alpha: f32) -> Rect { + let alpha = alpha.clamp(0., 1.); + let scale = |a: u8| (f32::from(a) * alpha).round() as u8; + rect() .width(Size::fill()) .height(Size::fill()) @@ -242,15 +245,15 @@ pub(crate) fn appshell_overlay() -> Rect { .width(Size::fill()) .background( LinearGradient::new() - .stop((Color::BLACK.with_a(100), 0.)) - .stop((colors::page().with_a(255), 95.0)), + .stop((Color::BLACK.with_a(scale(100)), 0.)) + .stop((colors::page().with_a(scale(255)), 95.0)), ), ) .child( rect() .height(Size::fill()) .width(Size::fill()) - .background(colors::page()), + .background(colors::page().with_a(scale(255))), ) } diff --git a/packages/oneclient_app/src/main.rs b/packages/oneclient_app/src/main.rs index ceb56952..ce21464e 100644 --- a/packages/oneclient_app/src/main.rs +++ b/packages/oneclient_app/src/main.rs @@ -239,7 +239,7 @@ fn main() { std::env::var("ONECLIENT_GPU_CACHE_BYTES") .ok() .and_then(|v| v.parse::().ok()) - .unwrap_or(512 * 1024 * 1024), + .unwrap_or(96 * 1024 * 1024), ) .with_default_font(theme::DEFAULT_FONT); diff --git a/packages/oneclient_core/src/images/mod.rs b/packages/oneclient_core/src/images/mod.rs index 679e8a55..71d5370b 100644 --- a/packages/oneclient_core/src/images/mod.rs +++ b/packages/oneclient_core/src/images/mod.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, VecDeque}; use std::path::PathBuf; use bytes::Bytes; @@ -11,14 +11,63 @@ use oneclient_common::paths; use oneclient_net::RequestClient; use crate::{LauncherError, LauncherResult}; -pub const DEFAULT_IMAGE_EDGE: u32 = 1600; +pub const DEFAULT_IMAGE_EDGE: u32 = 1200; /// Image urls come from untrusted remote descriptions, so cap what is fetched and decoded. const MAX_IMAGE_BYTES: usize = 8 * 1024 * 1024; +/// Every decoded image also stays on disk +/// one entry per (url, max_edge) pair for every image during the lifetme of the program +const MEMORY_CACHE_BUDGET: usize = 32 * 1024 * 1024; + +#[derive(Debug, Default)] +struct MemoryCache { + entries: HashMap, + order: VecDeque, + bytes: usize, +} + +impl MemoryCache { + fn get(&mut self, key: &str) -> Option { + let hit = self.entries.get(key)?.clone(); + if let Some(at) = self.order.iter().position(|k| k == key) { + self.order.remove(at); + } + self.order.push_back(key.to_string()); + Some(hit) + } + + fn insert(&mut self, key: String, value: Bytes) { + // A single oversized image must not evict the entire cache to store itself. + if value.len() > MEMORY_CACHE_BUDGET { + return; + } + + if let Some(old) = self.entries.remove(&key) { + self.bytes -= old.len(); + if let Some(at) = self.order.iter().position(|k| *k == key) { + self.order.remove(at); + } + } + + self.bytes += value.len(); + self.entries.insert(key.clone(), value); + self.order.push_back(key); + + while self.bytes > MEMORY_CACHE_BUDGET { + let Some(oldest) = self.order.pop_front() else { + break; + }; + if let Some(dropped) = self.entries.remove(&oldest) { + self.bytes -= dropped.len(); + } + } + } +} + #[derive(Debug, Default)] pub struct ImageCacheStore { - memory: Mutex>, + memory: Mutex, } impl ImageCacheStore { @@ -35,7 +84,7 @@ impl ImageCacheStore { max_edge: u32, ) -> LauncherResult { let mem_key = Self::mem_key(url, max_edge); - if let Some(hit) = self.memory.lock().await.get(&mem_key).cloned() { + if let Some(hit) = self.memory.lock().await.get(&mem_key) { return Ok(hit); }