Эта функция, а точнее работа его цикла, по каким-то причинам жутко учетная. По данным "Багометра". Но почему...
function ActSR takes nothing returns nothing
local unit u
local integer i = 1
local location loc = Location(0.00,0.00)
if ( GetSpellAbilityId() == 'A00I' ) then
set u = CreateUnitAtLoc(GetOwningPlayer(GetSpellAbilityUnit()), 'u001', GetUnitLoc(GetSpellAbilityUnit()), GetRandomReal(0,360))
call SetUnitAbilityLevel(u, 'A00H', GetUnitAbilityLevel(GetSpellAbilityUnit(),'A00I'))
call GroupAddUnit(udg_EvliSouls, u)
loop
exitwhen  GetUnitState(u,UNIT_STATE_LIFE) < GetUnitState(u,UNIT_STATE_MAX_LIFE)
call MoveLocation(loc,GetLocationX(GetUnitLoc(GetSpellAbilityUnit())) + 50.00 * Cos(GetRandomReal(0, 360) * 0.01744444444),GetLocationY(GetUnitLoc(GetSpellAbilityUnit())) + 50.00 * Sin(GetRandomReal(0, 360) * 0.01744444444))
call IssuePointOrderLoc( u, "smart", loc)
endloop
call RemoveLocation(loc)
set loc = null
set u = null
endif
endfunction

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

Функция GetUnitLoc порождает новую точку, поэтому и счетчик хендлов увеличивается.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
7 лет назад
0
Похожие вопросы:

ответ
Скомпилил код, у меня ничего не утекает. 96 95 94 хендла, и так далее.
ответ
Достаточно юзать то что внизу, без ненадёжной функции сверху. Но даже тогда какая-то фигня остаётся, насколько мне говорили.

Конкретно в твоём случае рекомендую Использовать одну группу на всю игру.
Юнит входит в карту
Условия блаблабла
Отряд - добавить юнит в группу врагов.
Когда юнит умирает и разлагается он автоматом удаляется из группы.
Тебе останется только проверять число юнитов в группе, не создавая и не удаляя 10 раз в секунду.
Если не устраивает удаление юнита из группы только по разложению - удаляй вручную. когда умирает.

Группы в таком периоде даже "без утечек" вызывают лаги, у меня такое в карте по типу twisted metal имеет место быть.
ответ
Starman2222, обе функции "Позиция юнита" и "Точка со смещением" создают объект типа точка (location), которую необходимо удалять
ответ
Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
ответ
LainMikoroso, xgm.guru/p/wc3/articles
там есть всё что ты просил и даже больше

0
1
7 лет назад
Отредактирован Idency
0
Функция GetUnitLoc порождает новую точку, поэтому и счетчик хендлов увеличивается.
Принятый ответ
0
15
7 лет назад
0
Idency:
Функция GetUnitLoc порождает новую точку, поэтому и счетчик хендлов увеличивается.
Спасибо, тогда попробую эту точку закинуть в локалку, и обнулять в конце.
0
20
7 лет назад
0
еще может утекать set u = CreateUnitAtLoc и вообще любые действия с созданием юнитов или точек (вообще чего угодно) с использованием местоположения какого-либо юнита (в данном случае кастера)
правила везде одни такие же, как и для гуи - сохраняем точку в переменной, работаем с переменной, после - обнуляем
1
29
7 лет назад
Отредактирован 16GB
1
loop
exitwhen  GetUnitState(u,UNIT_STATE_LIFE) < GetUnitState(u,UNIT_STATE_MAX_LIFE)
call MoveLocation(loc,GetLocationX(GetUnitLoc(GetSpellAbilityUnit())) + 50.00 * Cos(GetRandomReal(0, 360) * 0.01744444444),GetLocationY(GetUnitLoc(GetSpellAbilityUnit())) + 50.00 * Sin(GetRandomReal(0, 360) * 0.01744444444))
call IssuePointOrderLoc( u, "smart", loc)
endloop
Это жесть какая-то, такое таймером надо делать, а не циклом.
И вообще лучше координаты юзать
function ActSR takes nothing returns nothing
local unit u
local unit c = GetSpellAbilityUnit()
local integer i = 1
local real x
local real y
if ( GetSpellAbilityId() == 'A00I' ) then
set u = CreateUnit(GetOwningPlayer(c),'u001',GetUnitX(c),GetUnitY(c),GetRandomReal(0,360))
call SetUnitAbilityLevel(u, 'A00H', GetUnitAbilityLevel(c,'A00I'))
call GroupAddUnit(udg_EvliSouls, u)
loop
exitwhen  GetUnitState(u,UNIT_STATE_LIFE) < GetUnitState(u,UNIT_STATE_MAX_LIFE)
set x = GetUnitX(c)+50.*Cos(GetRandomReal(0,360)*0.01744444444)
set y = GetUnitY(c)+50.*Sin(GetRandomReal(0,360)*0.01744444444)
call IssuePointOrder( u, "smart", x,y)
endloop
set u = null
endif
set c = null
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.