У меня есть функция, которая срабатывает каждые 0.05 секунд. Она даёт или обновляет ауру ближайшим наземным миньонам. Для этого она проходит через их массив, где будет не более ~60 занятых ячеек.
Код функции
caster - источник ауры, p - игрок, к которому был послан caster, range_image - индикатор радиуса ауры, p.minions - массив миньонов, m.minion - ссылка на юнита, который связан со структурой Minion, abildata.range - радиус ауры, call BuffAirSupport.start - старт или обновление баффа ауры.
method cooldownEnd takes nothing returns nothing
    local integer a = 0
    local Minion m = caster
    local CustomPlayer p = m.foe
    call SetImagePosition(range_image, GetUnitX(m.minion), GetUnitY(m.minion), 0.)
    loop
        set m = p.minions[a]
        if IsUnitType(m.minion, UNIT_TYPE_GROUND) and GetDistanceUnits(caster.minion, m.minion) <= abildata.range then
            call BuffAirSupport.start(m, data, caster.owner, armor)
        endif
        set a = a + 1
        exitwhen a > p.minions.top
    endloop
endmethod
Я подумал, что можно это сделать с помощью группы.
Версия через группу
static method filter takes nothing returns boolean
    local Minion m = GetUnitUserData(GetFilterUnit())
    if IsUnitType(GetFilterUnit(), MinionClass) and IsUnitType(m.minion, UNIT_TYPE_GROUND) and m.out_of_spawn then
        call BuffAirSupport.start(m, Data, Owner, Armor)
    endif
    return false
endmethod

static constant group Group = CreateGroup()
static integer Data
static integer Owner
static integer Armor 

method cooldownEndNew takes nothing returns nothing
    local integer a = 0
    local Minion m = caster
    call SetImagePosition(range_image, GetUnitX(m.minion), GetUnitY(m.minion), 0.)
    set Data = data
    set Owner = m.owner
    set Armor = armor
    call GroupEnumUnitsInRange(Group, GetUnitX(m.minion), GetUnitY(m.minion), abildata.range, function thistype.filter)
endmethod
Какая из версий быстрее?

Принятый ответ

любой штатный способ быстрее любого велосипеда. группа будет быстрее перебора массива юнитов. переменная лучше, чем постоянные GetFilterUnit()
если дашь мне код в чистом жассе, я могу прямо в лайве замеры сделать
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
6 лет назад
Отредактирован PT153
0
Пара доп. вопросов
	Быстрее cooldownEndNew или cooldownEndNewX?
	
    method cooldownEndNew takes nothing returns nothing
        local integer a = 0
        local Minion m = caster
        call SetImagePosition(range_image, GetUnitX(m.minion), GetUnitY(m.minion), 0.)
        set Data = data
        set Owner = m.owner
        set Armor = armor
        call GroupEnumUnitsInRange(Group, GetUnitX(m.minion), GetUnitY(m.minion), abildata.range, function thistype.filter)
    endmethod

    method cooldownEndNewX takes nothing returns nothing
        local integer a = 0
        local Minion m = caster
        local real x = GetUnitX(m.minion)
        local real y = GetUnitY(m.minion)
        call SetImagePosition(range_image, x, y, 0.)
        set Data = data
        set Owner = m.owner
        set Armor = armor
        call GroupEnumUnitsInRange(Group, x, y, abildata.range, function thistype.filter)
    endmethod

    Быстрее filter или filterX?

    static method filter takes nothing returns boolean
        local Minion m = GetUnitUserData(GetFilterUnit())
        if IsUnitType(GetFilterUnit(), MinionClass) and IsUnitType(m.minion, UNIT_TYPE_GROUND) and m.out_of_spawn then
            call BuffAirSupport.start(m, Data, Owner, Armor)
        endif
        return false
    endmethod

    static method filterX takes nothing returns boolean
        local Minion m = GetUnitUserData(GetFilterUnit())
        if IsUnitType(GetFilterUnit(), MinionClass) and IsUnitType(GetFilterUnit(), UNIT_TYPE_GROUND) and m.out_of_spawn then
            call BuffAirSupport.start(m, Data, Owner, Armor)
        endif
        return false
    endmethod
0
27
6 лет назад
0
каждые 0.05 секунд? мб каждые 2 секунды?
0
28
6 лет назад
Отредактирован PT153
0
Steal nerves:
каждые 0.05 секунд? мб каждые 2 секунды?
Я всё верно написал. Каждые 5 сотых секунды.
Точнее этот метод вызывается функцией, который связан с таймером с периодом в 0,05 с.
0
23
6 лет назад
0
PT153, у таймер же идет микросекунд так что думай.
4
28
6 лет назад
Отредактирован PT153
4
pro100master:
PT153, у таймер же идет микросекунд так что думай.
Ну и? Вот поэтому я спрашиваю, какая из реализаций будет для такого таймера лучше.
И вообще-то не микросекунд, а 50 миллисекунд.
2
23
6 лет назад
2
PT153, 1 сек равно 1000 милисекунд если что в дробь поймеш
6
16
6 лет назад
6
любой штатный способ быстрее любого велосипеда. группа будет быстрее перебора массива юнитов. переменная лучше, чем постоянные GetFilterUnit()
если дашь мне код в чистом жассе, я могу прямо в лайве замеры сделать
Принятый ответ
2
28
6 лет назад
2
pro100master, я знаю что 1 с = 1000 мс, и именно по этому у моего таймера период в 50 мс, но я вообще не понимаю, как это относится к моему вопросу. Вопрос о том, какая реализация быстрее.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.