Make image Cache eviction strategy less aggressive in iced_wgpu

Instead of trimming unconditionally at the end of
a frame, we now trim the cache only when there is a
cache miss.

This way, images that are not visible but still a
part of the layout will stay cached. Eviction will
only happen when the images are not a part of the
UI for two consectuive frames.
This commit is contained in:
Héctor Ramón Jiménez 2024-04-24 21:29:30 +02:00
parent fdcec03197
commit 493c36ac71
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
6 changed files with 41 additions and 5 deletions

View file

@ -40,6 +40,7 @@ impl Memory {
pub struct Cache {
map: FxHashMap<u64, Memory>,
hits: FxHashSet<u64>,
should_trim: bool,
}
impl Cache {
@ -55,6 +56,8 @@ impl Cache {
Err(_) => Memory::Invalid,
};
self.should_trim = true;
self.insert(handle, memory);
self.get(handle).unwrap()
}
@ -86,6 +89,11 @@ impl Cache {
/// Trim cache misses from cache
pub fn trim(&mut self, atlas: &mut Atlas) {
// Only trim if new entries have landed in the `Cache`
if !self.should_trim {
return;
}
let hits = &self.hits;
self.map.retain(|k, memory| {
@ -101,6 +109,7 @@ impl Cache {
});
self.hits.clear();
self.should_trim = false;
}
fn get(&mut self, handle: &image::Handle) -> Option<&mut Memory> {