From 9aa19f021c79b4495b9dd6b188422c3669bfae83 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sun, 26 Jul 2026 21:05:21 +0200 Subject: [PATCH] Viewer: reciprocal-space view does nothing while its window is closed The window is a placeholder for future functionality and is closed almost all of the time, but it extracted the frame's spots and rebuilt and uploaded its vertex arrays on every image, whether or not anything was on screen. Guard it in rebuildGL() rather than at each of the eight call sites, so any future caller inherits the behaviour: while hidden it only records that a rebuild is owed, and showEvent() pays it. imageLoaded() additionally skips extracting the frame's spots, which is the other half of the per-frame work. The OpenGL code path is untouched and still built and exercised the moment the window is opened. Note: I could not show a CPU saving for this on the headless test machine -- there, ~74% of the process CPU is Mesa llvmpipe software rasterisation that I was unable to attribute to any per-frame code path, and it swamps the effect. The work being skipped is nonetheless unambiguously unnecessary. Verified in the GUI: after stepping frames with the window closed, opening it shows the current frame's spots, and it keeps updating while open. Co-Authored-By: Claude Opus 5 (1M context) --- .../JFJochViewerReciprocalSpaceWindow.cpp | 29 +++++++++++++++++++ .../JFJochViewerReciprocalSpaceWindow.h | 5 ++++ 2 files changed, 34 insertions(+) diff --git a/viewer/windows/JFJochViewerReciprocalSpaceWindow.cpp b/viewer/windows/JFJochViewerReciprocalSpaceWindow.cpp index 0eb41f23..1c992796 100644 --- a/viewer/windows/JFJochViewerReciprocalSpaceWindow.cpp +++ b/viewer/windows/JFJochViewerReciprocalSpaceWindow.cpp @@ -472,6 +472,12 @@ void JFJochViewerReciprocalSpaceWindow::imageLoaded(std::shared_ptrisChecked() && has_rotation_; std::optional plot_lattice; diff --git a/viewer/windows/JFJochViewerReciprocalSpaceWindow.h b/viewer/windows/JFJochViewerReciprocalSpaceWindow.h index 67d5a6c1..22a3d619 100644 --- a/viewer/windows/JFJochViewerReciprocalSpaceWindow.h +++ b/viewer/windows/JFJochViewerReciprocalSpaceWindow.h @@ -143,7 +143,12 @@ private: }; QColor spotColorFor(bool indexed, bool ice_ring) const; + // rebuildGL() is a no-op while the window is closed - it only records that a rebuild is + // owed, and showEvent() pays it. rebuildGLNow() is the actual work. void rebuildGL(); // rebuilds both spot and line vertex data + void rebuildGLNow(); + void showEvent(QShowEvent *event) override; + bool pending_rebuild_ = false; void loadCurrentImageSpots(std::shared_ptr image); void addSpot(const SpotToSave &s, const DiffractionGeometry &geom,