From 6fa7c906de7f575733e84a45f29925a0bfa79355 Mon Sep 17 00:00:00 2001 From: Infus Date: Fri, 22 Jun 2018 20:46:42 +0200 Subject: [PATCH] Move Registering of Events from Add to Load No need to register for events that eagerly for auras that might never load. That's probably not a big win for performance, but should help. Github-Issue: 461 --- WeakAuras/GenericTrigger.lua | 59 +++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/WeakAuras/GenericTrigger.lua b/WeakAuras/GenericTrigger.lua index 586268aa29..ba38f92e5f 100644 --- a/WeakAuras/GenericTrigger.lua +++ b/WeakAuras/GenericTrigger.lua @@ -707,6 +707,7 @@ end function GenericTrigger.UnloadAll() wipe(loaded_auras); wipe(loaded_events); + WeakAuras.UnregisterAllEveryFrameUpdate(); end function GenericTrigger.UnloadDisplay(id) @@ -720,6 +721,7 @@ function GenericTrigger.UnloadDisplay(id) events[id] = nil; end end + WeakAuras.UnregisterEveryFrameUpdate(id); end local frame = CreateFrame("FRAME"); @@ -769,14 +771,31 @@ function LoadEvent(id, triggernum, data) end function GenericTrigger.LoadDisplay(id) + local register_for_frame_updates = false; if(events[id]) then loaded_auras[id] = true; for triggernum, data in pairs(events[id]) do - if(events[id] and events[id][triggernum]) then - LoadEvent(id, triggernum, data); + for index, event in pairs(data.events) do + if (event == "COMBAT_LOG_EVENT_UNFILTERED_CUSTOM") then + frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED"); + elseif (event == "FRAME_UPDATE") then + register_for_frame_updates = true; + else + frame:RegisterEvent(event); + aceEvents:RegisterMessage(event, HandleEvent, frame) + end end + + LoadEvent(id, triggernum, data); end end + + if(register_for_frame_updates) then + WeakAuras.RegisterEveryFrameUpdate(id); + else + WeakAuras.UnregisterEveryFrameUpdate(id); + end + end local function trueFunction() @@ -791,8 +810,6 @@ function GenericTrigger.Add(data, region) events[id] = nil; WeakAuras.forceable_events[id] = {}; - local register_for_frame_updates = false; - for triggernum=0,(data.numTriggers or 9) do local trigger, untrigger; if(triggernum == 0) then @@ -873,15 +890,6 @@ function GenericTrigger.Add(data, region) if (type(trigger_events) == "function") then trigger_events = trigger_events(trigger, untrigger); end - - for index, event in ipairs(trigger_events) do - if (event == "FRAME_UPDATE") then - register_for_frame_updates = true; - else - frame:RegisterEvent(event); - aceEvents:RegisterMessage(event, HandleEvent, frame) - end - end end end else @@ -919,7 +927,6 @@ function GenericTrigger.Add(data, region) end if((trigger.custom_type == "status" or trigger.custom_type == "stateupdate") and trigger.check == "update") then - register_for_frame_updates = true; trigger_events = {"FRAME_UPDATE"}; else trigger_events = WeakAuras.split(trigger.events); @@ -930,14 +937,6 @@ function GenericTrigger.Add(data, region) -- COMBAT_LOG_EVENT_UNFILTERED, this hack renames the event to COMBAT_LOG_EVENT_UNFILTERED_CUSTOM to circumvent the COMBAT_LOG_EVENT_UNFILTERED checks -- that are already in place. Replacing all those checks would be a pain in the ass. trigger_events[index] = "COMBAT_LOG_EVENT_UNFILTERED_CUSTOM"; - frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED"); - else - if (event == "FRAME_UPDATE") then - register_for_frame_updates = true; - else - frame:RegisterEvent(event); - aceEvents:RegisterMessage(event, HandleEvent, frame) - end end force_events = trigger.custom_type == "status"; end @@ -1003,11 +1002,7 @@ function GenericTrigger.Add(data, region) end end - if(register_for_frame_updates) then - WeakAuras.RegisterEveryFrameUpdate(id); - else - WeakAuras.UnregisterEveryFrameUpdate(id); - end + end do @@ -1050,6 +1045,16 @@ do updating = false; end end + + function WeakAuras.UnregisterAllEveryFrameUpdate() + if (not update_frame) then + return; + end + wipe(update_clients); + update_clients_num = 0; + update_frame:SetScript("OnUpdate", nil); + updating = false; + end end local combatLogUpgrade = {