Уже второй день не могу устранить это. Изначально вместо локальной переменной группы стояла глобальная, утечек не возникало(по крайней мере минут 5 карта работала стабильно), затем сменил её, теперь больше 2.5 минут хватает, чтоб начались дикие лаги. Думал, что дело в "location" и "boolexpr", пробовал создавать локалки, потом их обнулять, но ничего не изменилось. Не знаю, может быть я просто не правильно обнуляю
группу, подскажите, что делать.
function R takes nothing returns boolean
local group g = CreateGroup()
call GroupEnumUnitsInRangeOfLoc(g, GetUnitLoc(gg_unit_n000_0021), 900, Condition(function M))
return ( CountUnitsInGroup(g) >= 1 )
call DestroyBoolExpr(Condition(function M))
call DestroyGroup(g)
call GroupClear(g)
set g = null
endfunction

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

Добавь локальную логическую, которая будет равна ( CountUnitsInGroup(g) >= 1 ) и возвращай эту локалку, после того, как всё обнулил.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
интережер это число
а null это объект
число не является объектом
следовательно их нельзя сравнивать/приравнивать
ответ
Вот как должен выглядеть полностью правильный триггер без утечек, единственная утечка создастся только при первом использовании, это я так понял переменная группы, ее обнулять нельзя, иначе скил будет работать только раз.
ответ
Steal nerves:
считаю глупостью заниматься такими вещами. Только чистый jass и понимание, где что утекает (и оптимизация кода).
Тут столько программистов и до сих пор вы не сделали универсальную библиотеку?
сам удивляюсь. Но помнится кто-то делал. Если честно, jass vjass знаю, и я таким не хочу заниматься, меня все устраивает. Даже, если это все будет, новички все равно будут вопросы задавать, инструкции для новичков faq не читают, поиск не юзают (столько вопросов задавали), учиться не хотят. Считаю это бесполезным занятием. Считаю лучше jass, просто менюшками не удобно пользоваться: в них бывает нет всех команд и функции, + это надо все искать по специальным разделам и др.
Суть в том, что это библиотека должна быть не только у тебя, но и у другого юзера. Если ты сделал новыми менюшками триггер, сохранил карту, передал другому человеку. К него должна быть по идее такая же библиотека, иначе не заработает, или не откроет, так как такой функции в редакторе у него нет.
ответ
ALL_Remove = false
чтотооченьважное
ALL_Remove = true
как сложно то было
ответ
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано

0
18
6 лет назад
0
call DestroyBoolExpr(Condition(function M)) это лишнее
И после return ничего не выполняется
0
2
6 лет назад
0
UrsaBoss:
И после return ничего не выполняется
Если после return ничего не выполняется, выходит локалку в этой функции вообще не обнулить?
1
18
6 лет назад
Отредактирован Hodor
1
KalaKoltes:
UrsaBoss:
И после return ничего не выполняется
Если после return ничего не выполняется, выходит локалку в этой функции вообще не обнулить?
всё кроме группы сможешь обнулить, т.к возвращаешь ты группу
Совет: группу лучше сделать глобальной.
Получится примерно так:
В данном случае g это уже глобальная группа
function R takes nothing returns boolean
    local location p = GetUnitLoc(gg_unit_n000_0021)

    call GroupClear( g )
    call GroupEnumUnitsInRangeOfLoc(g, p, 900, Condition(function M))
    call RemoveLocation( p )
    set p = null
    return ( CountUnitsInGroup(g) >= 1 )
endfunction
3
26
6 лет назад
3
Добавь локальную логическую, которая будет равна ( CountUnitsInGroup(g) >= 1 ) и возвращай эту локалку, после того, как всё обнулил.
Принятый ответ
0
2
6 лет назад
0
UrsaBoss:
KalaKoltes:
UrsaBoss:
И после return ничего не выполняется
Если после return ничего не выполняется, выходит локалку в этой функции вообще не обнулить?
всё кроме группы сможешь обнулить, т.к возвращаешь ты группу
Совет: группу лучше сделать глобальной.
Получится примерно так:
В данном случае g это уже глобальная группа
function R takes nothing returns boolean
    local location p = GetUnitLoc(gg_unit_n000_0021)

    call GroupClear( g )
    call GroupEnumUnitsInRangeOfLoc(g, p, 900, Condition(function M))
    call RemoveLocation( p )
    set p = null
    return ( CountUnitsInGroup(g) >= 1 )
endfunction
Раньше группа стояла глобальная, но триггер не работал, как нужно. Нужно ли в таком случае передавать ей значение этой переменной, чтобы её использовать?
0
18
6 лет назад
0
KalaKoltes:
Раньше группа стояла глобальная, но триггер не работал, как нужно. Нужно ли в таком случае передавать ей значение этой переменной, чтобы её использовать?
А какая разница, просто объявляешь глобальную переменную g и создаешь группу, далее где угодно используй и утечки не будет. Это если нужно использовать группу моментально и забыть о ней
0
28
6 лет назад
Отредактирован nvc123
0
KalaKoltes, UrsaBoss, убер уже сказал как сделать правильно не создавая глобальных переменных
точка тут вообще нафиг не нужна
function R takes nothing returns boolean
	local boolean result=false
	local group g=CreateGroup()
    call GroupEnumUnitsInRange(g, GetUnitX(gg_unit_n000_0021), GetUnitY(gg_unit_n000_0021), 900, Condition(function M))
	set result = ( CountUnitsInGroup(g) >= 1 )
	call DestroyGroup(g)
	set g = null
    return result
endfunction
0
2
6 лет назад
0
Спасибо всем за помощь, вроде помогло
Чтобы оставить комментарий, пожалуйста, войдите на сайт.