animationmgr: avoid looping over all avars in favor of only active ones

This commit is contained in:
vaxerski 2023-07-20 19:26:10 +02:00
parent 7940f779e9
commit 6c1f4faff2
4 changed files with 23 additions and 9 deletions

View file

@ -51,13 +51,14 @@ CAnimatedVariable::~CAnimatedVariable() {
} }
void CAnimatedVariable::unregister() { 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; m_bIsRegistered = false;
disconnectFromActive();
} }
void CAnimatedVariable::registerVar() { void CAnimatedVariable::registerVar() {
if (!m_bIsRegistered) if (!m_bIsRegistered)
g_pAnimationManager->m_lAnimatedVariables.push_back(this); g_pAnimationManager->m_vAnimatedVariables.push_back(this);
m_bIsRegistered = true; m_bIsRegistered = true;
} }
@ -78,4 +79,15 @@ float CAnimatedVariable::getCurveValue() {
return 1.f; return 1.f;
return g_pAnimationManager->getBezier(m_pConfig->pValues->internalBezier)->getYForPoint(SPENT); 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;
} }

View file

@ -259,9 +259,14 @@ class CAnimatedVariable {
std::function<void(void* thisptr)> m_fBeginCallback; std::function<void(void* thisptr)> m_fBeginCallback;
std::function<void(void* thisptr)> m_fUpdateCallback; std::function<void(void* thisptr)> m_fUpdateCallback;
bool m_bIsConnectedToActive = false;
void connectToActive();
void disconnectFromActive();
// methods // methods
void onAnimationEnd() { void onAnimationEnd() {
m_bIsBeingAnimated = false; m_bIsBeingAnimated = false;
disconnectFromActive();
if (m_fEndCallback) { if (m_fEndCallback) {
// loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. // 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() { void onAnimationBegin() {
m_bIsBeingAnimated = true; m_bIsBeingAnimated = true;
connectToActive();
if (m_fBeginCallback) { if (m_fBeginCallback) {
m_fBeginCallback(this); m_fBeginCallback(this);

View file

@ -58,12 +58,7 @@ void CAnimationManager::tick() {
std::vector<CAnimatedVariable*> animationEndedVars; std::vector<CAnimatedVariable*> animationEndedVars;
for (auto& av : m_lAnimatedVariables) { for (auto& av : m_vActiveAnimatedVariables) {
// 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;
if (av->m_eDamagePolicy == AVARDAMAGE_SHADOW && !*PSHADOWSENABLED) { if (av->m_eDamagePolicy == AVARDAMAGE_SHADOW && !*PSHADOWSENABLED) {
av->warp(false); av->warp(false);

View file

@ -25,7 +25,8 @@ class CAnimationManager {
std::unordered_map<std::string, CBezierCurve> getAllBeziers(); 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; wl_event_source* m_pAnimationTick;