Выявление утечек в коде.
Привет всем, помогите пожалуйста найти утечки в коде спавна двух типов мобов у 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 есть утечка, но это нативно, она минимальная и это никак не исправляется.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
10
6 лет назад
0
VVelikolepniy:
RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
Да. Но лучше запиши эти данные в глобальную переменную, это, вроде, оптимальнее, чем создавать каждый раз лок. переменные.
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
Отчисти группу после использования call GroupClear(group). Возможно это поможет.
0
8
6 лет назад
0
LordDracula:
VVelikolepniy:
RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
Да. Но лучше запиши эти данные в глобальную переменную, это, вроде, оптимальнее, чем создавать каждый раз лок. переменные.
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
Отчисти группу после использования call GroupClear(group). Возможно это поможет.
Кстати по такой же логике можно создать отряды по инициализации карты в глобальные переменные и вызывать в триггере их каждый раз)
0
29
6 лет назад
0
VVelikolepniy:
Кстати по такой же логике можно создать отряды по инициализации карты в глобальные переменные и вызывать в триггере их каждый раз)
Можно. Но зачем?
0
8
6 лет назад
Отредактирован VVelikolepniy
0
ClotPh:
точки утекают все по-моему
группы надо не только разрушать но и обнулять
и после беглого просмотра не полная уверенность что в группы вообще везде правильно юниты добавляются
ты возьми систему в которой знаешь что утечек нет и адаптируй под себя
уж найти такую систему должен мочь
Да, найти систему без утечек я должен мочь.. но не могу(
0
21
6 лет назад
0
У тебя создаются точки
как без точек - тебе Maniac_91 написал
1
37
6 лет назад
1
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++;
	// тут делай создание юнита и прочие действия
}
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.