From 1c1f23d68daec51df6262a2412a29bcc6e8bda77 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Mon, 21 Jul 2025 13:57:48 +0300 Subject: [PATCH] Only run update and check_timer functions on components that need it --- src/DrawingProgram/DrawingProgram.cpp | 25 +++++++++++++++++++++---- src/DrawingProgram/DrawingProgram.hpp | 6 ++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 8ff41a5..813792a 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -57,9 +57,14 @@ DrawingProgram::DrawingProgram(World& initWorld): }; components.clientInsertCallback = [&](const CollabListType::ObjectInfoPtr& c) { compCache.add_component(c); + DrawComponentType t = c->obj->get_type(); + if(t == DRAWCOMPONENT_IMAGE || t == DRAWCOMPONENT_TEXTBOX) + updateableComponents.emplace(c->obj); }; components.clientEraseCallback = [&](const CollabListType::ObjectInfoPtr& c) { compCache.erase_component(c); + delayedUpdateTransformComponents.erase(c->obj); + updateableComponents.erase(c->obj); }; components.clientServerLastPosShiftCallback = [&](uint64_t lastShiftPos) { compCache.invalidate_cache_before_pos(lastShiftPos); @@ -87,6 +92,7 @@ void DrawingProgram::init_client_callbacks() { else { comp->delayedUpdatePtr = DrawComponent::allocate_comp_type(comp->get_type()); message(*comp->delayedUpdatePtr); + delayedUpdateTransformComponents.emplace(comp); } }); world.con.client_add_recv_callback(CLIENT_TRANSFORM_COMPONENT, [&](cereal::PortableBinaryInputArchive& message) { @@ -107,6 +113,7 @@ void DrawingProgram::init_client_callbacks() { else { comp->delayedCoordinateSpace = std::make_shared(); message(*comp->delayedCoordinateSpace); + delayedUpdateTransformComponents.emplace(comp); } }); world.con.client_add_recv_callback(CLIENT_PLACE_COMPONENT, [&](cereal::PortableBinaryInputArchive& message) { @@ -127,6 +134,18 @@ void DrawingProgram::init_client_callbacks() { }); } +void DrawingProgram::check_delayed_update_transform_timers() { + std::erase_if(delayedUpdateTransformComponents, [&](auto& comp) { + comp->check_timers(*this); + return !comp->delayedUpdatePtr && !comp->delayedCoordinateSpace; + }); +} + +void DrawingProgram::check_updateable_components() { + for(auto& comp : updateableComponents) + comp->update(*this); +} + void DrawingProgram::free_collider_memory() { for(auto& c : components.client_list()) c->obj->free_collider(); @@ -354,10 +373,8 @@ void DrawingProgram::update() { if(controls.leftClickReleased) controls.leftClickReleased = false; - for(auto& c : components.client_list()) { - c->obj->check_timers(*this); - c->obj->update(*this); - } + check_delayed_update_transform_timers(); + check_updateable_components(); compCache.update(); } diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 2579e50..9ee9bcb 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -55,9 +55,15 @@ class DrawingProgram { CollabListType components; + std::unordered_set> updateableComponents; + std::unordered_set> delayedUpdateTransformComponents; Vector4f* get_foreground_color_ptr(); private: + + void check_delayed_update_transform_timers(); + void check_updateable_components(); + std::atomic addFileInNextFrame = false; std::pair addFileInfo;