fix: performance issue

This commit is contained in:
Salikh Gurgenidze
2026-01-24 05:28:37 +04:00
parent fb63a958fb
commit cafc0f3f92
2 changed files with 80 additions and 6 deletions
+75 -5
View File
@@ -184,6 +184,62 @@ function BankFrame:UpdateSingleSlot(bagID, slotID)
return true
end
-- Update changed slots in a bank bag by comparing with cached data
-- Returns number of slots updated, or -1 if full redraw is needed
function BankFrame:UpdateChangedSlots(bagID)
if not Guda_BankFrame:IsShown() then return -1 end
if currentViewChar then return -1 end
local bankBagParent = bankBagParents[bagID]
if not bankBagParent or not bankBagParent.itemButtons then return -1 end
local numSlots = addon.Modules.Utils:GetBagSlotCount(bagID)
if not numSlots or numSlots == 0 then return -1 end
local updatedCount = 0
for slotID = 1, numSlots do
-- Find button for this slot
local targetButton = nil
for button in pairs(bankBagParent.itemButtons) do
if button.bagID == bagID and button.slotID == slotID then
targetButton = button
break
end
end
if not targetButton then
-- Button not found, need full redraw
return -1
end
-- Compare current item with button's cached data
local currentLink = GetContainerItemLink(bagID, slotID)
local cachedLink = targetButton.itemData and targetButton.itemData.link or nil
-- Check if slot changed (different item or count)
local needsUpdate = false
if currentLink ~= cachedLink then
needsUpdate = true
elseif currentLink then
local _, currentCount = GetContainerItemInfo(bagID, slotID)
local cachedCount = targetButton.itemData and targetButton.itemData.count or 0
if currentCount ~= cachedCount then
needsUpdate = true
end
end
if needsUpdate then
if self:UpdateSingleSlot(bagID, slotID) then
updatedCount = updatedCount + 1
else
return -1 -- Update failed, need full redraw
end
end
end
return updatedCount
end
-- Deferred update state for frame budgeting
local bankPendingUpdate = false
local bankUpdateDebounceFrame = nil
@@ -245,6 +301,7 @@ function BankFrame:Update()
-- If no items displayed yet, continue with full update
end
-- Mark all existing buttons as not in use (we'll mark active ones during display)
-- Mark all existing buttons as not in use (we'll mark active ones during display)
for _, bankBagParent in pairs(bankBagParents) do
if bankBagParent and bankBagParent.itemButtons then
@@ -1705,11 +1762,24 @@ function BankFrame:Initialize()
elseif event == "BAG_UPDATE" and arg1 then
-- Check if this is a bank bag (5-10)
if arg1 >= 5 and arg1 <= 10 then
-- Invalidate the specific bank bag
addon.Modules.BankScanner:InvalidateBag(arg1)
-- Clear ItemDetection cache to ensure fresh detection after item swap
if addon.Modules.ItemDetection then
addon.Modules.ItemDetection:ClearCache()
-- Try incremental update if not sorting
if not isSorting then
addon.Modules.BankScanner:InvalidateBag(arg1)
if addon.Modules.ItemDetection then
addon.Modules.ItemDetection:ClearCache()
end
-- Try to update only changed slots
local result = BankFrame:UpdateChangedSlots(arg1)
if result >= 0 then
return -- Success, no full redraw needed
end
-- Fall through to full redraw
else
-- Sorting in progress - invalidate for full redraw
addon.Modules.BankScanner:InvalidateBag(arg1)
if addon.Modules.ItemDetection then
addon.Modules.ItemDetection:ClearCache()
end
end
else
-- Not a bank bag, ignore for bank frame
+5 -1
View File
@@ -251,10 +251,14 @@ end
-- Create or get a button from the pool
function Guda_GetItemButton(parent)
-- Try to reuse existing button
-- Try to reuse existing button from same parent
for _, button in pairs(buttonPool) do
-- Skip bag slot buttons
if not button.isBagSlot and not button:IsShown() and button:GetParent() == parent then
-- Re-register with parent (itemButtons hash may have been cleared)
if Guda_RegisterItemButton then
Guda_RegisterItemButton(parent, button)
end
return button
end
end