From 6abfa4be7bbde729502f437493212f49068c34a0 Mon Sep 17 00:00:00 2001 From: kobewi Date: Mon, 8 Apr 2024 20:26:32 +0200 Subject: [PATCH] Don't redraw invisible CanvasItems --- scene/main/canvas_item.cpp | 12 +++++++----- scene/main/canvas_item.h | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 39f629f5240..b47bead7619 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -136,9 +136,11 @@ void CanvasItem::_redraw_callback() { return; } - RID ci = get_canvas_item(); - RenderingServer::get_singleton()->canvas_item_clear(ci); - //todo updating = true - only allow drawing here + if (draw_commands_dirty) { + RenderingServer::get_singleton()->canvas_item_clear(get_canvas_item()); + draw_commands_dirty = false; + } + if (is_visible_in_tree()) { drawing = true; Ref ts = TextServerManager::get_singleton()->get_primary_interface(); @@ -154,9 +156,9 @@ void CanvasItem::_redraw_callback() { ts->set_current_drawn_item_oversampling(0.0); } drawing = false; + draw_commands_dirty = true; } - //todo updating = false - pending_update = false; // don't change to false until finished drawing (avoid recursive update) + pending_update = false; // Don't change to false until finished drawing (avoid recursive update). } Transform2D CanvasItem::get_global_transform_with_canvas() const { diff --git a/scene/main/canvas_item.h b/scene/main/canvas_item.h index 14e11a97686..7ec6555ff87 100644 --- a/scene/main/canvas_item.h +++ b/scene/main/canvas_item.h @@ -36,6 +36,7 @@ class CanvasLayer; class MultiMesh; class StyleBox; +class SubViewport; class Window; class World2D; @@ -97,6 +98,7 @@ private: bool visible = true; bool parent_visible_in_tree = false; bool pending_update = false; + bool draw_commands_dirty = false; bool top_level = false; bool drawing = false; bool block_transform_notify = false;