unitframes: buffer events and run them on update

Often events are sent more often than an actual frame is drawn.
This commit buffers those events to the next draw call, to avoid
useless updates for things that would never be drawn at all.
This commit is contained in:
shagu
2021-12-13 01:33:35 +01:00
parent 90dc763411
commit 88af6b7e52
+45 -17
View File
@@ -809,7 +809,7 @@ function pfUI.uf.OnEvent()
event == "RAID_ROSTER_UPDATE" or event == "RAID_ROSTER_UPDATE" or
event == "PLAYER_UPDATE_RESTING" event == "PLAYER_UPDATE_RESTING"
then then
pfUI.uf:RefreshIndicators(this) this.update_indicators = true
end end
-- abort on broken unitframes (e.g focus) -- abort on broken unitframes (e.g focus)
@@ -817,35 +817,35 @@ function pfUI.uf.OnEvent()
-- update regular frames -- update regular frames
if event == "PLAYER_ENTERING_WORLD" then if event == "PLAYER_ENTERING_WORLD" then
this.fullupdate = true this.update_full = true
elseif this.label == "target" and event == "PLAYER_TARGET_CHANGED" and not pfScanActive == true then elseif this.label == "target" and event == "PLAYER_TARGET_CHANGED" and not pfScanActive == true then
this.fullupdate = true this.update_full = true
elseif ( this.label == "raid" or this.label == "party" or this.label == "player" ) and event == "PARTY_MEMBERS_CHANGED" then elseif ( this.label == "raid" or this.label == "party" or this.label == "player" ) and event == "PARTY_MEMBERS_CHANGED" then
this.fullupdate = true this.update_full = true
elseif ( this.label == "raid" or this.label == "party" ) and event == "PARTY_MEMBER_ENABLE" then elseif ( this.label == "raid" or this.label == "party" ) and event == "PARTY_MEMBER_ENABLE" then
this.fullupdate = true this.update_full = true
elseif ( this.label == "raid" or this.label == "party" ) and event == "PARTY_MEMBER_DISABLE" then elseif ( this.label == "raid" or this.label == "party" ) and event == "PARTY_MEMBER_DISABLE" then
this.fullupdate = true this.update_full = true
elseif ( this.label == "raid" or this.label == "party" ) and event == "RAID_ROSTER_UPDATE" then elseif ( this.label == "raid" or this.label == "party" ) and event == "RAID_ROSTER_UPDATE" then
this.fullupdate = true this.update_full = true
elseif this.label == "pet" and event == "UNIT_PET" then elseif this.label == "pet" and event == "UNIT_PET" then
this.fullupdate = true this.update_full = true
elseif this.label == "player" and (event == "PLAYER_AURAS_CHANGED" or event == "UNIT_INVENTORY_CHANGED") then elseif this.label == "player" and (event == "PLAYER_AURAS_CHANGED" or event == "UNIT_INVENTORY_CHANGED") then
pfUI.uf:RefreshUnit(this, "aura") this.update_aura = true
elseif this.label == "pet" and event == "UNIT_HAPPINESS" then elseif this.label == "pet" and event == "UNIT_HAPPINESS" then
pfUI.uf:RefreshUnit(this) this.update_full = true
-- UNIT_XXX Events -- UNIT_XXX Events
elseif arg1 and arg1 == this.label .. this.id then elseif arg1 and arg1 == this.label .. this.id then
if event == "UNIT_PORTRAIT_UPDATE" or event == "UNIT_MODEL_CHANGED" then if event == "UNIT_PORTRAIT_UPDATE" or event == "UNIT_MODEL_CHANGED" then
pfUI.uf:RefreshUnit(this, "portrait") this.update_portrait = true
elseif event == "UNIT_AURA" then elseif event == "UNIT_AURA" then
pfUI.uf:RefreshUnit(this, "aura") this.update_aura = true
elseif event == "UNIT_FACTION" then elseif event == "UNIT_FACTION" then
pfUI.uf:RefreshUnit(this, "pvp") this.update_pvp = true
elseif event == "UNIT_COMBAT" then elseif event == "UNIT_COMBAT" then
CombatFeedback_OnCombatEvent(arg2, arg3, arg4, arg5) CombatFeedback_OnCombatEvent(arg2, arg3, arg4, arg5)
else else
pfUI.uf:RefreshUnit(this) this.update_full = true
end end
end end
end end
@@ -854,10 +854,38 @@ function pfUI.uf.OnUpdate()
-- update combat feedback -- update combat feedback
if this.feedbackText then CombatFeedback_OnUpdate(arg1) end if this.feedbackText then CombatFeedback_OnUpdate(arg1) end
-- process all queued unit full updates -- process indicator update events
if this.fullupdate then if this.update_indicators then
pfUI.uf:RefreshIndicators(this)
this.update_indicators = nil
end
-- process all queued unit events
if this.update_full then
-- process full updates
pfUI.uf:RefreshUnit(this, "all") pfUI.uf:RefreshUnit(this, "all")
this.fullupdate = nil
-- clear update caches
this.update_full = nil
this.update_aura = nil
this.update_portrait = nil
this.update_pvp = nil
else
-- process individual events
if this.update_aura then
pfUI.uf:RefreshUnit(this, "aura")
this.update_aura = nil
end
if this.update_portrait then
pfUI.uf:RefreshUnit(this, "portrait")
this.update_portrait = nil
end
if this.update_pvp then
pfUI.uf:RefreshUnit(this, "pvp")
this.update_pvp = nil
end
end end
-- handle pseudo focus frames -- handle pseudo focus frames