forked from 1b-agent/opencadstudio-upstream
perf(statusbar): cache layout/scale derived data behind epochs (major)
Status bar rescanned the whole object map twice per frame (layout_names + scale_picker_list), deep-cloned an already-cached Arc, and built two undo/redo label vecs consumed ~never. Cache layout names (epoch key) and scale picker (epoch + unit-factor + imperial-family + current-scale key) as Arc behind choke-point invalidation (layout/scale impl methods, undo/redo swaps, file-open, doc-reset); borrow across the widget boundary (owned-Arc params; E0515 forbids &'a slices over call-site temporaries); build undo/redo labels only when their dropdown is open. Tests: - cached_layout_names_returns_same_arc_until_bump: hit-path Arc identity - cached_layout_names_invalidated_by_add_layout: bump yields new Arc + names - cached_scale_picker_returns_same_arc_until_bump: hit-path Arc identity - cached_scale_picker_invalidated_by_add_scale: bump yields new Arc + scale - cached_scale_picker_invalidated_by_current_scale_change: key completeness Bench (cargo bench ui_statusbar_derived_data, 3k entities): cached hit below timer granularity vs ~1us uncached scans, PASS (50us threshold).
This commit is contained in:
1 parent
baba5bccd3
commit
dcc05f310d
16 files changed
+327
-43
No files matched your search
@@ -1697,6 +1697,8 @@ impl OpenCADStudio {
|
||||
self.install_native_edit_guard(i, &path, opened_fingerprint);
|
||||
self.tabs[i].scene.material_base_dir = path.parent().map(std::path::Path::to_path_buf);
|
||||
self.tabs[i].scene.document = doc;
|
||||
self.tabs[i].scene.bump_layout_epoch();
|
||||
self.tabs[i].scene.bump_scale_epoch();
|
||||
// Load parameters first so imported dimensional constraints
|
||||
// can resolve their named driving values.
|
||||
self.tabs[i].scene.load_named_parameters_from_document();
|
||||
|
||||
@@ -6657,7 +6657,7 @@ impl OpenCADStudio {
|
||||
.unwrap_or(1);
|
||||
let name = format!("Layout{n}");
|
||||
self.push_undo_snapshot(i, "LAYOUT NEW");
|
||||
match self.tabs[i].scene.document.add_layout(&name) {
|
||||
match self.tabs[i].scene.add_layout(&name) {
|
||||
Ok(_) => {
|
||||
self.tabs[i].dirty = true;
|
||||
self.layout_manager_selected = name.clone();
|
||||
|
||||
@@ -6028,7 +6028,7 @@ properties={:.1}ms picked={}",
|
||||
idx += 1;
|
||||
};
|
||||
self.push_undo_snapshot(i, "LAYOUT");
|
||||
match self.tabs[i].scene.document.add_layout(&new_name) {
|
||||
match self.tabs[i].scene.add_layout(&new_name) {
|
||||
Ok(_) => {
|
||||
let layout_flags = i16::from(
|
||||
self.tabs[i]
|
||||
|
||||
Reference in new issue
Block a user