perf: optimise used memory
This commit is contained in:
parent
0e49c69176
commit
a70a8a4ffa
7 changed files with 90 additions and 30 deletions
40
Cargo.lock
generated
40
Cargo.lock
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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))),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue