forked from 1b-agent/opencadstudio-upstream
perf(clipboard): keep large copy/paste responsive
Copying and pasting a whole drawing froze the app. Three synchronous, main-thread hot spots scaled with the full document rather than the selection: - Copy centroid did a linear document scan per selected handle (wire_models_for / mirror_preview_parts), making copy O(H*N). Use the document's O(1) handle index instead. - The paste ghost translated every point of every clipboard wire on each mouse move — O(points) per frame, which stalls placement of a huge selection. Above a point budget, rubber-band a single bounding-box outline instead (O(1) per frame). - finalize_paste re-tessellated every solid in the document on each paste. add_entity already tessellates pasted solids, so switch to the incremental populate_missing_meshes_from_document.
This commit is contained in:
1 parent
a4f7ee376f
commit
30b907cdd6
3 files changed
+76
-6
No files matched your search
@@ -2080,7 +2080,12 @@ impl OpenCADStudio {
|
||||
})
|
||||
.collect();
|
||||
self.merge_clipboard_ext_objects(i, &by_index);
|
||||
self.tabs[i].scene.populate_meshes_from_document();
|
||||
// Incremental: `add_entity` already tessellated every pasted top-level
|
||||
// solid, and existing document solids are still cached — so only newly
|
||||
// introduced block-definition solids need building. The full rebuild
|
||||
// would clear and re-tessellate the entire document (every solid in the
|
||||
// drawing) on each paste, which is what made a large paste stall.
|
||||
self.tabs[i].scene.populate_missing_meshes_from_document();
|
||||
by_index
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user