вызов триггера тоже не бесплатная операция, надо сравнивать, но на промежутке в десять вариантов разница пренебрежимо мала. Вот когда ветвления вырастут до 500-1000, тогда есть смысл замерять и бороться за микросекунды
не играй на версиях, подверженных заражению, на неизвестных тебе картах, которых нет у тебя на пк.
То же самое, как с любой вирусней - пока не запустил, оно не укусит.
TriggerAddAction создает объект, который никогда не разрушается. ПОэтому юзай все действия в TriggerAddCondition() и будет тебе счастье, он хотя бы не создает объект функции заново, если она была вызвана когда-то.
function UnitSetKiller takes unit u, unit killer returns nothing
local integer au=ConvertHandle(u)
local integer ak=ConvertHandle(killer)
local integer miniRefA
local integer miniRefB
if au!=0 and ak!=0 then
set miniRefA=RMem(ak+0xC)
set miniRefB=RMem(ak+0x10)
if miniRefA!=-1 and miniRefB!=-1 then
call WMem(au+0x250,miniRefA)
call WMem(au+0x254,miniRefB)
endif
endif
endfunction
"быстрее"
"чем быстрее?"
"чем глобалки"
варик не имеет разделения на глобалки и локалки, адрес ищется по хешу имени переменной, и ему похер, где она была объявлена. это вкратце, если вы хотите докопаться, то приводите ассемблер плез, иначе это просто не имеет смысла
любая переменная в jass весит больше 4 байт, т.к. на ней "обвес" - это полноценный объект со своими свойствами и методами. Integer хранит как минимум 5 полей данных, я просто не знаю, дальше мусор или тоже что-то рабочее идет.
чтобы чекнуть твою булэкспр игре нужно все равно создать поток на каждого подходящего юнита, а связный список всё равно чуть проще модерируется на разумных масштабах (до ~1000 юнитов)
игра собирает список юнитов, подходящих под условие дистанции/ректа (не знаю как конкретно, но вроде не просто перебором), и затем все подходящие пролезают в фильтр, если фильтр вернул единичку - юнита садят в группу.
а нет, через каждого юнита проходит и тех, кто в подходящих координатах, отправляет дальше
function SpeedRun takes nothing returns nothing
local group g=GetAvailableGroup()
local unit u2
local player p
call GroupEnumUnitsInRange(g,0,0,10000,null)
call echo("unit count="+I2S(CountUnitsInGroupNative(g)))
call fStartTimer()
loop
set u2=FirstOfGroup(g)
exitwhen u2==null
call GroupRemoveUnit(g,u2)
call DoNothing()
endloop
call BJDebugMsg("Variant 1: "+I2S(fStopTimer()))
call ExecuteFunc("SpeedRunX")
endfunction
function SpeedRunX takes nothing returns nothing
local group g=GetAvailableGroup()
local unit u2
local player p
call GroupEnumUnitsInRange(g,0,0,10000,null)
call echo("unit count="+I2S(CountUnitsInGroupNative(g)))
call fStartTimer()
call ForGroup(g,function DoNothing)
call BJDebugMsg("Variant 2: "+I2S(fStopTimer()))
endfunction
function SpeedRun2 takes nothing returns nothing
local integer i=0
loop
call ExecuteFunc("SpeedRun")
set i=i+1
exitwhen i>=10
endloop
endfunction
FirstOfGroup берет-то первый элемент, но тебе его удалять, а после этого итерация всех элементов, чтобы упорядочить их
ну не веришь - не верь, делов-то. перегрев на создании отдельных потоков идет, очевидно, что это тяжелее, чем продолжение работы в том же потоке, как цикл делает
группы как раз в доте небольшие, поэтому цикл выгоднее в 99.9% случаев.
ForGroup заметно медленнее цикла на небольших группах, а на больших постоянные перестановки крупной группы мешают ускоряться. да и цикл не сохраняет группу, если она нужна в дальнейшем.
я понял, о чем ты, я говорю, что жасс не подгадаешь - в кишках простейших действий тысячи прыжков и обращений к самым разным областям памяти, т.к. байт-код исполняется еще и в "виртуалке". нет смысла играть в компилятор, достаточно делать те оптимизации, которые не противоречат общей логике.
бранчера в виртуалке жасса нет, а количество внутренних проверок рабочих объектов на каждом этапе так велико, что надеяться на "прогрев" нативок бессмысленно. Если используется больше одного раза - вбивай в локалку, если один раз - оставляй вызовом функции.
» WarCraft 3 / Как реализовать свитч 10 разных действий? Что быстрее
» WarCraft 3 / Что быстрее очистка массива или ключа хеш таблицы?
» WarCraft 3 / Способность Оракула из доты
» WarCraft 3 / Опасен ли мемхак?
То же самое, как с любой вирусней - пока не запустил, оно не укусит.
» WarCraft 3 / Посоветуйте что прочесть про динамическое создание триггеров
Отредактирован DracoL1ch
» WarCraft 3 / Количество Рабов на шахте
if(IsUnitHidden(peon){
mine=GetClosestMine(GetUnitx(peon),GetUnitY(peon))
}
}
логика такая должна быть
» WarCraft 3 / KillUnit
» WarCraft 3 / Неуязвимость или божественный щит сбивают эффекты(рев, жажду)
» WarCraft 3 / Странно обозначение hex
0x000001 == $000001
» WarCraft 3 / YDWE - Китайский редактор карт
"чем быстрее?"
"чем глобалки"
варик не имеет разделения на глобалки и локалки, адрес ищется по хешу имени переменной, и ему похер, где она была объявлена. это вкратце, если вы хотите докопаться, то приводите ассемблер плез, иначе это просто не имеет смысла
» WarCraft 3 / Неизвестная причина критов.
» WarCraft 3 / Неизвестная причина критов.
сам можешь повторить баг, поставь текстуры на минимум
» WarCraft 3 / syntax errors jass helper - немогу сохранить карту.
» WarCraft 3 / Cоздать юнит дамми (эффект) с переменным или без?
Отредактирован DracoL1ch
» WarCraft 3 / Что быстрее ForGroup() или Loop?
» WarCraft 3 / Что быстрее ForGroup() или Loop?
Отредактирован DracoL1ch
» WarCraft 3 / Что быстрее ForGroup() или Loop?
ну не веришь - не верь, делов-то. перегрев на создании отдельных потоков идет, очевидно, что это тяжелее, чем продолжение работы в том же потоке, как цикл делает
группы как раз в доте небольшие, поэтому цикл выгоднее в 99.9% случаев.
» WarCraft 3 / Что быстрее ForGroup() или Loop?
Отредактирован DracoL1ch
» WarCraft 3 / Что меньше влияет на память?
Отредактирован DracoL1ch
» WarCraft 3 / Что меньше влияет на память?
» WarCraft 3 / Начала внезапно вылетать карта. (редактор 1.26а)
» WarCraft 3 / Начала внезапно вылетать карта. (редактор 1.26а)
» WarCraft 3 / Вопросы по мемхаку
» WarCraft 3 / Вопросы по мемхаку