Выявление утечек в коде.
Привет всем, помогите пожалуйста найти утечки в коде спавна двух типов мобов у 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 есть утечка, но это нативно, она минимальная и это никак не исправляется.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2 комментария удалено
18
Эм.. А зачем использовать ""Location(0.00, 5300.00)" ? Можно же без точек. Примерно так:
call CreateUnit (Player(0), 'o000', 0, 5300, 0)
а как тебя забанить что бы ты у меня в темах не писал?
Но тут ledoed прав, утечек действительно много. Не буду я его за это банить
8
Maniac_91:
Эм.. А зачем использовать ""Location(0.00, 5300.00)" ? Можно же без точек. Примерно так:
call CreateUnit (Player(0), 'o000', 0, 5300, 0)
а как тебя забанить что бы ты у меня в темах не писал?
Но тут ledoed прав, утечек действительно много. Не буду я его за это банить
Вот сижу разбираюсь, но с функцией CreateNUnitsAtLoc получается вызывать несколько юнитов, а с функцией CreateUnit не получается. Я что то не так делаю или цикл нужен?
Maniac_91:
Эм.. А зачем использовать ""Location(0.00, 5300.00)" ? Можно же без точек. Примерно так:
call CreateUnit (Player(0), 'o000', 0, 5300, 0)
а как тебя забанить что бы ты у меня в темах не писал?
Но тут ledoed прав, утечек действительно много. Не буду я его за это банить
И кстати CreateNUnitsAtLoc я не нашел в том мануале, что ты скинул. Нашел эту функцию из конвертации обычного триггера
Этот комментарий удален
21
точки утекают все по-моему
группы надо не только разрушать но и обнулять
и после беглого просмотра не полная уверенность что в группы вообще везде правильно юниты добавляются
ты возьми систему в которой знаешь что утечек нет и адаптируй под себя
уж найти такую систему должен мочь
8
quq_CCCP:
Extrime candy war в помощь.
Открыл по твоему совету Канди вар, и вот что увидел. Разве здесь не больше утечек, чем у меня?
ClotPh:
точки утекают все по-моему
группы надо не только разрушать но и обнулять
и после беглого просмотра не полная уверенность что в группы вообще везде правильно юниты добавляются
ты возьми систему в которой знаешь что утечек нет и адаптируй под себя
уж найти такую систему должен мочь
Ну вот да, я пытаюсь найти сейчас, доту открываю но там такое месиво, пока ничего не понял)
Щаз еще посмотрю в функциях как ОБНУЛЯТЬ группы!
Загруженные файлы
8
quq_CCCP:
VVelikolepniy, меньше раз в 10.
Ваш код одна большая утечка...
Но он же просто назначает точку как цент области, заставляет двигаться юнита к этой точке и удаляет точку. А я Создаю отряд по координатам, заставляю бжать отряд а потом удаляю отряд из памяти. Вы имеее ввиду что нужно удалять из памяти назначенные точки тоже?
29
VVelikolepniy, Да, нужно использовать RemoveLocation(твоя локация)
А также
call DestroyGroup (destr1)
set destr1 = null
8
Msey:
VVelikolepniy, Да, нужно использовать RemoveLocation(твоя локация)
А также
call DestroyGroup (destr1)
set destr1 = null
RemoveLocation(твоя локация) но я же не присваивал переменную к локации, у меня там координаты сразу. Можно ли написать RemoveLocation(5300.00, 0.00), или мне нужно в начале триггера присваивать локальную переменную координатам, а потом вызывать на место локальной переменной, а потом писать RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
10
VVelikolepniy:
RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
Да. Но лучше запиши эти данные в глобальную переменную, это, вроде, оптимальнее, чем создавать каждый раз лок. переменные.
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
Отчисти группу после использования call GroupClear(group). Возможно это поможет.
8
LordDracula:
VVelikolepniy:
RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
Да. Но лучше запиши эти данные в глобальную переменную, это, вроде, оптимальнее, чем создавать каждый раз лок. переменные.
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
Отчисти группу после использования call GroupClear(group). Возможно это поможет.
Кстати по такой же логике можно создать отряды по инициализации карты в глобальные переменные и вызывать в триггере их каждый раз)
29
VVelikolepniy:
Кстати по такой же логике можно создать отряды по инициализации карты в глобальные переменные и вызывать в триггере их каждый раз)
Можно. Но зачем?
8
ClotPh:
точки утекают все по-моему
группы надо не только разрушать но и обнулять
и после беглого просмотра не полная уверенность что в группы вообще везде правильно юниты добавляются
ты возьми систему в которой знаешь что утечек нет и адаптируй под себя
уж найти такую систему должен мочь
Да, найти систему без утечек я должен мочь.. но не могу(
21
У тебя создаются точки
как без точек - тебе Maniac_91 написал
21
тут же все просто например если на гуи
делаешь в карте области
и пишешь 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)
повторять столько раз сколько нужно для нужных областей и юнитов
тупо и гуишно и с точками, зато понятно и вроде без утечек
если что поправьте на гуи давно не
8
ClotPh:
У тебя создаются точки
как без точек - тебе Maniac_91 написал
Но у него в способе тоже координаты есть, разве там точки не создаются?
10
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)
Аргументы: игрок-владелец, количество юнитов, ид юнита, координата спавна Х, координата спавна У, угол порота юнита, приказ, координата приказа Х, координата приказа У
21
quq_CCCP, "меньше раз в 10"
а где тут утечки вообще?
просто если бы на гуи то мной примерно так же бы делалось
ты говоришь что утечки все-таки есть, хотя и мало - где?
28
ClotPh, в карте есть незначительные утечки внутри бж функций
правда они настолько не значительны что не влияют ни на что
VVelikolepniy, функция Location создаёт точку
если точка была создана то её надо удалить
чего ты не делаешь
лучше не использовать точки а напрямую работать с координатами
а юнитов создавать циклом
так и группы удалять не придётся
и да
все локальные переменные после удаления объекта надо очищать
вот пример цикла
int i=0;
int countUnits=5; // количество юнитов
loop{
	exitwhen i == countUnits
	i++;
	// тут делай создание юнита и прочие действия
}
38
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 есть утечка, но это нативно, она минимальная и это никак не исправляется.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.