aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorvaxerski <[email protected]>2023-07-20 19:26:10 +0200
committervaxerski <[email protected]>2023-07-20 19:26:10 +0200
commit6c1f4faff2602a6d834d8f641a8a39783bbb9465 (patch)
treeb7c662026ce9b584baf4a2d1d65d02464dd49d79
parent7940f779e9dd670157932ce17a872c14747ad490 (diff)
downloadHyprland-6c1f4faff2602a6d834d8f641a8a39783bbb9465.tar.gz
Hyprland-6c1f4faff2602a6d834d8f641a8a39783bbb9465.zip
animationmgr: avoid looping over all avars in favor of only active ones
-rw-r--r--src/helpers/AnimatedVariable.cpp16
-rw-r--r--src/helpers/AnimatedVariable.hpp6
-rw-r--r--src/managers/AnimationManager.cpp7
-rw-r--r--src/managers/AnimationManager.hpp3
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;