Add `Options::reduce_texture_memory` to free up RAM (#4431)
## Summary This PR introduces a new configuration option `reduce_texture_memory` in `egui`. ## Changes - Added `reduce_texture_memory` option in `egui`. When set to `true`, `egui` will discard the loaded image data after the texture is uploaded to the GPU, reducing memory usage. This is beneficial when handling a large number of images and retaining the image data is unnecessary, potentially saving substantial memory. However, this makes it impossible to serialize the loaded images or render on non-GPU systems. Default is `false`. ## Impact This new configuration option gives users more control over their memory usage, especially when dealing with a large number or large resolution of images. It allows users to optimize their applications based on their specific needs and constraints.
This commit is contained in:
parent
d131b2b580
commit
6f59a14c4d
|
|
@ -28,6 +28,17 @@ impl TextureLoader for DefaultTextureLoader {
|
||||||
let handle = ctx.load_texture(uri, image, texture_options);
|
let handle = ctx.load_texture(uri, image, texture_options);
|
||||||
let texture = SizedTexture::from_handle(&handle);
|
let texture = SizedTexture::from_handle(&handle);
|
||||||
cache.insert((uri.into(), texture_options), handle);
|
cache.insert((uri.into(), texture_options), handle);
|
||||||
|
let reduce_texture_memory = ctx.options(|o| o.reduce_texture_memory);
|
||||||
|
if reduce_texture_memory {
|
||||||
|
let loaders = ctx.loaders();
|
||||||
|
loaders.include.forget(uri);
|
||||||
|
for loader in loaders.bytes.lock().iter().rev() {
|
||||||
|
loader.forget(uri);
|
||||||
|
}
|
||||||
|
for loader in loaders.image.lock().iter().rev() {
|
||||||
|
loader.forget(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(TexturePoll::Ready { texture })
|
Ok(TexturePoll::Ready { texture })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,19 @@ pub struct Options {
|
||||||
|
|
||||||
/// Controls the speed at which we zoom in when doing ctrl/cmd + scroll.
|
/// Controls the speed at which we zoom in when doing ctrl/cmd + scroll.
|
||||||
pub scroll_zoom_speed: f32,
|
pub scroll_zoom_speed: f32,
|
||||||
|
|
||||||
|
/// If `true`, `egui` will discard the loaded image data after
|
||||||
|
/// the texture is loaded onto the GPU to reduce memory usage.
|
||||||
|
///
|
||||||
|
/// In modern GPU rendering, the texture data is not required after the texture is loaded.
|
||||||
|
///
|
||||||
|
/// This is beneficial when using a large number or resolution of images and there is no need to
|
||||||
|
/// retain the image data, potentially saving a significant amount of memory.
|
||||||
|
///
|
||||||
|
/// The drawback is that it becomes impossible to serialize the loaded images or render in non-GPU systems.
|
||||||
|
///
|
||||||
|
/// Default is `false`.
|
||||||
|
pub reduce_texture_memory: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Options {
|
impl Default for Options {
|
||||||
|
|
@ -260,6 +273,7 @@ impl Default for Options {
|
||||||
// Input:
|
// Input:
|
||||||
line_scroll_speed,
|
line_scroll_speed,
|
||||||
scroll_zoom_speed: 1.0 / 200.0,
|
scroll_zoom_speed: 1.0 / 200.0,
|
||||||
|
reduce_texture_memory: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -279,6 +293,7 @@ impl Options {
|
||||||
|
|
||||||
line_scroll_speed,
|
line_scroll_speed,
|
||||||
scroll_zoom_speed,
|
scroll_zoom_speed,
|
||||||
|
reduce_texture_memory,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
use crate::Widget as _;
|
use crate::Widget as _;
|
||||||
|
|
@ -297,6 +312,8 @@ impl Options {
|
||||||
);
|
);
|
||||||
|
|
||||||
ui.checkbox(warn_on_id_clash, "Warn if two widgets have the same Id");
|
ui.checkbox(warn_on_id_clash, "Warn if two widgets have the same Id");
|
||||||
|
|
||||||
|
ui.checkbox(reduce_texture_memory, "Reduce texture memory");
|
||||||
});
|
});
|
||||||
|
|
||||||
use crate::containers::*;
|
use crate::containers::*;
|
||||||
|
|
|
||||||
|
|
@ -184,6 +184,11 @@ impl eframe::App for ImageViewer {
|
||||||
ui.add_space(5.0);
|
ui.add_space(5.0);
|
||||||
ui.label("Aspect ratio is maintained by scaling both sides as necessary");
|
ui.label("Aspect ratio is maintained by scaling both sides as necessary");
|
||||||
ui.checkbox(&mut self.maintain_aspect_ratio, "Maintain aspect ratio");
|
ui.checkbox(&mut self.maintain_aspect_ratio, "Maintain aspect ratio");
|
||||||
|
|
||||||
|
// forget all images
|
||||||
|
if ui.button("Forget all images").clicked() {
|
||||||
|
ui.ctx().forget_all_images();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue