From 8e7e2fa6a1fa851e562556f40b48f11792071ee6 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Sat, 31 May 2025 00:28:04 +0200 Subject: [PATCH 01/28] Debug --- crates/rnote-engine/src/pens/brush.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index 5979de0dd2..4b8057a366 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -18,6 +18,7 @@ use rnote_compose::eventresult::{EventPropagation, EventResult}; use rnote_compose::penevent::{PenEvent, PenProgress}; use rnote_compose::penpath::{Element, Segment}; use std::time::Instant; +use std::time::{Instant, SystemTime}; #[derive(Debug)] enum BrushState { @@ -176,8 +177,11 @@ impl PenBehaviour for Brush { }, pen_event, ) => { - let builder_result = - path_builder.handle_event(pen_event, now, Constraints::default()); + let t0 = Instant::now(); + let builder_result = path_builder.handle_event(pen_event, now, Constraints::default()); + let dt = t0.elapsed(); + println!("path_builder.handle_event took {:?}", dt); + let handled = builder_result.handled; let propagate = builder_result.propagate; @@ -197,13 +201,16 @@ impl PenBehaviour for Brush { let n_segments = segments.len(); if n_segments != 0 { + let t1 = Instant::now(); if let Some(Stroke::BrushStroke(brushstroke)) = engine_view.store.get_stroke_mut(*current_stroke_key) { brushstroke.extend_w_segments(segments); widget_flags.store_modified = true; } + println!("Extending brush stroke took {:?}", t1.elapsed()); + let t2 = Instant::now(); engine_view.store.append_rendering_last_segments( engine_view.tasks_tx.clone(), *current_stroke_key, @@ -211,6 +218,11 @@ impl PenBehaviour for Brush { engine_view.camera.viewport(), engine_view.camera.image_scale(), ); + println!( + "[Brush] append_rendering_last_segments ({} segments) took {:?}", + n_segments, + t2.elapsed() + ); } PenProgress::InProgress @@ -239,12 +251,14 @@ impl PenBehaviour for Brush { engine_view .store .update_geometry_for_stroke(*current_stroke_key); + let t3 = Instant::now(); engine_view.store.regenerate_rendering_for_stroke_threaded( engine_view.tasks_tx.clone(), *current_stroke_key, engine_view.camera.viewport(), engine_view.camera.image_scale(), ); + println!("[Brush] regenerate_rendering_for_stroke_threaded took {:?}", t3.elapsed()); widget_flags |= engine_view .document .resize_autoexpand(engine_view.store, engine_view.camera); From 1c7c8f2a04c6f89101a503976448941e99a6c2b3 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Sat, 31 May 2025 00:44:03 +0200 Subject: [PATCH 02/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index 4b8057a366..a9b5e33c0c 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -17,7 +17,6 @@ use rnote_compose::builders::{ use rnote_compose::eventresult::{EventPropagation, EventResult}; use rnote_compose::penevent::{PenEvent, PenProgress}; use rnote_compose::penpath::{Element, Segment}; -use std::time::Instant; use std::time::{Instant, SystemTime}; #[derive(Debug)] From efb0e6f35bd6ad4498a36d284ee362c75a69c93b Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Sat, 31 May 2025 10:15:23 +0200 Subject: [PATCH 03/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index a9b5e33c0c..525d758cf5 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -17,7 +17,7 @@ use rnote_compose::builders::{ use rnote_compose::eventresult::{EventPropagation, EventResult}; use rnote_compose::penevent::{PenEvent, PenProgress}; use rnote_compose::penpath::{Element, Segment}; -use std::time::{Instant, SystemTime}; +use std::time::Instant; #[derive(Debug)] enum BrushState { From 0f2d6e45d650533e52909f58253a7888dbe136a8 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Sat, 31 May 2025 10:51:01 +0200 Subject: [PATCH 04/28] Update release-windows.yml --- .github/workflows/release-windows.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml index 3eac20da37..38bfdf7e5c 100644 --- a/.github/workflows/release-windows.yml +++ b/.github/workflows/release-windows.yml @@ -1,5 +1,4 @@ --- - name: Release Windows "on": @@ -9,7 +8,7 @@ name: Release Windows jobs: build: - runs-on: windows-2022 + runs-on: windows-2025 permissions: # needed for uploading release artifact contents: write @@ -17,6 +16,16 @@ jobs: run: shell: msys2 {0} steps: + - name: Install Inno 6 + id: install_inno + shell: pwsh + run: | + winget install -e --id JRSoftware.InnoSetup -v 6.4.3 --accept-package-agreements --accept-source-agreements --disable-interactivity --scope machine + if (Test-Path "C:\Program Files (x86)\Inno Setup 6\") { + echo "inno installed successfully" + } else { + throw "could not find inno's installation folder" + } - name: Set installer name id: set_installer_name From 80cfd17495ba59469c04f63d8ea73a35aa6eeada Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Sat, 31 May 2025 11:20:36 +0200 Subject: [PATCH 05/28] Update justfile --- justfile | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/justfile b/justfile index afaf0abab6..d36ea80937 100644 --- a/justfile +++ b/justfile @@ -2,15 +2,13 @@ # Either 'true' or 'false' ci := "false" +linux_distr := `lsb_release -ds | tr '[:upper:]' '[:lower:]'` log_level := "debug" build_folder := "_mesonbuild" flatpak_app_folder := "_flatpak_app" flatpak_repo_folder := "_flatpak_repo" mingw64_prefix_path := "C:/msys64/mingw64" -[private] -linux_distr := `lsb_release -ds | tr '[:upper:]' '[:lower:]'` -[private] sudo_cmd := "sudo" export LANG := "C" @@ -28,7 +26,8 @@ default: prerequisites: #!/usr/bin/env bash set -euxo pipefail - if [[ ('{{linux_distr}}' =~ 'fedora') ]]; then + + if [[ ('{{linux_distr}}' =~ 'fedora') || ('{{linux_distr}}' =~ 'rhel') || ('{{linux_distr}}' =~ 'alma') ]]; then {{sudo_cmd}} dnf install -y \ gcc gcc-c++ clang clang-devel python3 make cmake meson just git appstream gettext desktop-file-utils \ shared-mime-info kernel-devel gtk4-devel libadwaita-devel poppler-glib-devel poppler-data alsa-lib-devel \ @@ -42,13 +41,15 @@ prerequisites: echo "Unable to install system dependencies, unsupported distro." exit 1 fi + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y export PATH="$HOME/.cargo/bin:$PATH" prerequisites-flatpak: prerequisites #!/usr/bin/env bash set -euxo pipefail - if [[ ('{{linux_distr}}' =~ 'fedora') ]]; then + + if [[ ('{{linux_distr}}' =~ 'fedora') || ('{{linux_distr}}' =~ 'rhel') || ('{{linux_distr}}' =~ 'alma') ]]; then {{sudo_cmd}} dnf install -y \ flatpak flatpak-builder elif [[ '{{linux_distr}}' =~ 'debian' || '{{linux_distr}}' =~ 'ubuntu' ]]; then @@ -59,6 +60,7 @@ prerequisites-flatpak: prerequisites echo "Unable to install system dependencies, unsupported distro." exit 1 fi + flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo flatpak install -y org.gnome.Platform//48 org.gnome.Sdk//48 org.freedesktop.Sdk.Extension.rust-stable//24.08 \ org.freedesktop.Sdk.Extension.llvm19//24.08 @@ -66,7 +68,8 @@ prerequisites-flatpak: prerequisites prerequisites-dev: prerequisites #!/usr/bin/env bash set -euxo pipefail - if [[ ('{{linux_distr}}' =~ 'fedora') ]]; then + + if [[ ('{{linux_distr}}' =~ 'fedora') || ('{{linux_distr}}' =~ 'rhel') || ('{{linux_distr}}' =~ 'alma') ]]; then {{sudo_cmd}} dnf install -y \ yamllint yq opencc-tools elif [[ '{{linux_distr}}' =~ 'debian' || '{{linux_distr}}' =~ 'ubuntu' ]]; then @@ -77,9 +80,11 @@ prerequisites-dev: prerequisites echo "Unable to install system dependencies, unsupported distro." exit 1 fi + if [[ "{{ci}}" != "true" ]]; then ln -sf build-aux/git-hooks/pre-commit.hook .git/hooks/pre-commit fi + curl -L --proto '=https' --tlsv1.2 -sSf \ https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash cargo binstall -y cargo-nextest cargo-edit cargo-deny @@ -92,7 +97,9 @@ prerequisites-win: mingw-w64-x86_64-meson mingw-w64-x86_64-diffutils mingw-w64-x86_64-desktop-file-utils \ mingw-w64-x86_64-appstream mingw-w64-x86_64-gtk4 mingw-w64-x86_64-libadwaita mingw-w64-x86_64-poppler \ mingw-w64-x86_64-poppler-data mingw-w64-x86_64-angleproject + mv /mingw64/lib/libpthread.dll.a /mingw64/lib/libpthread.dll.a.bak + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y export PATH="$HOME/.cargo/bin:$PATH" @@ -116,7 +123,7 @@ setup-win-installer installer_name="rnote-win-installer": meson setup \ --prefix={{ mingw64_prefix_path }} \ -Dprofile=default \ - -Dcli=false \ + -Dcli=true \ -Dwin-installer-name={{ installer_name }} \ -Dci={{ ci }} \ {{ build_folder }} From be77652dd1504a98b4eb0e13dd2d6483a06f9fab Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:00:53 +0200 Subject: [PATCH 06/28] Update rendering.rs --- crates/rnote-engine/src/engine/rendering.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/rnote-engine/src/engine/rendering.rs b/crates/rnote-engine/src/engine/rendering.rs index 55066bbec1..272c170546 100644 --- a/crates/rnote-engine/src/engine/rendering.rs +++ b/crates/rnote-engine/src/engine/rendering.rs @@ -5,12 +5,14 @@ use p2d::bounding_volume::Aabb; use piet::RenderContext; use rnote_compose::color; use tracing::error; +use std::time::Instant; impl Engine { /// Update the background rendering for the current viewport. /// /// If the background pattern or zoom has changed, the background pattern needs to be regenerated first. pub fn update_background_rendering_current_viewport(&mut self) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); #[cfg(feature = "ui")] @@ -85,11 +87,17 @@ impl Engine { } widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "update_background_rendering_current_viewport completed in {:.2?}", + elapsed + ); widget_flags } /// Update the content rendering for the current viewport. pub fn update_content_rendering_current_viewport(&mut self) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); self.store.regenerate_rendering_in_viewport_threaded( self.engine_tasks_tx(), @@ -98,6 +106,11 @@ impl Engine { self.camera.image_scale(), ); widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "update_content_rendering_current_viewport completed in {:.2?}", + elapsed + ); widget_flags } From c9667f8bf226b35a95f92b760886e4c0f7cf61f9 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:10:08 +0200 Subject: [PATCH 07/28] Update penholder.rs --- crates/rnote-engine/src/pens/penholder.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/rnote-engine/src/pens/penholder.rs b/crates/rnote-engine/src/pens/penholder.rs index 1b80b2e1ce..56f0189948 100644 --- a/crates/rnote-engine/src/pens/penholder.rs +++ b/crates/rnote-engine/src/pens/penholder.rs @@ -485,11 +485,17 @@ impl DrawableOnDoc for PenHolder { cx: &mut piet_cairo::CairoRenderContext, engine_view: &EngineView, ) -> anyhow::Result<()> { + let start_time = Instant::now(); cx.save().map_err(|e| anyhow::anyhow!("{e:?}"))?; self.current_pen.draw_on_doc(cx, engine_view)?; cx.restore().map_err(|e| anyhow::anyhow!("{e:?}"))?; + let elapsed = start_time.elapsed(); + println!( + "draw_on_doc completed in {:.2?}", + elapsed + ); Ok(()) } } From 1c6c5a850189afeca5e6579470b949dd733f3c2f Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:10:31 +0200 Subject: [PATCH 08/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index 525d758cf5..5979de0dd2 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -176,11 +176,8 @@ impl PenBehaviour for Brush { }, pen_event, ) => { - let t0 = Instant::now(); - let builder_result = path_builder.handle_event(pen_event, now, Constraints::default()); - let dt = t0.elapsed(); - println!("path_builder.handle_event took {:?}", dt); - + let builder_result = + path_builder.handle_event(pen_event, now, Constraints::default()); let handled = builder_result.handled; let propagate = builder_result.propagate; @@ -200,16 +197,13 @@ impl PenBehaviour for Brush { let n_segments = segments.len(); if n_segments != 0 { - let t1 = Instant::now(); if let Some(Stroke::BrushStroke(brushstroke)) = engine_view.store.get_stroke_mut(*current_stroke_key) { brushstroke.extend_w_segments(segments); widget_flags.store_modified = true; } - println!("Extending brush stroke took {:?}", t1.elapsed()); - let t2 = Instant::now(); engine_view.store.append_rendering_last_segments( engine_view.tasks_tx.clone(), *current_stroke_key, @@ -217,11 +211,6 @@ impl PenBehaviour for Brush { engine_view.camera.viewport(), engine_view.camera.image_scale(), ); - println!( - "[Brush] append_rendering_last_segments ({} segments) took {:?}", - n_segments, - t2.elapsed() - ); } PenProgress::InProgress @@ -250,14 +239,12 @@ impl PenBehaviour for Brush { engine_view .store .update_geometry_for_stroke(*current_stroke_key); - let t3 = Instant::now(); engine_view.store.regenerate_rendering_for_stroke_threaded( engine_view.tasks_tx.clone(), *current_stroke_key, engine_view.camera.viewport(), engine_view.camera.image_scale(), ); - println!("[Brush] regenerate_rendering_for_stroke_threaded took {:?}", t3.elapsed()); widget_flags |= engine_view .document .resize_autoexpand(engine_view.store, engine_view.camera); From 5d7a355e060366922fbdcfdd9427a386e80b16ee Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Tue, 3 Jun 2025 19:38:24 +0200 Subject: [PATCH 09/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index 5979de0dd2..399a8d9d5d 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -64,6 +64,7 @@ impl PenBehaviour for Brush { now: Instant, engine_view: &mut EngineViewMut, ) -> (EventResult, WidgetFlags) { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); let event_result = match (&mut self.state, event) { @@ -266,6 +267,11 @@ impl PenBehaviour for Brush { } }; + let elapsed = start_time.elapsed(); + println!( + "handle_event [Brush] completed in {:.2?}", + elapsed + ); (event_result, widget_flags) } } @@ -291,6 +297,7 @@ impl DrawableOnDoc for Brush { cx: &mut piet_cairo::CairoRenderContext, engine_view: &EngineView, ) -> anyhow::Result<()> { + let start_time = Instant::now(); cx.save().map_err(|e| anyhow::anyhow!("{e:?}"))?; match &self.state { @@ -313,6 +320,11 @@ impl DrawableOnDoc for Brush { } cx.restore().map_err(|e| anyhow::anyhow!("{e:?}"))?; + let elapsed = start_time.elapsed(); + println!( + "draw_on_doc [Brush] completed in {:.2?}", + elapsed + ); Ok(()) } } From b3a96198e041082799754821209b878eb02f726e Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Tue, 3 Jun 2025 19:38:44 +0200 Subject: [PATCH 10/28] Update penholder.rs --- crates/rnote-engine/src/pens/penholder.rs | 30 ++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/crates/rnote-engine/src/pens/penholder.rs b/crates/rnote-engine/src/pens/penholder.rs index 56f0189948..8b6ba6ba3f 100644 --- a/crates/rnote-engine/src/pens/penholder.rs +++ b/crates/rnote-engine/src/pens/penholder.rs @@ -187,6 +187,7 @@ impl PenHolder { now: Instant, engine_view: &mut EngineViewMut, ) -> (EventPropagation, WidgetFlags) { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); if let Some(pen_mode) = pen_mode { @@ -209,6 +210,11 @@ impl PenHolder { // // This is also needed because pens might have claimed/requested an animation frame. widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "handle_pen_event completed in {:.2?}", + elapsed + ); (event_result.propagate, widget_flags) } @@ -217,8 +223,14 @@ impl PenHolder { /// /// Can request another frame using `EngineViewMut#animation.claim_frame()`. pub fn handle_animation_frame(&mut self, engine_view: &mut EngineViewMut, optimize_epd: bool) { + let start_time = Instant::now(); self.current_pen .handle_animation_frame(engine_view, optimize_epd); + let elapsed = start_time.elapsed(); + println!( + "handle_animation_frame completed in {:.2?}", + elapsed + ); } /// Handle a pressed shortcut key. @@ -329,6 +341,7 @@ impl PenHolder { _now: Instant, engine_view: &mut EngineViewMut, ) -> (EventPropagation, WidgetFlags) { + let start_time = Instant::now(); const MOVE_VIEW_FACTOR: f64 = 0.33; let mut widget_flags = WidgetFlags::default(); @@ -425,6 +438,11 @@ impl PenHolder { _ => EventPropagation::Proceed, }, }; + let elapsed = start_time.elapsed(); + println!( + "handle_pen_event_global completed in {:.2?}", + elapsed + ); (propagate, widget_flags) } @@ -434,6 +452,7 @@ impl PenHolder { progress: PenProgress, engine_view: &mut EngineViewMut, ) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); match progress { @@ -450,6 +469,11 @@ impl PenHolder { self.progress = progress; + let elapsed = start_time.elapsed(); + println!( + "handle_pen_progress completed in {:.2?}", + elapsed + ); widget_flags } @@ -485,17 +509,11 @@ impl DrawableOnDoc for PenHolder { cx: &mut piet_cairo::CairoRenderContext, engine_view: &EngineView, ) -> anyhow::Result<()> { - let start_time = Instant::now(); cx.save().map_err(|e| anyhow::anyhow!("{e:?}"))?; self.current_pen.draw_on_doc(cx, engine_view)?; cx.restore().map_err(|e| anyhow::anyhow!("{e:?}"))?; - let elapsed = start_time.elapsed(); - println!( - "draw_on_doc completed in {:.2?}", - elapsed - ); Ok(()) } } From 8775a77a6e312fa9b4b69525a4474d2265d948ab Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Tue, 3 Jun 2025 19:39:05 +0200 Subject: [PATCH 11/28] Update rendering.rs --- crates/rnote-engine/src/engine/rendering.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/rnote-engine/src/engine/rendering.rs b/crates/rnote-engine/src/engine/rendering.rs index 272c170546..79945d59b4 100644 --- a/crates/rnote-engine/src/engine/rendering.rs +++ b/crates/rnote-engine/src/engine/rendering.rs @@ -139,6 +139,7 @@ impl Engine { /// Regenerate the background tile image, origin indicator and updates the background rendering. pub fn background_rendering_regenerate(&mut self) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); let image_scale = self.camera.image_scale(); let scale_factor = self.camera.scale_factor(); @@ -166,6 +167,11 @@ impl Engine { widget_flags |= self.update_background_rendering_current_viewport(); widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "background_rendering_regenerate completed in {:.2?}", + elapsed + ); widget_flags } @@ -176,6 +182,7 @@ impl Engine { snapshot: >k4::Snapshot, surface_bounds: p2d::bounding_volume::Aabb, ) -> anyhow::Result<()> { + let start_time = Instant::now(); use crate::drawable::DrawableOnDoc; use crate::engine::visual_debug; use crate::engine_view; @@ -217,6 +224,11 @@ impl Engine { visual_debug::draw_statistics_to_gtk_snapshot(snapshot, self, surface_bounds)?; } + let elapsed = start_time.elapsed(); + println!( + "draw_to_gtk_snapshot completed in {:.2?}", + elapsed + ); Ok(()) } From 66b6da95695115d0cfbb55902a29884152ff2b89 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:57:04 +0200 Subject: [PATCH 12/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 52 ++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index 399a8d9d5d..ebabd882fb 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -64,7 +64,6 @@ impl PenBehaviour for Brush { now: Instant, engine_view: &mut EngineViewMut, ) -> (EventResult, WidgetFlags) { - let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); let event_result = match (&mut self.state, event) { @@ -95,6 +94,7 @@ impl PenBehaviour for Brush { .brush_config .style_for_current_options(), )); + let t0 = Instant::now(); let current_stroke_key = engine_view.store.insert_stroke( brushstroke, Some( @@ -105,13 +105,23 @@ impl PenBehaviour for Brush { .layer_for_current_options(), ), ); + println!( + "handle_event [insert_stroke] completed in {:.2?}", + t0.elapsed() + ); + let t1 = Instant::now(); engine_view.store.regenerate_rendering_for_stroke( current_stroke_key, engine_view.camera.viewport(), engine_view.camera.image_scale(), ); + println!( + "handle_event [regenerate_rendering] completed in {:.2?}", + t1.elapsed() + ); + let t2 = Instant::now(); self.state = BrushState::Drawing { path_builder: new_builder( engine_view.config.pens_config.brush_config.builder_type, @@ -120,6 +130,10 @@ impl PenBehaviour for Brush { ), current_stroke_key, }; + println!( + "handle_pen_event [Drawing] completed in {:.2?}", + t2.elapsed() + ); EventResult { handled: true, @@ -146,6 +160,7 @@ impl PenBehaviour for Brush { PenEvent::Cancel, ) => { // Finish up the last stroke + let t3 = Instant::now(); engine_view .store .update_geometry_for_stroke(*current_stroke_key); @@ -158,6 +173,10 @@ impl PenBehaviour for Brush { widget_flags |= engine_view .document .resize_autoexpand(engine_view.store, engine_view.camera); + println!( + "handle_pen_event [update_geometry and regenerate] completed in {:.2?}", + t3.elapsed() + ); self.state = BrushState::Idle; @@ -177,10 +196,15 @@ impl PenBehaviour for Brush { }, pen_event, ) => { + let t4 = Instant::now(); let builder_result = path_builder.handle_event(pen_event, now, Constraints::default()); let handled = builder_result.handled; let propagate = builder_result.propagate; + println!( + "handle_event [builder] completed in {:.2?}", + t4.elapsed() + ); let progress = match builder_result.progress { BuilderProgress::InProgress => { @@ -195,6 +219,7 @@ impl PenBehaviour for Brush { trigger_brush_sound(engine_view); } + let t5 = Instant::now(); let n_segments = segments.len(); if n_segments != 0 { @@ -213,10 +238,15 @@ impl PenBehaviour for Brush { engine_view.camera.image_scale(), ); } + println!( + "handle_event [progress builder] completed in {:.2?}", + t5.elapsed() + ); PenProgress::InProgress } BuilderProgress::Finished(segments) => { + let t6 = Instant::now(); let n_segments = segments.len(); if n_segments != 0 { @@ -235,8 +265,13 @@ impl PenBehaviour for Brush { engine_view.camera.image_scale(), ); } + println!( + "handle_pen_event [Finish builder] completed in {:.2?}", + t6.elapsed() + ); // Finish up the last stroke + let t7 = Instant::now(); engine_view .store .update_geometry_for_stroke(*current_stroke_key); @@ -254,6 +289,10 @@ impl PenBehaviour for Brush { widget_flags |= engine_view.store.record(Instant::now()); widget_flags.store_modified = true; + println!( + "handle_pen_event [Update last stroke] completed in {:.2?}", + t7.elapsed() + ); PenProgress::Finished } @@ -267,11 +306,6 @@ impl PenBehaviour for Brush { } }; - let elapsed = start_time.elapsed(); - println!( - "handle_event [Brush] completed in {:.2?}", - elapsed - ); (event_result, widget_flags) } } @@ -297,7 +331,6 @@ impl DrawableOnDoc for Brush { cx: &mut piet_cairo::CairoRenderContext, engine_view: &EngineView, ) -> anyhow::Result<()> { - let start_time = Instant::now(); cx.save().map_err(|e| anyhow::anyhow!("{e:?}"))?; match &self.state { @@ -320,11 +353,6 @@ impl DrawableOnDoc for Brush { } cx.restore().map_err(|e| anyhow::anyhow!("{e:?}"))?; - let elapsed = start_time.elapsed(); - println!( - "draw_on_doc [Brush] completed in {:.2?}", - elapsed - ); Ok(()) } } From 1c9c9f4096147a2808b48239f4721b971221d85b Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:57:36 +0200 Subject: [PATCH 13/28] Update penholder.rs --- crates/rnote-engine/src/pens/penholder.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/crates/rnote-engine/src/pens/penholder.rs b/crates/rnote-engine/src/pens/penholder.rs index 8b6ba6ba3f..15ab749cce 100644 --- a/crates/rnote-engine/src/pens/penholder.rs +++ b/crates/rnote-engine/src/pens/penholder.rs @@ -195,9 +195,20 @@ impl PenHolder { } // Handle the event with the current pen + let t0 = Instant::now(); + let clone = event.clone(); + println!( + "handle_pen_event [clone] completed in {:.2?}", + t0.elapsed() + ); + let t1 = Instant::now(); let (mut event_result, wf) = self .current_pen - .handle_event(event.clone(), now, engine_view); + .handle_event(clone, now, engine_view); + println!( + "handle_pen_event [handle_event] completed in {:.2?}", + t1.elapsed() + ); widget_flags |= wf | self.handle_pen_progress(event_result.progress, engine_view); if !event_result.handled { @@ -209,7 +220,12 @@ impl PenHolder { // Always redraw after handling a pen event. // // This is also needed because pens might have claimed/requested an animation frame. + let t2 = Instant::now(); widget_flags.redraw = true; + println!( + "handle_pen_event [clone] completed in {:.2?}", + t0.elapsed() + ); let elapsed = start_time.elapsed(); println!( "handle_pen_event completed in {:.2?}", From 93a2bfda1a216e484da9eeb0b3413f8330e42eff Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:58:17 +0200 Subject: [PATCH 14/28] Update rendering.rs --- crates/rnote-engine/src/engine/rendering.rs | 25 --------------------- 1 file changed, 25 deletions(-) diff --git a/crates/rnote-engine/src/engine/rendering.rs b/crates/rnote-engine/src/engine/rendering.rs index 79945d59b4..55066bbec1 100644 --- a/crates/rnote-engine/src/engine/rendering.rs +++ b/crates/rnote-engine/src/engine/rendering.rs @@ -5,14 +5,12 @@ use p2d::bounding_volume::Aabb; use piet::RenderContext; use rnote_compose::color; use tracing::error; -use std::time::Instant; impl Engine { /// Update the background rendering for the current viewport. /// /// If the background pattern or zoom has changed, the background pattern needs to be regenerated first. pub fn update_background_rendering_current_viewport(&mut self) -> WidgetFlags { - let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); #[cfg(feature = "ui")] @@ -87,17 +85,11 @@ impl Engine { } widget_flags.redraw = true; - let elapsed = start_time.elapsed(); - println!( - "update_background_rendering_current_viewport completed in {:.2?}", - elapsed - ); widget_flags } /// Update the content rendering for the current viewport. pub fn update_content_rendering_current_viewport(&mut self) -> WidgetFlags { - let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); self.store.regenerate_rendering_in_viewport_threaded( self.engine_tasks_tx(), @@ -106,11 +98,6 @@ impl Engine { self.camera.image_scale(), ); widget_flags.redraw = true; - let elapsed = start_time.elapsed(); - println!( - "update_content_rendering_current_viewport completed in {:.2?}", - elapsed - ); widget_flags } @@ -139,7 +126,6 @@ impl Engine { /// Regenerate the background tile image, origin indicator and updates the background rendering. pub fn background_rendering_regenerate(&mut self) -> WidgetFlags { - let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); let image_scale = self.camera.image_scale(); let scale_factor = self.camera.scale_factor(); @@ -167,11 +153,6 @@ impl Engine { widget_flags |= self.update_background_rendering_current_viewport(); widget_flags.redraw = true; - let elapsed = start_time.elapsed(); - println!( - "background_rendering_regenerate completed in {:.2?}", - elapsed - ); widget_flags } @@ -182,7 +163,6 @@ impl Engine { snapshot: >k4::Snapshot, surface_bounds: p2d::bounding_volume::Aabb, ) -> anyhow::Result<()> { - let start_time = Instant::now(); use crate::drawable::DrawableOnDoc; use crate::engine::visual_debug; use crate::engine_view; @@ -224,11 +204,6 @@ impl Engine { visual_debug::draw_statistics_to_gtk_snapshot(snapshot, self, surface_bounds)?; } - let elapsed = start_time.elapsed(); - println!( - "draw_to_gtk_snapshot completed in {:.2?}", - elapsed - ); Ok(()) } From aa08d0897c31a591e7810dc389cc92e1cf4a4244 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:00:44 +0200 Subject: [PATCH 15/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 61 ++++++++++----------------- 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index ebabd882fb..ef4ffec774 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -94,7 +94,6 @@ impl PenBehaviour for Brush { .brush_config .style_for_current_options(), )); - let t0 = Instant::now(); let current_stroke_key = engine_view.store.insert_stroke( brushstroke, Some( @@ -105,23 +104,13 @@ impl PenBehaviour for Brush { .layer_for_current_options(), ), ); - println!( - "handle_event [insert_stroke] completed in {:.2?}", - t0.elapsed() - ); - let t1 = Instant::now(); engine_view.store.regenerate_rendering_for_stroke( current_stroke_key, engine_view.camera.viewport(), engine_view.camera.image_scale(), ); - println!( - "handle_event [regenerate_rendering] completed in {:.2?}", - t1.elapsed() - ); - let t2 = Instant::now(); self.state = BrushState::Drawing { path_builder: new_builder( engine_view.config.pens_config.brush_config.builder_type, @@ -130,10 +119,6 @@ impl PenBehaviour for Brush { ), current_stroke_key, }; - println!( - "handle_pen_event [Drawing] completed in {:.2?}", - t2.elapsed() - ); EventResult { handled: true, @@ -160,7 +145,6 @@ impl PenBehaviour for Brush { PenEvent::Cancel, ) => { // Finish up the last stroke - let t3 = Instant::now(); engine_view .store .update_geometry_for_stroke(*current_stroke_key); @@ -173,10 +157,6 @@ impl PenBehaviour for Brush { widget_flags |= engine_view .document .resize_autoexpand(engine_view.store, engine_view.camera); - println!( - "handle_pen_event [update_geometry and regenerate] completed in {:.2?}", - t3.elapsed() - ); self.state = BrushState::Idle; @@ -196,15 +176,10 @@ impl PenBehaviour for Brush { }, pen_event, ) => { - let t4 = Instant::now(); let builder_result = path_builder.handle_event(pen_event, now, Constraints::default()); let handled = builder_result.handled; let propagate = builder_result.propagate; - println!( - "handle_event [builder] completed in {:.2?}", - t4.elapsed() - ); let progress = match builder_result.progress { BuilderProgress::InProgress => { @@ -219,7 +194,6 @@ impl PenBehaviour for Brush { trigger_brush_sound(engine_view); } - let t5 = Instant::now(); let n_segments = segments.len(); if n_segments != 0 { @@ -238,15 +212,10 @@ impl PenBehaviour for Brush { engine_view.camera.image_scale(), ); } - println!( - "handle_event [progress builder] completed in {:.2?}", - t5.elapsed() - ); PenProgress::InProgress } BuilderProgress::Finished(segments) => { - let t6 = Instant::now(); let n_segments = segments.len(); if n_segments != 0 { @@ -265,33 +234,49 @@ impl PenBehaviour for Brush { engine_view.camera.image_scale(), ); } - println!( - "handle_pen_event [Finish builder] completed in {:.2?}", - t6.elapsed() - ); // Finish up the last stroke - let t7 = Instant::now(); + let t0 = Instant::now(); + let t1 = Instant::now(); engine_view .store .update_geometry_for_stroke(*current_stroke_key); + println!( + "handle_event [update geometry] completed in {:.2?}", + t1.elapsed() + ); + let t2 = Instant::now(); engine_view.store.regenerate_rendering_for_stroke_threaded( engine_view.tasks_tx.clone(), *current_stroke_key, engine_view.camera.viewport(), engine_view.camera.image_scale(), ); + println!( + "handle_event [regenerate rendering] completed in {:.2?}", + t2.elapsed() + ); + let t3 = Instant::now(); widget_flags |= engine_view .document .resize_autoexpand(engine_view.store, engine_view.camera); + println!( + "handle_event [autoexpand] completed in {:.2?}", + t3.elapsed() + ); + let t4 = Instant::now(); self.state = BrushState::Idle; widget_flags |= engine_view.store.record(Instant::now()); widget_flags.store_modified = true; println!( - "handle_pen_event [Update last stroke] completed in {:.2?}", - t7.elapsed() + "handle_event [widget flags] completed in {:.2?}", + t4.elapsed() + ); + println!( + "handle_event [clone] completed in {:.2?}", + t0.elapsed() ); PenProgress::Finished From 1df7a8d47ce6782990b8694c04b4221bc23c2f03 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:01:59 +0200 Subject: [PATCH 16/28] Update penholder.rs --- crates/rnote-engine/src/pens/penholder.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/rnote-engine/src/pens/penholder.rs b/crates/rnote-engine/src/pens/penholder.rs index 15ab749cce..ced8cf6d67 100644 --- a/crates/rnote-engine/src/pens/penholder.rs +++ b/crates/rnote-engine/src/pens/penholder.rs @@ -223,8 +223,8 @@ impl PenHolder { let t2 = Instant::now(); widget_flags.redraw = true; println!( - "handle_pen_event [clone] completed in {:.2?}", - t0.elapsed() + "handle_pen_event [redraw] completed in {:.2?}", + t2.elapsed() ); let elapsed = start_time.elapsed(); println!( From f393c494d4e0b3f0ccdd0d0a8de76e5310824115 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:09:07 +0200 Subject: [PATCH 17/28] Update render_comp.rs --- crates/rnote-engine/src/store/render_comp.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/crates/rnote-engine/src/store/render_comp.rs b/crates/rnote-engine/src/store/render_comp.rs index 013c0d825a..30645b2cb9 100644 --- a/crates/rnote-engine/src/store/render_comp.rs +++ b/crates/rnote-engine/src/store/render_comp.rs @@ -242,8 +242,14 @@ impl StrokeStore { viewport: Aabb, image_scale: f64, ) { + let t0 = Instant::now(); let keys = self.render_components.keys().collect::>(); + println!( + "render_component completed in {:.2?}", + t0.elapsed() + ); + let t1 = Instant::now(); for key in keys { if let (Some(stroke), Some(render_comp)) = ( self.stroke_components.get(key), @@ -314,6 +320,10 @@ impl StrokeStore { ); } } + println!( + "for keys completed in {:.2?}", + t1.elapsed() + ); } /// Clear all rendering for all strokes. From 97cd8fea48527df37286aff79275d1d465c425e0 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:10:42 +0200 Subject: [PATCH 18/28] Update penholder.rs --- crates/rnote-engine/src/pens/penholder.rs | 42 +---------------------- 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/crates/rnote-engine/src/pens/penholder.rs b/crates/rnote-engine/src/pens/penholder.rs index ced8cf6d67..1b80b2e1ce 100644 --- a/crates/rnote-engine/src/pens/penholder.rs +++ b/crates/rnote-engine/src/pens/penholder.rs @@ -187,7 +187,6 @@ impl PenHolder { now: Instant, engine_view: &mut EngineViewMut, ) -> (EventPropagation, WidgetFlags) { - let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); if let Some(pen_mode) = pen_mode { @@ -195,20 +194,9 @@ impl PenHolder { } // Handle the event with the current pen - let t0 = Instant::now(); - let clone = event.clone(); - println!( - "handle_pen_event [clone] completed in {:.2?}", - t0.elapsed() - ); - let t1 = Instant::now(); let (mut event_result, wf) = self .current_pen - .handle_event(clone, now, engine_view); - println!( - "handle_pen_event [handle_event] completed in {:.2?}", - t1.elapsed() - ); + .handle_event(event.clone(), now, engine_view); widget_flags |= wf | self.handle_pen_progress(event_result.progress, engine_view); if !event_result.handled { @@ -220,17 +208,7 @@ impl PenHolder { // Always redraw after handling a pen event. // // This is also needed because pens might have claimed/requested an animation frame. - let t2 = Instant::now(); widget_flags.redraw = true; - println!( - "handle_pen_event [redraw] completed in {:.2?}", - t2.elapsed() - ); - let elapsed = start_time.elapsed(); - println!( - "handle_pen_event completed in {:.2?}", - elapsed - ); (event_result.propagate, widget_flags) } @@ -239,14 +217,8 @@ impl PenHolder { /// /// Can request another frame using `EngineViewMut#animation.claim_frame()`. pub fn handle_animation_frame(&mut self, engine_view: &mut EngineViewMut, optimize_epd: bool) { - let start_time = Instant::now(); self.current_pen .handle_animation_frame(engine_view, optimize_epd); - let elapsed = start_time.elapsed(); - println!( - "handle_animation_frame completed in {:.2?}", - elapsed - ); } /// Handle a pressed shortcut key. @@ -357,7 +329,6 @@ impl PenHolder { _now: Instant, engine_view: &mut EngineViewMut, ) -> (EventPropagation, WidgetFlags) { - let start_time = Instant::now(); const MOVE_VIEW_FACTOR: f64 = 0.33; let mut widget_flags = WidgetFlags::default(); @@ -454,11 +425,6 @@ impl PenHolder { _ => EventPropagation::Proceed, }, }; - let elapsed = start_time.elapsed(); - println!( - "handle_pen_event_global completed in {:.2?}", - elapsed - ); (propagate, widget_flags) } @@ -468,7 +434,6 @@ impl PenHolder { progress: PenProgress, engine_view: &mut EngineViewMut, ) -> WidgetFlags { - let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); match progress { @@ -485,11 +450,6 @@ impl PenHolder { self.progress = progress; - let elapsed = start_time.elapsed(); - println!( - "handle_pen_progress completed in {:.2?}", - elapsed - ); widget_flags } From 5241daec62b9574d75e8f799d05d70ae8172c0d7 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:11:20 +0200 Subject: [PATCH 19/28] Update brush.rs --- crates/rnote-engine/src/pens/brush.rs | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/crates/rnote-engine/src/pens/brush.rs b/crates/rnote-engine/src/pens/brush.rs index ef4ffec774..5979de0dd2 100644 --- a/crates/rnote-engine/src/pens/brush.rs +++ b/crates/rnote-engine/src/pens/brush.rs @@ -236,48 +236,23 @@ impl PenBehaviour for Brush { } // Finish up the last stroke - let t0 = Instant::now(); - let t1 = Instant::now(); engine_view .store .update_geometry_for_stroke(*current_stroke_key); - println!( - "handle_event [update geometry] completed in {:.2?}", - t1.elapsed() - ); - let t2 = Instant::now(); engine_view.store.regenerate_rendering_for_stroke_threaded( engine_view.tasks_tx.clone(), *current_stroke_key, engine_view.camera.viewport(), engine_view.camera.image_scale(), ); - println!( - "handle_event [regenerate rendering] completed in {:.2?}", - t2.elapsed() - ); - let t3 = Instant::now(); widget_flags |= engine_view .document .resize_autoexpand(engine_view.store, engine_view.camera); - println!( - "handle_event [autoexpand] completed in {:.2?}", - t3.elapsed() - ); - let t4 = Instant::now(); self.state = BrushState::Idle; widget_flags |= engine_view.store.record(Instant::now()); widget_flags.store_modified = true; - println!( - "handle_event [widget flags] completed in {:.2?}", - t4.elapsed() - ); - println!( - "handle_event [clone] completed in {:.2?}", - t0.elapsed() - ); PenProgress::Finished } From 14d38b1b837d969ae227b8c91c9e2df076998271 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:12:27 +0200 Subject: [PATCH 20/28] Update rendering.rs --- crates/rnote-engine/src/engine/rendering.rs | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/crates/rnote-engine/src/engine/rendering.rs b/crates/rnote-engine/src/engine/rendering.rs index 55066bbec1..79945d59b4 100644 --- a/crates/rnote-engine/src/engine/rendering.rs +++ b/crates/rnote-engine/src/engine/rendering.rs @@ -5,12 +5,14 @@ use p2d::bounding_volume::Aabb; use piet::RenderContext; use rnote_compose::color; use tracing::error; +use std::time::Instant; impl Engine { /// Update the background rendering for the current viewport. /// /// If the background pattern or zoom has changed, the background pattern needs to be regenerated first. pub fn update_background_rendering_current_viewport(&mut self) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); #[cfg(feature = "ui")] @@ -85,11 +87,17 @@ impl Engine { } widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "update_background_rendering_current_viewport completed in {:.2?}", + elapsed + ); widget_flags } /// Update the content rendering for the current viewport. pub fn update_content_rendering_current_viewport(&mut self) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); self.store.regenerate_rendering_in_viewport_threaded( self.engine_tasks_tx(), @@ -98,6 +106,11 @@ impl Engine { self.camera.image_scale(), ); widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "update_content_rendering_current_viewport completed in {:.2?}", + elapsed + ); widget_flags } @@ -126,6 +139,7 @@ impl Engine { /// Regenerate the background tile image, origin indicator and updates the background rendering. pub fn background_rendering_regenerate(&mut self) -> WidgetFlags { + let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); let image_scale = self.camera.image_scale(); let scale_factor = self.camera.scale_factor(); @@ -153,6 +167,11 @@ impl Engine { widget_flags |= self.update_background_rendering_current_viewport(); widget_flags.redraw = true; + let elapsed = start_time.elapsed(); + println!( + "background_rendering_regenerate completed in {:.2?}", + elapsed + ); widget_flags } @@ -163,6 +182,7 @@ impl Engine { snapshot: >k4::Snapshot, surface_bounds: p2d::bounding_volume::Aabb, ) -> anyhow::Result<()> { + let start_time = Instant::now(); use crate::drawable::DrawableOnDoc; use crate::engine::visual_debug; use crate::engine_view; @@ -204,6 +224,11 @@ impl Engine { visual_debug::draw_statistics_to_gtk_snapshot(snapshot, self, surface_bounds)?; } + let elapsed = start_time.elapsed(); + println!( + "draw_to_gtk_snapshot completed in {:.2?}", + elapsed + ); Ok(()) } From 0891a8b9371484917d6c08288da075a24b02404d Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:32:46 +0200 Subject: [PATCH 21/28] Update render_comp.rs --- crates/rnote-engine/src/store/render_comp.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rnote-engine/src/store/render_comp.rs b/crates/rnote-engine/src/store/render_comp.rs index 30645b2cb9..1b73cdda88 100644 --- a/crates/rnote-engine/src/store/render_comp.rs +++ b/crates/rnote-engine/src/store/render_comp.rs @@ -8,6 +8,7 @@ use p2d::bounding_volume::{Aabb, BoundingVolume}; use rnote_compose::ext::AabbExt; use rnote_compose::shapes::Shapeable; use tracing::error; +use std::time::Instant; /// The tolerance where check between scale-factors are considered "equal". pub(crate) const RENDER_IMAGE_SCALE_TOLERANCE: f64 = 0.01; From 5ebf94234ca65df64dec4e8e18ec4f8f65037560 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 10:59:35 +0200 Subject: [PATCH 22/28] Update render_comp.rs --- crates/rnote-engine/src/store/render_comp.rs | 121 +++++++++---------- 1 file changed, 58 insertions(+), 63 deletions(-) diff --git a/crates/rnote-engine/src/store/render_comp.rs b/crates/rnote-engine/src/store/render_comp.rs index 1b73cdda88..81b87a5637 100644 --- a/crates/rnote-engine/src/store/render_comp.rs +++ b/crates/rnote-engine/src/store/render_comp.rs @@ -244,88 +244,83 @@ impl StrokeStore { image_scale: f64, ) { let t0 = Instant::now(); - let keys = self.render_components.keys().collect::>(); - println!( - "render_component completed in {:.2?}", - t0.elapsed() - ); - + let keys = self.render_components.keys().cloned().collect::>(); + println!("render_component completed in {:.2?}", t0.elapsed()); + let t1 = Instant::now(); - for key in keys { - if let (Some(stroke), Some(render_comp)) = ( - self.stroke_components.get(key), - self.render_components.get_mut(key), - ) { - let tasks_tx = tasks_tx.clone(); - let stroke_bounds = stroke.bounds(); - let viewport_extended = - viewport.extend_by(viewport.extents() * render::VIEWPORT_EXTENTS_MARGIN_FACTOR); - - // skip and clear image buffer if stroke is not in viewport - if !viewport_extended.intersects(&stroke_bounds) { + + // Estendi il viewport una sola volta + let viewport_extended = + viewport.extend_by(viewport.extents() * render::VIEWPORT_EXTENTS_MARGIN_FACTOR); + + // Fase 1: raccogli dati clonati e leggeri per il processing parallelo + let tasks: Vec<_> = keys + .into_iter() + .filter_map(|key| { + let stroke = self.stroke_components.get(&key)?.clone(); + let render_comp = self.render_components.get_mut(&key)?; + + // Skip se non visibile + if !viewport_extended.intersects(&stroke.bounds()) { #[cfg(feature = "ui")] { render_comp.rendernodes = vec![]; } render_comp.images = vec![]; render_comp.state = RenderCompState::Dirty; - continue; + return None; } - - // only check if rerendering is not forced + if !force_regenerate { match render_comp.state { - RenderCompState::Complete | RenderCompState::BusyRenderingInTask => { - continue; - } + RenderCompState::Complete | RenderCompState::BusyRenderingInTask => return None, RenderCompState::ForViewport(old_viewport) => { - /// This factor is applied on top of the viewport extents margin factor, - /// so that rerendering is started a bit earlier to reaching - /// the edges of the viewport of the current rendered images. - const VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD: f64 = 0.7; - - if old_viewport.contains( - &(viewport.extend_by( - viewport.extents() - * render::VIEWPORT_EXTENTS_MARGIN_FACTOR - * VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD, - )), - ) { - continue; + const RERENDER_THRESHOLD: f64 = 0.7; + let threshold_viewport = viewport.extend_by( + viewport.extents() + * render::VIEWPORT_EXTENTS_MARGIN_FACTOR + * RERENDER_THRESHOLD, + ); + if old_viewport.contains(&threshold_viewport) { + return None; } } RenderCompState::Dirty => {} } } - - // indicates that a task has now started to render the stroke + render_comp.state = RenderCompState::BusyRenderingInTask; - let stroke = stroke.clone(); - - // Spawn a new thread for image rendering - rayon::spawn( - move || match stroke.gen_images(viewport_extended, image_scale) { - Ok(images) => { - tasks_tx.send(EngineTask::UpdateStrokeWithImages { - key, - images, - image_scale, - }); - } - Err(e) => { - error!( - "Generating stroke images failed stroke while regenerating rendering in viewport `{viewport:?}`, stroke key: {key:?}, Err: {e:?}" - ); - } - }, - ); - } + + Some((key, stroke)) + }) + .collect(); + + // Fase 2: genera immagini in parallelo su thread separati + for (key, stroke) in tasks { + let tasks_tx = tasks_tx.clone(); + let viewport_extended = viewport_extended.clone(); + rayon::spawn(move || { + match stroke.gen_images(viewport_extended, image_scale) { + Ok(images) => { + tasks_tx.send(EngineTask::UpdateStrokeWithImages { + key, + images, + image_scale, + }); + } + Err(e) => { + error!( + "Generating stroke images failed in regenerate_rendering_in_viewport_threaded. Key: {:?}, Err: {:?}", + key, e + ); + } + } + }); } - println!( - "for keys completed in {:.2?}", - t1.elapsed() - ); + + println!("for keys completed in {:.2?}", t1.elapsed()); } + /// Clear all rendering for all strokes. pub(crate) fn clear_rendering(&mut self) { From 21b4ad96e0cbb612cf872ce9d35444b111994a1d Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 11:24:24 +0200 Subject: [PATCH 23/28] Update render_comp.rs --- crates/rnote-engine/src/store/render_comp.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/rnote-engine/src/store/render_comp.rs b/crates/rnote-engine/src/store/render_comp.rs index 81b87a5637..aa8dbf3fe8 100644 --- a/crates/rnote-engine/src/store/render_comp.rs +++ b/crates/rnote-engine/src/store/render_comp.rs @@ -244,23 +244,20 @@ impl StrokeStore { image_scale: f64, ) { let t0 = Instant::now(); - let keys = self.render_components.keys().cloned().collect::>(); + let keys = self.render_components.keys().collect::>(); println!("render_component completed in {:.2?}", t0.elapsed()); let t1 = Instant::now(); - // Estendi il viewport una sola volta let viewport_extended = viewport.extend_by(viewport.extents() * render::VIEWPORT_EXTENTS_MARGIN_FACTOR); - // Fase 1: raccogli dati clonati e leggeri per il processing parallelo let tasks: Vec<_> = keys .into_iter() .filter_map(|key| { - let stroke = self.stroke_components.get(&key)?.clone(); - let render_comp = self.render_components.get_mut(&key)?; + let stroke = self.stroke_components.get(key)?.clone(); + let render_comp = self.render_components.get_mut(key)?; - // Skip se non visibile if !viewport_extended.intersects(&stroke.bounds()) { #[cfg(feature = "ui")] { @@ -295,7 +292,6 @@ impl StrokeStore { }) .collect(); - // Fase 2: genera immagini in parallelo su thread separati for (key, stroke) in tasks { let tasks_tx = tasks_tx.clone(); let viewport_extended = viewport_extended.clone(); @@ -321,6 +317,7 @@ impl StrokeStore { println!("for keys completed in {:.2?}", t1.elapsed()); } + /// Clear all rendering for all strokes. pub(crate) fn clear_rendering(&mut self) { From ca32e3d3c0e2d8361675f5ffe6e14d48fb8c8e2b Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 12:29:53 +0200 Subject: [PATCH 24/28] Update render_comp.rs --- crates/rnote-engine/src/store/render_comp.rs | 98 ++++++++++++-------- 1 file changed, 57 insertions(+), 41 deletions(-) diff --git a/crates/rnote-engine/src/store/render_comp.rs b/crates/rnote-engine/src/store/render_comp.rs index aa8dbf3fe8..a53bfa2036 100644 --- a/crates/rnote-engine/src/store/render_comp.rs +++ b/crates/rnote-engine/src/store/render_comp.rs @@ -243,81 +243,97 @@ impl StrokeStore { viewport: Aabb, image_scale: f64, ) { + use std::time::Instant; + let t0 = Instant::now(); - let keys = self.render_components.keys().collect::>(); + let keys: Vec = self.render_components.keys().collect(); println!("render_component completed in {:.2?}", t0.elapsed()); let t1 = Instant::now(); - let viewport_extended = - viewport.extend_by(viewport.extents() * render::VIEWPORT_EXTENTS_MARGIN_FACTOR); + // Clone strokes fuori dal ciclo per accesso condiviso nei thread + let t2 = Instant::now(); + let strokes = self.stroke_components.clone(); + println!("stroke_components clone completed in {:.2?}", t2.elapsed()); + + for key in keys { + // Otteniamo solo render_component mutabilmente + if let Some(render_comp) = self.render_components.get_mut(key) { + let stroke_bounds = strokes.get(key).map(|s| s.bounds()); + + // Se lo stroke non esiste, salta + let Some(stroke_bounds) = stroke_bounds else { continue }; - let tasks: Vec<_> = keys - .into_iter() - .filter_map(|key| { - let stroke = self.stroke_components.get(key)?.clone(); - let render_comp = self.render_components.get_mut(key)?; + let viewport_extended = + viewport.extend_by(viewport.extents() * render::VIEWPORT_EXTENTS_MARGIN_FACTOR); - if !viewport_extended.intersects(&stroke.bounds()) { + // Se lo stroke è fuori viewport, svuota immagini/rendernodes + if !viewport_extended.intersects(&stroke_bounds) { #[cfg(feature = "ui")] { render_comp.rendernodes = vec![]; } render_comp.images = vec![]; render_comp.state = RenderCompState::Dirty; - return None; + continue; } + // Skip se non forzato e il render è già completo o in corso if !force_regenerate { match render_comp.state { - RenderCompState::Complete | RenderCompState::BusyRenderingInTask => return None, + RenderCompState::Complete | RenderCompState::BusyRenderingInTask => { + continue; + } RenderCompState::ForViewport(old_viewport) => { - const RERENDER_THRESHOLD: f64 = 0.7; - let threshold_viewport = viewport.extend_by( - viewport.extents() - * render::VIEWPORT_EXTENTS_MARGIN_FACTOR - * RERENDER_THRESHOLD, - ); - if old_viewport.contains(&threshold_viewport) { - return None; + const VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD: f64 = 0.7; + + let rerender_margin = viewport.extents() + * render::VIEWPORT_EXTENTS_MARGIN_FACTOR + * VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD; + + if old_viewport.contains(&viewport.extend_by(rerender_margin)) { + continue; } } RenderCompState::Dirty => {} } } + // Imposta lo stato come in rendering render_comp.state = RenderCompState::BusyRenderingInTask; - Some((key, stroke)) - }) - .collect(); + let tasks_tx = tasks_tx.clone(); + let stroke_opt = strokes.get(key).cloned(); // Cloniamo dentro il thread + let viewport_extended = viewport_extended.clone(); - for (key, stroke) in tasks { - let tasks_tx = tasks_tx.clone(); - let viewport_extended = viewport_extended.clone(); - rayon::spawn(move || { - match stroke.gen_images(viewport_extended, image_scale) { - Ok(images) => { - tasks_tx.send(EngineTask::UpdateStrokeWithImages { - key, - images, - image_scale, - }); - } - Err(e) => { - error!( - "Generating stroke images failed in regenerate_rendering_in_viewport_threaded. Key: {:?}, Err: {:?}", - key, e - ); + // Spawna il rendering in thread separato + rayon::spawn(move || { + if let Some(stroke) = stroke_opt { + match stroke.gen_images(viewport_extended, image_scale) { + Ok(images) => { + tasks_tx.send(EngineTask::UpdateStrokeWithImages { + key, + images, + image_scale, + }); + } + Err(e) => { + error!( + "Generating stroke images failed for key {:?} in viewport {:?}: {:?}", + key, viewport_extended, e + ); + } + } } - } - }); + }); + } } println!("for keys completed in {:.2?}", t1.elapsed()); } + /// Clear all rendering for all strokes. pub(crate) fn clear_rendering(&mut self) { From f9e6c3ab08f7c00554b8d7db3b10bc5ed79eede0 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 12:30:33 +0200 Subject: [PATCH 25/28] Update rendering.rs --- crates/rnote-engine/src/engine/rendering.rs | 37 ++++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/crates/rnote-engine/src/engine/rendering.rs b/crates/rnote-engine/src/engine/rendering.rs index 79945d59b4..ed5eabb540 100644 --- a/crates/rnote-engine/src/engine/rendering.rs +++ b/crates/rnote-engine/src/engine/rendering.rs @@ -5,7 +5,12 @@ use p2d::bounding_volume::Aabb; use piet::RenderContext; use rnote_compose::color; use tracing::error; -use std::time::Instant; +use std::time::{Instant, Duration}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use std::thread; + +static SHOULD_RENDER: AtomicBool = AtomicBool::new(true); impl Engine { /// Update the background rendering for the current viewport. @@ -99,18 +104,32 @@ impl Engine { pub fn update_content_rendering_current_viewport(&mut self) -> WidgetFlags { let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); - self.store.regenerate_rendering_in_viewport_threaded( - self.engine_tasks_tx(), - false, - self.camera.viewport(), - self.camera.image_scale(), - ); + + // Invece di renderizzare subito... + if SHOULD_RENDER.swap(false, Ordering::SeqCst) { + let tasks_tx = self.engine_tasks_tx(); + let viewport = self.camera.viewport(); + let image_scale = self.camera.image_scale(); + let store = self.store.clone(); // Assicurati che sia Arc o che possa essere clonato + + thread::spawn(move || { + thread::sleep(Duration::from_millis(16)); // piccolo delay per evitare blocchi visibili + store.regenerate_rendering_in_viewport_threaded( + tasks_tx, + false, + viewport, + image_scale, + ); + SHOULD_RENDER.store(true, Ordering::SeqCst); + }); + } + widget_flags.redraw = true; - let elapsed = start_time.elapsed(); println!( "update_content_rendering_current_viewport completed in {:.2?}", - elapsed + start_time.elapsed() ); + widget_flags } From 5564f694436fe5b19fdf3b0b7818a5efef3ec89e Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:17:54 +0200 Subject: [PATCH 26/28] Update penholder.rs --- crates/rnote-engine/src/pens/penholder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rnote-engine/src/pens/penholder.rs b/crates/rnote-engine/src/pens/penholder.rs index 1b80b2e1ce..fe5c97b934 100644 --- a/crates/rnote-engine/src/pens/penholder.rs +++ b/crates/rnote-engine/src/pens/penholder.rs @@ -460,7 +460,7 @@ impl PenHolder { .current_style_w_override(&engine_view.config.pens_config); self.backlog_policy = match current_style { - PenStyle::Brush => BacklogPolicy::Limit(Duration::from_millis(4)), + PenStyle::Brush => BacklogPolicy::Disable, PenStyle::Shaper => BacklogPolicy::Limit(Duration::from_millis(8)), PenStyle::Typewriter => BacklogPolicy::Limit(Duration::from_millis(33)), PenStyle::Eraser => BacklogPolicy::Limit(Duration::from_millis(33)), From b3d94a13116501df0fc5f3161ae595464093f516 Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:19:45 +0200 Subject: [PATCH 27/28] Update rendering.rs --- crates/rnote-engine/src/engine/rendering.rs | 37 +++++---------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/crates/rnote-engine/src/engine/rendering.rs b/crates/rnote-engine/src/engine/rendering.rs index ed5eabb540..79945d59b4 100644 --- a/crates/rnote-engine/src/engine/rendering.rs +++ b/crates/rnote-engine/src/engine/rendering.rs @@ -5,12 +5,7 @@ use p2d::bounding_volume::Aabb; use piet::RenderContext; use rnote_compose::color; use tracing::error; -use std::time::{Instant, Duration}; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; -use std::thread; - -static SHOULD_RENDER: AtomicBool = AtomicBool::new(true); +use std::time::Instant; impl Engine { /// Update the background rendering for the current viewport. @@ -104,32 +99,18 @@ impl Engine { pub fn update_content_rendering_current_viewport(&mut self) -> WidgetFlags { let start_time = Instant::now(); let mut widget_flags = WidgetFlags::default(); - - // Invece di renderizzare subito... - if SHOULD_RENDER.swap(false, Ordering::SeqCst) { - let tasks_tx = self.engine_tasks_tx(); - let viewport = self.camera.viewport(); - let image_scale = self.camera.image_scale(); - let store = self.store.clone(); // Assicurati che sia Arc o che possa essere clonato - - thread::spawn(move || { - thread::sleep(Duration::from_millis(16)); // piccolo delay per evitare blocchi visibili - store.regenerate_rendering_in_viewport_threaded( - tasks_tx, - false, - viewport, - image_scale, - ); - SHOULD_RENDER.store(true, Ordering::SeqCst); - }); - } - + self.store.regenerate_rendering_in_viewport_threaded( + self.engine_tasks_tx(), + false, + self.camera.viewport(), + self.camera.image_scale(), + ); widget_flags.redraw = true; + let elapsed = start_time.elapsed(); println!( "update_content_rendering_current_viewport completed in {:.2?}", - start_time.elapsed() + elapsed ); - widget_flags } From bcd0b6d76efd6676d913b58cdacfba5d9fb496be Mon Sep 17 00:00:00 2001 From: Intranox <118127792+Intranox@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:34:43 +0200 Subject: [PATCH 28/28] Update render_comp.rs --- crates/rnote-engine/src/store/render_comp.rs | 143 +++++++++++-------- 1 file changed, 83 insertions(+), 60 deletions(-) diff --git a/crates/rnote-engine/src/store/render_comp.rs b/crates/rnote-engine/src/store/render_comp.rs index a53bfa2036..4faec46ca0 100644 --- a/crates/rnote-engine/src/store/render_comp.rs +++ b/crates/rnote-engine/src/store/render_comp.rs @@ -8,7 +8,7 @@ use p2d::bounding_volume::{Aabb, BoundingVolume}; use rnote_compose::ext::AabbExt; use rnote_compose::shapes::Shapeable; use tracing::error; -use std::time::Instant; +use std::time::{Duration, Instant}; /// The tolerance where check between scale-factors are considered "equal". pub(crate) const RENDER_IMAGE_SCALE_TOLERANCE: f64 = 0.01; @@ -243,31 +243,46 @@ impl StrokeStore { viewport: Aabb, image_scale: f64, ) { - use std::time::Instant; - let t0 = Instant::now(); - let keys: Vec = self.render_components.keys().collect(); - println!("render_component completed in {:.2?}", t0.elapsed()); - + let keys = self.render_components.keys().collect::>(); + println!( + "render_component completed in {:.2?}", + t0.elapsed() + ); + let t1 = Instant::now(); - - // Clone strokes fuori dal ciclo per accesso condiviso nei thread - let t2 = Instant::now(); - let strokes = self.stroke_components.clone(); - println!("stroke_components clone completed in {:.2?}", t2.elapsed()); - + let mut total_t2 = Duration::ZERO; + let mut total_t3 = Duration::ZERO; + let mut total_t4 = Duration::ZERO; + let mut total_t5 = Duration::ZERO; + let mut total_t6 = Duration::ZERO; + let mut cycle_count = 0; for key in keys { - // Otteniamo solo render_component mutabilmente - if let Some(render_comp) = self.render_components.get_mut(key) { - let stroke_bounds = strokes.get(key).map(|s| s.bounds()); - - // Se lo stroke non esiste, salta - let Some(stroke_bounds) = stroke_bounds else { continue }; - + if let (Some(stroke), Some(render_comp)) = ( + self.stroke_components.get(key), + self.render_components.get_mut(key), + ) { + cycle_count += 1; + + let t2 = Instant::now(); + let tasks_tx = tasks_tx.clone(); + let elapsed_t2 = t2.elapsed(); + total_t2 += elapsed_t2; + //println!("task_tx completed in {:.2?}", elapsed_t2); + + let t3 = Instant::now(); + let stroke_bounds = stroke.bounds(); + let elapsed_t3 = t3.elapsed(); + total_t3 += elapsed_t3; + //println!("stroke_bounds completed in {:.2?}", elapsed_t3); + + let t4 = Instant::now(); let viewport_extended = viewport.extend_by(viewport.extents() * render::VIEWPORT_EXTENTS_MARGIN_FACTOR); - - // Se lo stroke è fuori viewport, svuota immagini/rendernodes + let elapsed_t4 = t4.elapsed(); + total_t4 += elapsed_t4; + //println!("viewport_extend completed in {:.2?}", elapsed_t4); + if !viewport_extended.intersects(&stroke_bounds) { #[cfg(feature = "ui")] { @@ -277,8 +292,7 @@ impl StrokeStore { render_comp.state = RenderCompState::Dirty; continue; } - - // Skip se non forzato e il render è già completo o in corso + if !force_regenerate { match render_comp.state { RenderCompState::Complete | RenderCompState::BusyRenderingInTask => { @@ -286,54 +300,63 @@ impl StrokeStore { } RenderCompState::ForViewport(old_viewport) => { const VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD: f64 = 0.7; - - let rerender_margin = viewport.extents() - * render::VIEWPORT_EXTENTS_MARGIN_FACTOR - * VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD; - - if old_viewport.contains(&viewport.extend_by(rerender_margin)) { + + if old_viewport.contains( + &(viewport.extend_by( + viewport.extents() + * render::VIEWPORT_EXTENTS_MARGIN_FACTOR + * VIEWPORT_EXTENTS_MARGIN_RERENDER_THRESHOLD, + )), + ) { continue; } } RenderCompState::Dirty => {} } } - - // Imposta lo stato come in rendering + + let t5 = Instant::now(); render_comp.state = RenderCompState::BusyRenderingInTask; - - let tasks_tx = tasks_tx.clone(); - let stroke_opt = strokes.get(key).cloned(); // Cloniamo dentro il thread - let viewport_extended = viewport_extended.clone(); - - // Spawna il rendering in thread separato - rayon::spawn(move || { - if let Some(stroke) = stroke_opt { - match stroke.gen_images(viewport_extended, image_scale) { - Ok(images) => { - tasks_tx.send(EngineTask::UpdateStrokeWithImages { - key, - images, - image_scale, - }); - } - Err(e) => { - error!( - "Generating stroke images failed for key {:?} in viewport {:?}: {:?}", - key, viewport_extended, e - ); - } + let stroke = stroke.clone(); + let elapsed_t5 = t5.elapsed(); + total_t5 += elapsed_t5; + //println!("clone completed in {:.2?}", elapsed_t5); + + let t6 = Instant::now(); + rayon::spawn( + move || match stroke.gen_images(viewport_extended, image_scale) { + Ok(images) => { + tasks_tx.send(EngineTask::UpdateStrokeWithImages { + key, + images, + image_scale, + }); } - } - }); + Err(e) => { + error!( + "Generating stroke images failed stroke while regenerating rendering in viewport `{viewport:?}`, stroke key: {key:?}, Err: {e:?}" + ); + } + }, + ); + let elapsed_t6 = t6.elapsed(); + total_t6 += elapsed_t6; + //println!("spawn completed in {:.2?}", elapsed_t6); } } - - println!("for keys completed in {:.2?}", t1.elapsed()); + + println!("\nSummary for {} cycle(s):", cycle_count); + println!("Total task_tx time: {:.2?}", total_t2); + println!("Total stroke_bounds time: {:.2?}", total_t3); + println!("Total viewport_extend time:{:.2?}", total_t4); + println!("Total clone time: {:.2?}", total_t5); + println!("Total spawn time: {:.2?}", total_t6); + println!(); + println!( + "for keys completed in {:.2?}", + t1.elapsed() + ); } - - - /// Clear all rendering for all strokes. pub(crate) fn clear_rendering(&mut self) {