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

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

Не все хендлы удаляются мгновенно, некоторые висят какое то время, требуемое для утилизации.
0
19
6 лет назад
0
Похожие вопросы:

ответ
Главный кошмар тут, конечно - 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

0
7
6 лет назад
Отредактирован Sergey105
0
group g = CreateGroup()
GroupClear(g)
DestroyGroup(g);
g = null;
поверил ещё один метод он работает если верить системе
globals
group g = CreateGroup();
endglobals
void DG(){
DestroyGroup(g);
g = null;
}
вот если что система не помню где её нашел
Загруженные файлы
0
32
6 лет назад
0
Не все хендлы удаляются мгновенно, некоторые висят какое то время, требуемое для утилизации.
Принятый ответ
0
7
6 лет назад
0
quq_CCCP, и какое время примерно?
просто делаю карту и мне не надо чтобы она через мин 20 лагала хоть как то
это я не начал ещё спелы делать а чисто старт карты а при спелах я не представляю сколько так будет висеть хендалов
и да есть возможность как-то самому обнулить handle ?
короче я кажется понял он не удаляется пока не создам новый
поставил в таймер с периодом 0.01 и система показывает то 2 то 1 но не больше
trigger t = CreateTrigger();
DestroyTrigger(t);
t = null;
0
21
6 лет назад
0
Лучше не создавать много групп, а создать один и использовать его, очищая группу после использования.
Sergey105:
trigger t = CreateTrigger();
DestroyTrigger(t);
t = null;
а как правильно удалять триггеры описано здесь. xgm.guru/p/wc3/venomanser
0
28
6 лет назад
0
А зачем вообще удалять триггеры?
0
7
6 лет назад
0
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 хендела
0
32
6 лет назад
0
PT153, затем, когда ты делаешь свобственные баффы, это очень даже нужно создавать динамические триггеры чтобы следить за юнитом, вы щяс скажите про 1 триггер на всех, но хрен вы так сделайте потому что нужные события работают какраз на 1 юнита, это раз, два спятите код делать.
Триггер нестоит удалять просто так, сразу в его потоке.В доте фрог юзает систему для удаления триггеров, где триггер отключают, удаляют условия и дейсвия и только через минуту удаляют, связано это с багом коллизии хендлов. Фрогу это кто то писал, кодер явно был не дурак. Да и фрога задолбали репортами багов, в вашей карте это может не проявлятся до поры до времени, ибо дота пожалуй самая играймая карта. Но когда популярность возрастет вас тоже засыпят багрепортами.
0
26
6 лет назад
0
после создания группы вне зависимости локальная или глобальная
Создание группы это создание объекта, а у объектов есть хэндлы.
Локальный и глобальный - это тип переменной, которая может ссылаться на объект.
т.е. нет разницы какая была объявлена переменная, на свойствах объекта это не сказывается
Чтобы оставить комментарий, пожалуйста, войдите на сайт.