Выявление утечек в коде.
Привет всем, помогите пожалуйста найти утечки в коде спавна двух типов мобов у 4х фракций. Все по гайдам, но начинает лагать со временем. Заранее спасибо.
function Trig_CreepsCenter1_Actions takes nothing returns nothing
local group deter1
local group insp1
local group absorb1
local group destr1
call CreateNUnitsAtLoc( 5, 'o000', Player(0), Location(0.00, 5300.00), 0.00 )
set deter1 = GetLastCreatedGroup()
call CreateNUnitsAtLoc( 2, 'o001', Player(0), Location(0.00, 5300.00), 0.00 )
call GroupAddGroup( GetLastCreatedGroup(), deter1 )
call GroupPointOrderLocBJ( deter1, "attack", Location(0.00, -5300.00) )
call DestroyGroup (deter1)
call CreateNUnitsAtLoc( 5, 'h000', Player(1), Location(-5300.00, 0.00), 0.00 )
set insp1 = GetLastCreatedGroup()
call CreateNUnitsAtLoc( 2, 'h001', Player(1), Location(-5300.00, 0.00), 0.00 )
call GroupAddGroup( GetLastCreatedGroup(), insp1 )
call GroupPointOrderLocBJ( insp1, "attack", Location(5300.00, 0.00) )
call DestroyGroup (insp1)
call CreateNUnitsAtLoc( 5, 'n000', Player(3), Location(0.00, -5300.00), 0.00 )
set absorb1 = GetLastCreatedGroup()
call CreateNUnitsAtLoc( 2, 'n001', Player(3), Location(0.00, -5300.00), 0.00 )
call GroupAddGroup( GetLastCreatedGroup(), absorb1 )
call GroupPointOrderLocBJ( absorb1, "attack", Location(0.00, 5300.00) )
call DestroyGroup (absorb1)
call CreateNUnitsAtLoc( 5, 'u000', Player(6), Location(5300.00, 0.00), 0.00 )
set destr1 = GetLastCreatedGroup()
call CreateNUnitsAtLoc( 2, 'u001', Player(6), Location(5300.00, 0.00), 0.00 )
call GroupAddGroup( GetLastCreatedGroup(), destr1 )
call GroupPointOrderLocBJ( destr1, "attack", Location(-5300.00, 0.00) )
call DestroyGroup (destr1)
endfunction
===========================================================================
function InitTrig_CreepsCenter1 takes nothing returns nothing
set gg_trg_CreepsCenter1 = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_CreepsCenter1, 10.00 )
call TriggerAddAction( gg_trg_CreepsCenter1, function Trig_CreepsCenter1_Actions )
endfunction

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

nvc123, внутри GetRectCenter нет утечки
// blizzard.j:1772
function GetRectCenter takes rect whichRect returns location
    return Location(GetRectCenterX(whichRect), GetRectCenterY(whichRect))
endfunction
а эвент регистрируется 1 раз, так что можно забить
// blizzard.j:7959
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
Другое дело, что у order есть утечка, но это нативно, она минимальная и это никак не исправляется.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
21
6 лет назад
1
тут же все просто например если на гуи
делаешь в карте области
и пишешь set tpoint = center of такой-то глобальной области
set g = units within XXX of tpoint удовл. нужным тебе условиям
custom script call RemoveLocation (udg_tpoint)
set tpoint - центр уже другой нужной тебе области
pick every unit in g и идти нападая на врагов в tpoint
custom script call RemoveLocation (udg_tpoint)
custom script call DestroyGroup (udg_g)
повторять столько раз сколько нужно для нужных областей и юнитов
тупо и гуишно и с точками, зато понятно и вроде без утечек
если что поправьте на гуи давно не
0
8
6 лет назад
0
ClotPh:
У тебя создаются точки
как без точек - тебе Maniac_91 написал
Но у него в способе тоже координаты есть, разве там точки не создаются?
0
10
6 лет назад
Отредактирован LordDracula
0
VVelikolepniy:
Но у него в способе тоже координаты есть, разве там точки не создаются?
Нет. Ты создаёшь точку по координатам, функцией Location(она возвращает точку). А Maniac_91 использует напрямую координаты.
Добавь себе эту функцию и используй ее
function CreateUnitsAndGivePointOrder takes player owner, integer units, integer id, real x, real y, real angle, string order, real x1, real y1 returns nothing
    local integer i = 0
	local unit u        
	loop
		set u = CreateUnit(owner,id,x,y,angle) 
		call IssuePointOrder(u,order,x1,y1) 
	    set i = i+1
	    exitwhen i >= units
	endloop
	set u = null
    return
endfunction
Вызов функции
call CreateUnitsAndGivePointOrder(Player(0),5,'h000',0,5300,0,"attack",0,-5300)
Аргументы: игрок-владелец, количество юнитов, ид юнита, координата спавна Х, координата спавна У, угол порота юнита, приказ, координата приказа Х, координата приказа У
0
21
6 лет назад
0
quq_CCCP, "меньше раз в 10"
а где тут утечки вообще?
просто если бы на гуи то мной примерно так же бы делалось
ты говоришь что утечки все-таки есть, хотя и мало - где?
3
28
6 лет назад
3
ClotPh, в карте есть незначительные утечки внутри бж функций
правда они настолько не значительны что не влияют ни на что
VVelikolepniy, функция Location создаёт точку
если точка была создана то её надо удалить
чего ты не делаешь
лучше не использовать точки а напрямую работать с координатами
а юнитов создавать циклом
так и группы удалять не придётся
и да
все локальные переменные после удаления объекта надо очищать
вот пример цикла
int i=0;
int countUnits=5; // количество юнитов
loop{
	exitwhen i == countUnits
	i++;
	// тут делай создание юнита и прочие действия
}
2
37
6 лет назад
Отредактирован ScorpioT1000
2
nvc123, внутри GetRectCenter нет утечки
// blizzard.j:1772
function GetRectCenter takes rect whichRect returns location
    return Location(GetRectCenterX(whichRect), GetRectCenterY(whichRect))
endfunction
а эвент регистрируется 1 раз, так что можно забить
// blizzard.j:7959
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
Другое дело, что у order есть утечка, но это нативно, она минимальная и это никак не исправляется.
Принятый ответ
0
28
6 лет назад
0
ScorpioT1000, причём тут рект?
я не про скрин а про карту
и я и говорю что на них можно забить
0
8
6 лет назад
0
nvc123:
ClotPh, в карте есть незначительные утечки внутри бж функций
правда они настолько не значительны что не влияют ни на что
VVelikolepniy, функция Location создаёт точку
если точка была создана то её надо удалить
чего ты не делаешь
лучше не использовать точки а напрямую работать с координатами
а юнитов создавать циклом
так и группы удалять не придётся
и да
все локальные переменные после удаления объекта надо очищать
вот пример цикла
int i=0;
int countUnits=5; // количество юнитов
loop{
	exitwhen i == countUnits
	i++;
	// тут делай создание юнита и прочие действия
}
Я просто хотел, что бы создавался именно ОТРЯД, что бы юниты шли строем, типа что бы мечники впереди, а целители сзади
0
28
6 лет назад
Отредактирован nvc123
0
VVelikolepniy, функция CreateNUnitsAtLoc не создаёт ОТРЯД
она просто циклом создаёт юнитов и добавляет их в группу
группа это просто набор юнитов
она не имеет никакого отношения к тому как идут юниты и прочему
3
27
6 лет назад
Отредактирован MpW
3
nvc123, а мне кажется группа влияет на то как они ходят. не зря же порядок ходьбы выстраивается. а так бы ходили бы линейкой

хотя проблем групп что они весь путь вряд ли будут ходить отрядами. Например, при перенаправлении там юнита посылают дальше, а не отряд. Событие "юнит входит в регион" ловит юнита. Тогда надо как-то переделывать, что ли отряды запоминать.

кстати можно потом области добавлять в один большой регион. А событие накидывать на регион. Как кто-то вступит в одну из области, то можно проверить условием, что за область (условие юнит находится в области как-то так называется). потом перенаправлять на следующую. не нужно плодить кучу триггеров и кучу регионов
Загруженные файлы
2
32
6 лет назад
2
VVelikolepniy, чувак вот слушай, без обид но ты рили не видишь проблем?
Зачем тебе несколько груп и несколько точек, ты не можешь отправить всех юнитов сразу, ты отправляешь юнитов последовательно по одному, следовательно достаточно одной точки и одной группы...
Далее если создавать юнитов в цикле, то выяснится что ненужна и группа вовсе, т.к отдать приказ придется каждому юниту после создания...
т.к юниты спаунятся всегда в отдном и том же месте и идут в одно и тоже место, зачем нам каждый раз определять координаты и создавать точки?
Можно сделать массив с координатами, типами юнитов, а так же их кол-вом и создать сразу для всех точек всех юнитов в одном цикле, правда круто?
А кода меньше в разы....
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.