mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-28 10:26:02 +00:00
actionbar: smoothen all events to a single update
Smoothen all events and limit the buttons to one full update per frame. Rework the queue lists to be indexed by slots, so that one button can't be included more than once. This will buffer bulk events, like during shapeshifting and alike. This provides a massive performance boost on event floods. Some events have also been entirely removed and some where sorted to where they belong to.
This commit is contained in:
+60
-51
@@ -13,9 +13,9 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
end
|
||||
local bpad = border > 1 and border - 1 or 1
|
||||
|
||||
local eventcache = { } -- contains a list of events that shall be processed later
|
||||
local updatecache = { } -- contains a list of buttons that shall be refreshed later
|
||||
local buttoncache = { } -- contains a list of all buttons ever created
|
||||
local eventcache = { } -- contains a list of events that shall be processed later -> [event] = true
|
||||
local updatecache = { } -- contains a list of buttons slots that shall be refreshed later -> [slot] = true
|
||||
local buttoncache = { } -- contains a list of all buttons ever created -> [slot] = frame
|
||||
|
||||
-- hide blizzard bars
|
||||
local function kill(f, killshow)
|
||||
@@ -46,13 +46,20 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
kill(f, true)
|
||||
end
|
||||
|
||||
-- events that provide special updater functions
|
||||
local special_events = {
|
||||
["ACTIONBAR_UPDATE_COOLDOWN"] = true,
|
||||
["ACTIONBAR_UPDATE_STATE"] = true,
|
||||
["ACTIONBAR_UPDATE_USABLE"] = true,
|
||||
}
|
||||
|
||||
-- events that are shared across all buttons
|
||||
local global_events = {
|
||||
-- slot/button updates
|
||||
["PLAYER_ENTERING_WORLD"] = true,
|
||||
["ACTIONBAR_SLOT_CHANGED"] = true,
|
||||
["UPDATE_BINDINGS"] = true,
|
||||
["ACTIONBAR_PAGE_CHANGED"] = true,
|
||||
["ACTIONBAR_UPDATE_STATE"] = true,
|
||||
["UPDATE_BONUS_ACTIONBAR"] = true,
|
||||
["CRAFT_SHOW"] = true,
|
||||
["CRAFT_CLOSE"] = true,
|
||||
@@ -61,21 +68,21 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
["PLAYER_ENTER_COMBAT"] = true,
|
||||
["PLAYER_LEAVE_COMBAT"] = true,
|
||||
-- cooldown updates
|
||||
["ACTIONBAR_UPDATE_USABLE"] = true,
|
||||
["ACTIONBAR_UPDATE_COOLDOWN"] = true,
|
||||
["UNIT_INVENTORY_CHANGED"] = true,
|
||||
}
|
||||
|
||||
-- events that are used for the aura/shapeshift bar
|
||||
local aura_events = {
|
||||
["PLAYER_AURAS_CHANGED"] = true,
|
||||
["UPDATE_SHAPESHIFT_FORMS"] = true,
|
||||
["PLAYER_AURAS_CHANGED"] = true,
|
||||
}
|
||||
|
||||
-- events that are used for the pet bar
|
||||
local pet_events = {
|
||||
["PLAYER_CONTROL_LOST"] = true,
|
||||
["PLAYER_CONTROL_GAINED"] = true,
|
||||
["PLAYER_FARSIGHT_FOCUS_CHANGED"] = true,
|
||||
["UNIT_PET"] = true,
|
||||
["UNIT_FLAGS"] = true,
|
||||
["UNIT_AURA"] = true,
|
||||
["PET_BAR_UPDATE"] = true,
|
||||
["PET_BAR_UPDATE_COOLDOWN"] = true,
|
||||
}
|
||||
@@ -239,16 +246,10 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
end
|
||||
end
|
||||
|
||||
-- helper function to update by slot
|
||||
local function RefreshSlot(slot)
|
||||
local bar, button = ceil(slot/12), mod(slot, 12)
|
||||
button = button == 0 and 12 or button
|
||||
table.insert(updatecache, pfUI.bars[bar][button])
|
||||
end
|
||||
|
||||
local start, duration, enable, castable, autocast, token
|
||||
local id, bar, active, texture, _
|
||||
local function ButtonRefresh(self)
|
||||
if not self then return end
|
||||
local self = self or this
|
||||
local sid = self.id -- 1 to 120
|
||||
|
||||
@@ -378,11 +379,11 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
if C.bars.glowrange == "1" and self.bar ~= 11 and self.bar ~= 12 and HasAction(self.id) and ActionHasRange(self.id) and IsActionInRange(self.id) == 0 then
|
||||
if not self.outofrange then
|
||||
self.outofrange = true
|
||||
table.insert(updatecache, self)
|
||||
updatecache[self.slot] = true
|
||||
end
|
||||
elseif self.outofrange then
|
||||
self.outofrange = nil
|
||||
table.insert(updatecache, self)
|
||||
updatecache[self.slot] = true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -567,8 +568,14 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
local function BarsEvent(self)
|
||||
local self = self or this
|
||||
|
||||
-- cache events that are triggered way to often
|
||||
if event == "ACTIONBAR_UPDATE_COOLDOWN" or event == "ACTIONBAR_UPDATE_STATE" then
|
||||
-- refresh only specific slots
|
||||
if event == "ACTIONBAR_SLOT_CHANGED" and arg1 and arg1 ~= 0 then
|
||||
updatecache[arg1] = true
|
||||
return
|
||||
end
|
||||
|
||||
-- run special refresh functions on next update
|
||||
if special_events[event] then
|
||||
eventcache[event] = true
|
||||
return
|
||||
end
|
||||
@@ -576,7 +583,9 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
-- handle aura events
|
||||
if aura_events[event] then
|
||||
for j=1,12 do
|
||||
if self[11][j] then ButtonRefresh(self[11][j]) end
|
||||
if self[11][j] then
|
||||
updatecache[self[11][j].slot] = true
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
@@ -584,28 +593,16 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
-- handle pet events
|
||||
if pet_events[event] then
|
||||
for j=1,12 do
|
||||
if self[12][j] then ButtonRefresh(self[12][j]) end
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- refresh only specific slots
|
||||
if event == "ACTIONBAR_SLOT_CHANGED" and arg1 and arg1 ~= 0 then
|
||||
RefreshSlot(arg1)
|
||||
return
|
||||
end
|
||||
|
||||
-- update usable actions
|
||||
if event == "ACTIONBAR_UPDATE_USABLE" then
|
||||
for id, button in pairs(buttoncache) do
|
||||
ButtonUpdateUsable(button)
|
||||
if self[12][j] then
|
||||
updatecache[self[12][j].slot] = true
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- handle global events
|
||||
for id, button in pairs(buttoncache) do
|
||||
ButtonRefresh(button)
|
||||
for id in pairs(buttoncache) do
|
||||
updatecache[id] = true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -613,6 +610,14 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
local self = self or this
|
||||
local button
|
||||
|
||||
-- run cached usable usable actions
|
||||
if eventcache["ACTIONBAR_UPDATE_USABLE"] then
|
||||
eventcache["ACTIONBAR_UPDATE_USABLE"] = nil
|
||||
for id, button in pairs(buttoncache) do
|
||||
ButtonUpdateUsable(button)
|
||||
end
|
||||
end
|
||||
|
||||
-- run cached cooldown events
|
||||
if eventcache["ACTIONBAR_UPDATE_COOLDOWN"] then
|
||||
eventcache["ACTIONBAR_UPDATE_COOLDOWN"] = nil
|
||||
@@ -629,8 +634,8 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
end
|
||||
end
|
||||
|
||||
for id, button in pairs(updatecache) do
|
||||
ButtonRefresh(button)
|
||||
for id in pairs(updatecache) do
|
||||
ButtonRefresh(buttoncache[id])
|
||||
updatecache[id] = nil
|
||||
end
|
||||
|
||||
@@ -643,6 +648,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
|
||||
-- create the main event and update handler for pfUI actionbars
|
||||
local bars = CreateFrame("Frame", "pfActionBar", UIParent)
|
||||
for event in pairs(special_events) do bars:RegisterEvent(event) end
|
||||
for event in pairs(global_events) do bars:RegisterEvent(event) end
|
||||
for event in pairs(aura_events) do bars:RegisterEvent(event) end
|
||||
for event in pairs(pet_events) do bars:RegisterEvent(event) end
|
||||
@@ -708,6 +714,9 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
f:HookScript("OnClick", ButtonAnimate)
|
||||
f.id = id
|
||||
|
||||
-- set a static slot
|
||||
f.slot = id
|
||||
|
||||
-- cooldown
|
||||
f.cd = CreateFrame(COOLDOWN_FRAME_TYPE, f:GetName() .. "Cooldown", f, "CooldownFrameTemplate")
|
||||
f.cd.pfCooldownType = "NOGCD"
|
||||
@@ -769,7 +778,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
f.active:Hide()
|
||||
|
||||
-- add to buttoncache
|
||||
table.insert(buttoncache, f)
|
||||
buttoncache[id] = f
|
||||
end
|
||||
|
||||
-- set animation
|
||||
@@ -963,7 +972,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
end
|
||||
|
||||
-- refresh button
|
||||
table.insert(updatecache, bars[i][j])
|
||||
updatecache[bars[i][j].slot] = true
|
||||
end
|
||||
|
||||
for j=buttons+1,12 do
|
||||
@@ -1054,13 +1063,13 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
if not typ then
|
||||
showgrid = state
|
||||
|
||||
for id, button in pairs(buttoncache) do
|
||||
table.insert(updatecache, button)
|
||||
for id in pairs(buttoncache) do
|
||||
updatecache[id] = true
|
||||
end
|
||||
elseif typ == "PET" then
|
||||
showgrid_pet = state
|
||||
for j=1,10 do
|
||||
table.insert(updatecache, bars[12][j])
|
||||
for slot=133,142 do
|
||||
updatecache[slot] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1126,7 +1135,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
for i=1,12 do
|
||||
local id = i + (bar-1)*12
|
||||
bars[1][i].id = id
|
||||
table.insert(updatecache, bars[1][i])
|
||||
updatecache[i] = true
|
||||
end
|
||||
end)
|
||||
|
||||
@@ -1177,7 +1186,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
local action = SecureButton_GetModifiedAttribute(self, "action", SecureStateChild_GetEffectiveButton(self)) or 0
|
||||
if self.id ~= action then
|
||||
self.id = action
|
||||
table.insert(updatecache, self)
|
||||
updatecache[self.slot] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1265,7 +1274,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
if reagent_slots[slot] and not texture then
|
||||
reagent_textureslots[slot] = nil
|
||||
reagent_slots[slot] = nil
|
||||
RefreshSlot(slot)
|
||||
updatecache[slot] = true
|
||||
end
|
||||
|
||||
-- search for reagents on buttons with different icon
|
||||
@@ -1277,7 +1286,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
if reagents then
|
||||
reagent_slots[slot] = reagents
|
||||
reagent_counts[reagents] = reagent_counts[reagents] or 0
|
||||
RefreshSlot(slot)
|
||||
updatecache[slot] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1294,7 +1303,7 @@ pfUI:RegisterModule("actionbar", "vanilla:tbc", function ()
|
||||
reagent_counts[item] = GetItemCount(item)
|
||||
end
|
||||
for slot in pairs(reagent_slots) do
|
||||
RefreshSlot(slot)
|
||||
updatecache[slot] = true
|
||||
end
|
||||
|
||||
this.event = nil
|
||||
|
||||
Reference in New Issue
Block a user