From 8f10f45756bf75e293fa274632a4ccfdd5ada34d Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 12 Jun 2025 16:06:51 +0900 Subject: [PATCH] renderer: caching the viewport update reuse cached scene viewport data if scene had no update before, just a minor optimization --- src/renderer/tvgScene.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/renderer/tvgScene.h b/src/renderer/tvgScene.h index 506bb876..ed6f8cde 100644 --- a/src/renderer/tvgScene.h +++ b/src/renderer/tvgScene.h @@ -68,6 +68,7 @@ struct SceneImpl : Scene Array* effects = nullptr; uint8_t compFlag = CompositionFlag::Invalid; uint8_t opacity; //for composition + bool vdirty = false; SceneImpl() : impl(Paint::Impl(this)) { @@ -105,7 +106,7 @@ struct SceneImpl : Scene RenderData update(RenderMethod* renderer, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flag, TVG_UNUSED bool clipper) { - this->vport = renderer->viewport(); + if (paints.empty()) return nullptr; if (needComposition(opacity)) { /* Overriding opacity value. If this scene is half-translucent, @@ -123,11 +124,17 @@ struct SceneImpl : Scene } } + //this viewport update is more performant than in bounds()? + vport = renderer->viewport(); + vdirty = true; + return nullptr; } bool render(RenderMethod* renderer) { + if (paints.empty()) return true; + RenderCompositor* cmp = nullptr; auto ret = true; @@ -157,9 +164,11 @@ struct SceneImpl : Scene return ret; } - RenderRegion bounds(RenderMethod* renderer) const + RenderRegion bounds(RenderMethod* renderer) { if (paints.empty()) return {}; + if (!vdirty) return vport; + vdirty = false; //Merge regions RenderRegion pRegion = {{INT32_MAX, INT32_MAX}, {0, 0}}; @@ -185,8 +194,8 @@ struct SceneImpl : Scene pRegion.max.x += eRegion.max.x; pRegion.max.y += eRegion.max.y; - pRegion.intersect(this->vport); - return pRegion; + vport = RenderRegion::intersect(vport, pRegion); + return vport; } Result bounds(Point* pt4, Matrix& m, bool obb, bool stroking)