Добавлен
Начал пользоваться системой HandleCounter которая показывает висящие хедлы . так вот заметил фишку
после создания группы вне зависимости локальная или глобальная и после удаления ,обнуления всё равно handle висит. Это баг системы или группа не удаляет ссылку handle?

Не все хендлы удаляются мгновенно, некоторые висят какое то время, требуемое для утилизации.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
Главный кошмар тут, конечно - 14 групп. Пришлось так делать, т. к. принципиально не хочу применять глобалки, а локалки, похоже, после дестройгруп заново не юзабельны.
Это вроде должно быть легко поправить, вместо
call DestroyGroup (firewayunits1)
везде ставь
call GroupClear(firewayunits1)
и в самом конце уже, где идет обнуление переменных, там оставляешь DestroyGroup.
И с чего такая нелюбовь к глобалкам? Хештаблица используется, а это ж тоже глобалка, причем даже не просто глобалка, а супер-глобалка. У меня с ней постоянно головная боль была, из-за возникающих после интенсивной работы странных глюков...
ответ
Достаточно посмотреть как устроены эти бж функции и все будет понятно.
function OnlyAliveSourcess takes nothing returns boolean // эту функция в кастом код карты, в самом вверху.
    return GetUnitTypeId( GetFilterUnit( ) ) == 'hsor' and not ( GetWidgetLife( GetFilterUnit( ) ) < 0.405 or IsUnitType( GetFilterUnit( ), UNIT_TYPE_DEAD ) )
endfunction
//...
call GroupClear( udg_Group ) // это в кастом скрипт твоего триггера
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, Condition( function OnlyAliveSourcess )) // это в кастом скрипт твоего триггера
Вот без утечек и локейшинов и прочих ненужных действий.
Далее уже делай что хочешь с юнитами в группе
ответ
globals
	player Pl = null
endglobals

function abc takes nothing returns boolean
	return IsUnitEnemy(GetFilterUnit(), Pl)
endfunction

function zemle takes nothing returns nothing
local unit u = GetTriggerUnit()
local group g = CreateGroup()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real Random = GetRandomReal(0, 360)
local boolexpr d = Condition(function abc)
set Pl = GetTriggerPlayer()

call GroupEnumUnitsInRange( g, x, y, 850, d )
call ForGroup( g, function zemlee )
call UnitApplyTimedLife(CreateUnit (p, 'h007',x,y,Random),'BFiq',0.50 ) // ???

call DestroyGroup(g)
call DestroyBoolexpr(d)
set u = null
set p = null
set g = null 
set d =null
endfunction

7
group g = CreateGroup()
GroupClear(g)
DestroyGroup(g);
g = null;
поверил ещё один метод он работает если верить системе
globals
group g = CreateGroup();
endglobals
void DG(){
DestroyGroup(g);
g = null;
}
вот если что система не помню где её нашел
Загруженные файлы
32
Не все хендлы удаляются мгновенно, некоторые висят какое то время, требуемое для утилизации.
Принятый ответ
7
quq_CCCP, и какое время примерно?
просто делаю карту и мне не надо чтобы она через мин 20 лагала хоть как то
это я не начал ещё спелы делать а чисто старт карты а при спелах я не представляю сколько так будет висеть хендалов
и да есть возможность как-то самому обнулить handle ?
короче я кажется понял он не удаляется пока не создам новый
поставил в таймер с периодом 0.01 и система показывает то 2 то 1 но не больше
trigger t = CreateTrigger();
DestroyTrigger(t);
t = null;
21
Лучше не создавать много групп, а создать один и использовать его, очищая группу после использования.
Sergey105:
trigger t = CreateTrigger();
DestroyTrigger(t);
t = null;
а как правильно удалять триггеры описано здесь. xgm.guru/p/wc3/venomanser
7
PT153, это как пример я дал просто
а так что триггеры что группы и тд гонят при инициализации карты
я вот фишку нашел одну хз баг это и ли нет
но вот 2 примера
Пример 1 он показывает что создано 2080 хенодлов это с учетом зданий декоров и тд_______________________________________________________________
void add_struct(){
group g = CreateGroup();
region r = CreateRegion();
trigger t = CreateTrigger();
trigger t2 = CreateTrigger()

DestroyTimer(GetExpiredTimer());

GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function ActionsFunc);
DestroyGroup(g); g = null;

RegionAddRect(r, bj_mapInitialPlayableArea);
TriggerRegisterEnterRegion(t, r, function ActionsFunc);
t = null; r = null;

TriggerRegisterPlayerUnitEvent(t2, Player(0x00), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x01), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x02), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x03), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x04), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x05), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x06), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x07), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x09), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x0A), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x0B), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x0C), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x0D), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x0E), EVENT_PLAYER_UNIT_DEATH, null);
TriggerRegisterPlayerUnitEvent(t2, Player(0x0F), EVENT_PLAYER_UNIT_DEATH, null);
TriggerAddCondition(t2, Condition(function ActionsFunc));
t2 = null;
}
void BUG(){
timer t = GetExpiredTimer()
TimerStart(t, 0.00, false, function add_struct);
t = null;
}
void InitTrig_AddStruct(){
TimerStart(CreateTimer(), 1.10, false,function BUG);
}
_______________________________________________________________________
когда я запускаю функцию через 2 таймера то норм
но если сделаю по другому запущу на прямую или через 1 таймер показывает 2102 хендела
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.