diff options
author | vaxerski <[email protected]> | 2023-07-20 19:26:10 +0200 |
---|---|---|
committer | vaxerski <[email protected]> | 2023-07-20 19:26:10 +0200 |
commit | 6c1f4faff2602a6d834d8f641a8a39783bbb9465 (patch) | |
tree | b7c662026ce9b584baf4a2d1d65d02464dd49d79 | |
parent | 7940f779e9dd670157932ce17a872c14747ad490 (diff) | |
download | Hyprland-6c1f4faff2602a6d834d8f641a8a39783bbb9465.tar.gz Hyprland-6c1f4faff2602a6d834d8f641a8a39783bbb9465.zip |
animationmgr: avoid looping over all avars in favor of only active ones
-rw-r--r-- | src/helpers/AnimatedVariable.cpp | 16 | ||||
-rw-r--r-- | src/helpers/AnimatedVariable.hpp | 6 | ||||
-rw-r--r-- | src/managers/AnimationManager.cpp | 7 | ||||
-rw-r--r-- | src/managers/AnimationManager.hpp | 3 |
4 files changed, 23 insertions, 9 deletions
diff --git a/src/helpers/AnimatedVariable.cpp b/src/helpers/AnimatedVariable.cpp index 5b98e426..2961439d 100644 --- a/src/helpers/AnimatedVariable.cpp +++ b/src/helpers/AnimatedVariable.cpp @@ -51,13 +51,14 @@ CAnimatedVariable::~CAnimatedVariable() { } void CAnimatedVariable::unregister() { - g_pAnimationManager->m_lAnimatedVariables.remove(this); + std::erase_if(g_pAnimationManager->m_vAnimatedVariables, [&](const auto& other) { return other == this; }); m_bIsRegistered = false; + disconnectFromActive(); } void CAnimatedVariable::registerVar() { if (!m_bIsRegistered) - g_pAnimationManager->m_lAnimatedVariables.push_back(this); + g_pAnimationManager->m_vAnimatedVariables.push_back(this); m_bIsRegistered = true; } @@ -78,4 +79,15 @@ float CAnimatedVariable::getCurveValue() { return 1.f; return g_pAnimationManager->getBezier(m_pConfig->pValues->internalBezier)->getYForPoint(SPENT); +} + +void CAnimatedVariable::connectToActive() { + if (!m_bIsConnectedToActive) + g_pAnimationManager->m_vActiveAnimatedVariables.push_back(this); + m_bIsConnectedToActive = true; +} + +void CAnimatedVariable::disconnectFromActive() { + std::erase_if(g_pAnimationManager->m_vActiveAnimatedVariables, [&](const auto& other) { return other == this; }); + m_bIsConnectedToActive = false; }
\ No newline at end of file diff --git a/src/helpers/AnimatedVariable.hpp b/src/helpers/AnimatedVariable.hpp index ccba625d..d234dce2 100644 --- a/src/helpers/AnimatedVariable.hpp +++ b/src/helpers/AnimatedVariable.hpp @@ -259,9 +259,14 @@ class CAnimatedVariable { std::function<void(void* thisptr)> m_fBeginCallback; std::function<void(void* thisptr)> m_fUpdateCallback; + bool m_bIsConnectedToActive = false; + void connectToActive(); + void disconnectFromActive(); + // methods void onAnimationEnd() { m_bIsBeingAnimated = false; + disconnectFromActive(); if (m_fEndCallback) { // loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. @@ -274,6 +279,7 @@ class CAnimatedVariable { void onAnimationBegin() { m_bIsBeingAnimated = true; + connectToActive(); if (m_fBeginCallback) { m_fBeginCallback(this); diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index 0973c759..2f2977c4 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -58,12 +58,7 @@ void CAnimationManager::tick() { std::vector<CAnimatedVariable*> animationEndedVars; - for (auto& av : m_lAnimatedVariables) { - - // first of all, check if we need to update it at all - // TODO: this has a 100% cache miss rate, maybe move active avars to a separate vec - if (!av->m_bIsBeingAnimated) - continue; + for (auto& av : m_vActiveAnimatedVariables) { if (av->m_eDamagePolicy == AVARDAMAGE_SHADOW && !*PSHADOWSENABLED) { av->warp(false); diff --git a/src/managers/AnimationManager.hpp b/src/managers/AnimationManager.hpp index db7055c8..6d2830fd 100644 --- a/src/managers/AnimationManager.hpp +++ b/src/managers/AnimationManager.hpp @@ -25,7 +25,8 @@ class CAnimationManager { std::unordered_map<std::string, CBezierCurve> getAllBeziers(); - std::list<CAnimatedVariable*> m_lAnimatedVariables; + std::vector<CAnimatedVariable*> m_vAnimatedVariables; + std::vector<CAnimatedVariable*> m_vActiveAnimatedVariables; wl_event_source* m_pAnimationTick; |