Решил тут код оптимизировать, заменив перебор группы формированием фильтра. Столкнулся с несколькими трудностями.
Есть такой участок кода:
    private nothing uiClear(){
        unit u = GetEnumUnit()
        integer id = GetUnitUserData(u)
        if GetUnitTypeId(u) == 0 {
            GroupRemoveUnit(allUnits, u)
            FlushChildHashtable(HT, id)
            if dbg {dbgT("clr " + I2S(id))}
        }
        u = null
    }
    
    private nothing uiClearStart(){
        ForGroup(allUnits, function uiClear)
    }
Нужно как-то сформировать группу уже с имеющийся группой allUnits, но такой нативки я не нашёл. Можно сделать перебором, но тогда какое отличие от исходного варианта.

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

NazarPunk, ну, чтобы рассеивание заклинаний действительно рассеивали их.
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
code
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId

    private nothing bfActions (){ 
        unit u = GetEnumUnit()
        integer id = GetUnitUserData(u)
        integer bon = LoadInteger(HT, id, BlessingOfNeptulon_hid)
        integer bi
        
        //Благословение Нептулона (рассеивание/окончание)
        if (bon > 0) and (GetUnitAbilityLevel(u, 'NSe1') <= 0) and (GetUnitAbilityLevel(u, 'NSe2') <= 0) and (GetUnitAbilityLevel(u, 'NSe3') <= 0){
            bonStateDel(u, bon)
        }
        
        //Благословение Нептулона (похищение магии)
        if (bon <= 0) and ((GetUnitAbilityLevel(u, 'NSe1') > 0) or (GetUnitAbilityLevel(u, 'NSe2') > 0) or (GetUnitAbilityLevel(u, 'NSe3') > 0)) {
            if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
            if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
            if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
            bonStateAdd(u, bi)
        }
            
        u = null
    }
    
    private nothing brActionsStart(){
        ForGroup(allUnits, function bfActions)
    }
    
    private nothing brInit (){
        TimerStart(CreateTimer(), 0.25, true, function brActionsStart)
    }

endlibrary
    
UPD:
Изменил с помощью фильтров. Получилось так:
code2
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId
    
    
    //Фильтры
    private boolean fBoN_end (){
        return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) > 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') <= 0)
    }
    
    private boolean fBoN_abd (){
        return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) <= 0) and ((GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') > 0))
    }
    //Фильтры


    //Функции
    private nothing BoN_end (){ 
        bonStateDel(GetEnumUnit(), LoadInteger(HT, GetUnitUserData(GetEnumUnit()), BlessingOfNeptulon_hid))
    }
    
    private nothing BoN_abd (){ 
        integer bi
        unit u = GetEnumUnit()
        if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
        if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
        if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
        bonStateAdd(u, bi)
        u = null
    }
    //Функции
    
    
    private nothing brActions(){
        group g = CreateGroup()
        
        //Благославление Нептулона (рассеивание/окончание)
        GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_end)
        ForGroup(g, function BoN_end)
        GroupClear(g)
        
        //Благославление Нептулона (похищение магии)
        GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_abd)
        ForGroup(g, function BoN_abd)
        GroupClear(g)
        
        DestroyGroup(g)
        g = null
    }
    
    private nothing brInit (){
        TimerStart(CreateTimer(), 0.25, true, function brActions)
    }

endlibrary
Так норм или можно еще оптимизировать?
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
29
5 лет назад
0
то есть нет смысла оптимизировать это через фильтры?
Нужно оптимизировать бутылочные горлышка, а если код работает нормально, то лучше не трогать.
0
19
5 лет назад
0
Ну, я каждые 0.25 сек перебираю группу, в которой 60-300 юнитов. Не будет ли из-за этого фпс проседать?
0
16
5 лет назад
0
Будет, особенно через for group
0
29
5 лет назад
0
Ну, я каждые 0.25 сек перебираю группу, в которой 60-300 юнитов.
А зачем?
0
19
5 лет назад
Отредактирован KaneThaumaturge
0
NazarPunk, ну, чтобы рассеивание заклинаний действительно рассеивали их.
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
code
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId

    private nothing bfActions (){ 
        unit u = GetEnumUnit()
        integer id = GetUnitUserData(u)
        integer bon = LoadInteger(HT, id, BlessingOfNeptulon_hid)
        integer bi
        
        //Благословение Нептулона (рассеивание/окончание)
        if (bon > 0) and (GetUnitAbilityLevel(u, 'NSe1') <= 0) and (GetUnitAbilityLevel(u, 'NSe2') <= 0) and (GetUnitAbilityLevel(u, 'NSe3') <= 0){
            bonStateDel(u, bon)
        }
        
        //Благословение Нептулона (похищение магии)
        if (bon <= 0) and ((GetUnitAbilityLevel(u, 'NSe1') > 0) or (GetUnitAbilityLevel(u, 'NSe2') > 0) or (GetUnitAbilityLevel(u, 'NSe3') > 0)) {
            if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
            if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
            if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
            bonStateAdd(u, bi)
        }
            
        u = null
    }
    
    private nothing brActionsStart(){
        ForGroup(allUnits, function bfActions)
    }
    
    private nothing brInit (){
        TimerStart(CreateTimer(), 0.25, true, function brActionsStart)
    }

endlibrary
    
UPD:
Изменил с помощью фильтров. Получилось так:
code2
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId
    
    
    //Фильтры
    private boolean fBoN_end (){
        return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) > 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') <= 0)
    }
    
    private boolean fBoN_abd (){
        return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) <= 0) and ((GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') > 0))
    }
    //Фильтры


    //Функции
    private nothing BoN_end (){ 
        bonStateDel(GetEnumUnit(), LoadInteger(HT, GetUnitUserData(GetEnumUnit()), BlessingOfNeptulon_hid))
    }
    
    private nothing BoN_abd (){ 
        integer bi
        unit u = GetEnumUnit()
        if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
        if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
        if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
        bonStateAdd(u, bi)
        u = null
    }
    //Функции
    
    
    private nothing brActions(){
        group g = CreateGroup()
        
        //Благославление Нептулона (рассеивание/окончание)
        GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_end)
        ForGroup(g, function BoN_end)
        GroupClear(g)
        
        //Благославление Нептулона (похищение магии)
        GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_abd)
        ForGroup(g, function BoN_abd)
        GroupClear(g)
        
        DestroyGroup(g)
        g = null
    }
    
    private nothing brInit (){
        TimerStart(CreateTimer(), 0.25, true, function brActions)
    }

endlibrary
Так норм или можно еще оптимизировать?
Принятый ответ
1
16
5 лет назад
1
конечно, можно. исходя уже из предположений.
например, тут
if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
во-первых, если они взаимоисключающие, то нужно единую ветку с if-else , а не 3 ифа
если даже нет, расположи их в порядке от максимальной вероястноти к минимальной. Если в игре пассивка набирает 3й уровень через 5 минут после начала, то и нет смысла начинать с первого и второго, т.к. в 95% случаев будет именно 3й уровень.
0
19
5 лет назад
0
DracoL1ch, это сражение, думаю 3 лвл будет там не скоро. Ну, просто мне говорили, что не надо все тыкать в елсе, а то оно работать не будет, хотя я такого не замечал. Ну да, тут можно вложить, только эффекта большого не будет. Это функция будет вызываться раз 10-50 за всю игр.
Ну, я так понял мой вариант верный, тогда я им закрою вопрос.
UPD:
Хотя я не совсем понимаю, все равно перебор, только при формировании группы.
2
24
5 лет назад
2
Если что, в 1.31 завезли нативку BlzGroupAddGroupFast, вдруг поможет.
0
28
5 лет назад
0
Такой нативки и нет, только добавлением через перебор.
Как нет, если есть.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.