а то с моей машинкой мне порой на бг тяжко biggrin
Вид для печати
Немного много текста вышло , такой метод наиболее производительный будет.
OnUpdate идет только проверка num ~= lastChildren , т.е 1 if , 1 фрейму обрабатывает только 1 раз, после того как плейта обработана обновление текста будет только при появлении плейты на экране и обновлении значения статус бара (при получении обьектом урона).
PHP код:
local __plates, __hooks = {}, {["OnShow"] = {}, ["OnValueChanged"] = {}}
local Update
do
local select, f = select, format
Update = function(obj)
if obj.__text and obj.__owner:IsShown() then obj.__text:Update() end
if obj.__text then return end
local __text = obj:CreateFontString()
__text:SetFont("Fonts\\ARIALN.TTF", 10, "OUTLINEMONOCHROME")
__text:SetPoint("CENTER", obj)
__text.__owner = obj
function __text:Update()
local __owner = self.__owner
local min, max = __owner:GetValue(), select(2, __owner:GetMinMaxValues())
self:SetFormattedText("%s - %d%s",(min>999999 and f("%.1fm", min/1e6)) or (min>999 and f("%.1fk", min/1e3)) or f("%d", min), min/max*100, "%")
end
obj.__text = __text
end
end
local SetHooks
do
local pairs = pairs
local frame
SetHooks = function(obj)
frame = obj:GetChildren() or false
frame.__owner = obj
for hook, table in pairs(__hooks) do
if frame and frame:HasScript(hook) and not __hooks[hook][frame] then
frame:HookScript(hook, Update)
Update(frame)
__hooks[hook][frame] = true
end
end
end
end
local IsNamePlate
do
local Overlay = [=[Interface\Tooltips\Nameplate-Border]=]
IsNamePlate = function(obj)
local Name = obj:GetName()
local _, OverlayRegion = obj:GetRegions()
if(Name)then return end
return OverlayRegion and OverlayRegion:GetObjectType() == "Texture" and OverlayRegion:GetTexture() == Overlay
end
end
local FindPlates
do
local select, rawget, rawset, lastChildren = select, rawget, rawset, 0
FindPlates = function(self)
local num = self:GetNumChildren()
if num ~= lastChildren then
for i = 1, num do
local obj = select(i, self:GetChildren())
if IsNamePlate(obj) and not rawget(__plates, obj) then
SetHooks(obj)
rawset(__plates, obj, true)
end
end
lastChildren = num
end
end
end
WorldFrame:HookScript("OnUpdate", FindPlates)
Ппц у вас столько не нужных аддонов, которые попосту мешают.
OnUpdate при каждом обновлении кадра берет GetMinMaxValues , GetValue , string.format и записывает это в строчку , мой же вариант делает то же самое , только при появлении плейты на экране 1 раз и только при изменении значения статус бара. По поводу OnUpdate , нужно всеми возможными способами избегать его , особенно где много обьектов.
Да я понимаю что OnUpdate нужно избегать, просто я к чему, что если верить аддонам потипу InterfaceUsage и тд, то когда плейтов мало то грузит проц меньше чем твой вариант, но када много то беда, если тока к примеру заходить арену то можно не заморачиваться))
Этот аддон какую то билеберду пишет) Как может пустой аддон что то кушать кроме памяти? Верно - нет вызовов нет и нагрузки на проц. Хз как ты тестил хуки с онупдейтом. В любом случаи хук будет стоять и ничего не делать , а онупдейт будет 60 раз в секунду менять текущее значение.
Ну я просто сравнил результат в этом аддоне на фане при малом количестве плейтов(тут результат получился у онапдейта лучше) и в самой толпе с вендорами (ну тут результат очевидный), мб я несовсем правильно понимаю как он считает но тем не менее, чем ниже циферка в CPU Time тем лучше)). вроде коректно считает смотря на результаты и других аддонов что висели. зы Enable Script Profiling не забыть галочку поставить)
Ну да все верно. Тебе нужно время, затраченное процессором на обработку задачи . Вопрос только в том , в какой величине он это измеряет? Это секунды , тики или же он отображает загрузку процессора?
- - - Updated - - -
Как и думал , все расчеты опираясь на фпс , чем выше фпс тем выше показывает нагрузку , даже у пустого обработчика хД По идее при высокой нагрузке и малом фпс выдаст малую нагрузку.