perf: optimise used memory

This commit is contained in:
LynithDev 2026-09-07 23:29:39 +02:00
parent 0e49c69176
commit a70a8a4ffa
7 changed files with 90 additions and 30 deletions

40
Cargo.lock generated
View file

@ -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",

View file

@ -159,3 +159,11 @@ inherits = "release"
debug = true
strip = false
[profile.release-fastprofiling]
inherits = "release"
codegen-units = 16
debug = true
lto = false
strip = false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 619 KiB

After

Width:  |  Height:  |  Size: 390 KiB

View file

@ -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()

View file

@ -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))),
)
}

View file

@ -239,7 +239,7 @@ fn main() {
std::env::var("ONECLIENT_GPU_CACHE_BYTES")
.ok()
.and_then(|v| v.parse::<usize>().ok())
.unwrap_or(512 * 1024 * 1024),
.unwrap_or(96 * 1024 * 1024),
)
.with_default_font(theme::DEFAULT_FONT);

View file

@ -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<String, Bytes>,
order: VecDeque<String>,
bytes: usize,
}
impl MemoryCache {
fn get(&mut self, key: &str) -> Option<Bytes> {
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<HashMap<String, Bytes>>,
memory: Mutex<MemoryCache>,
}
impl ImageCacheStore {
@ -35,7 +84,7 @@ impl ImageCacheStore {
max_edge: u32,
) -> LauncherResult<Bytes> {
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);
}