From b2a6cb29a188522d3fce3e08c8101fd2d8a23f8d Mon Sep 17 00:00:00 2001 From: Ioannis Makris Date: Wed, 21 Oct 2026 11:12:12 +0200 Subject: [PATCH] Reuse axis candidate storage and transfer prepared segment spans --- src/core/layout_calculator.cpp | 19 ++++++++++--------- src/core/series_renderer.cpp | 8 +++++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/core/layout_calculator.cpp b/src/core/layout_calculator.cpp index 4ad1206..00c49c7 100644 --- a/src/core/layout_calculator.cpp +++ b/src/core/layout_calculator.cpp @@ -646,6 +646,14 @@ Layout_calculator::result_t Layout_calculator::calculate(const parameters_t& par return params.format_timestamp_func(timestamp_ns, seconds_to_ns(step_seconds)); }; + struct candidate_t + { + std::int64_t t; + float x0; + float x1; + float x_anchor; + }; + std::vector candidates; std::vector> accepted; std::vector> level; @@ -677,14 +685,6 @@ Layout_calculator::result_t Layout_calculator::calculate(const parameters_t& par } } - struct cand - { - std::int64_t t; - float x0; - float x1; - float x_anchor; - }; - std::vector candidates; float right_vis = 0.0f; float pixel_step = 0.0f; float optimistic_width = 0.0f; @@ -695,6 +695,7 @@ Layout_calculator::result_t Layout_calculator::calculate(const parameters_t& par VNM_PLOT_PROFILE_SCOPE( profiler, "renderer.frame.calculate_layout.impl.cache_miss.pass1.horizontal_axis.step_prep"); + candidates.clear(); candidates.reserve(64); right_vis = float(params.usable_width + params.vbar_width); @@ -789,7 +790,7 @@ Layout_calculator::result_t Layout_calculator::calculate(const parameters_t& par break; } - cand candidate{t, x, x, x}; + candidate_t candidate{t, x, x, x}; // Use conservative width estimate for skip optimization. // Must be at least as large as actual label width to avoid skipping visible labels. const float skip_width = std::max(last_width, estimated_label_width); diff --git a/src/core/series_renderer.cpp b/src/core/series_renderer.cpp index 6214dd6..0ccfb18 100644 --- a/src/core/series_renderer.cpp +++ b/src/core/series_renderer.cpp @@ -2266,19 +2266,21 @@ bool Series_renderer::rhi_prepare_series_primitive( if (count == 0) { return false; } - const std::vector segment_spans = + std::vector computed_segment_spans = is_dots ? std::vector{} : builtin_segment_spans(window); - const bool has_segment_span = !segment_spans.empty(); + const bool has_segment_span = !computed_segment_spans.empty(); if (!is_dots && !has_segment_span) { return false; } // Hand the computed spans to the caller so the record pass can reuse them // (empty for DOTS, which draw per-sample instances). if (out_segment_spans) { - *out_segment_spans = segment_spans; + *out_segment_spans = std::move(computed_segment_spans); } + const std::vector& segment_spans = + out_segment_spans ? *out_segment_spans : computed_segment_spans; QRhiRenderTarget* rt = ctx.render_target;