Следующая строка вызывает утечки, как избавиться от них? По-моему GetUnitsSelectedAll().
set udg_InfoPick[GetConvertedPlayerId(GetTriggerPlayer())] = GroupPickRandomUnit(GetUnitsSelectedAll(GetTriggerPlayer()))

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

GetUnitsSelectedAll не освобождает хендл, но это не утечка.
С помощью set bj_wantDestroyGroup = true созданная в GetUnitsSelectedAll группа удаляются, но хендл не освобождается. Это не так страшно, но лучше сделать вот так.
globals
    group TempGroup
endglobals

function GetUnitsSelectedAllFixed takes player whichPlayer returns group
    set TempGroup = CreateGroup()
    call SyncSelections()
    call GroupEnumUnitsSelected(TempGroup, whichPlayer, null)
    return TempGroup
endfunction

...

set bj_wantDestroyGroup = true
set udg_InfoPick[GetConvertedPlayerId(GetTriggerPlayer())] = GroupPickRandomUnit(GetUnitsSelectedAllFixed(GetTriggerPlayer()))
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
19
5 лет назад
2
Похожие вопросы:

ответ
Порождать утечку может только объект, чей тип наследует тип handle.
Такие типы как:
  • boolean
  • integer
  • real
  • string
являются базовыми и утечек не порождают. Все остальные типы (unit, group, timer, multiboard и т.д.) являются наследниками типа handle и могут вызывать утечки.
Подробнее тут:
и тут:
Исключением из правил является тип player. Так как игроки существуют на протяжении всей игры, так как они не уничтожаются и не удаляются, являются постоянным объектом существующим на протяжении всей игры, утечек они не порождают.
ответ
FrigatPlay, с этим я согласен, т.к. статья рассчитана на того кто шарит в программировании
используя только средства гуи от утечек не избавится т.к. гуи сделано из утечек
это как пытаться убрать из кирпичного дома все кирпичи
ответ
Переменная "точка" это не просто два числа.
Она хранит объект - ссылку на место в памяти, где хранятся эти два числа.
Пока ты не вызовешь RemoveLocation, эта точка будет висеть в памяти.
Когда ты присваиваешь переменной новое значение, старый объект не удален, но появляется новый объект с другими координатами, и твой триггер создает 200 точек в секунду.
Чтобы поменять координаты не создавая новый объект, есть функция MoveLocation
ответ
range * Cos(a * bj_DEGTORAD)
должно получится так:
a = Atan2(endfly_y - GetUnitY(suriken), endfly_x - GetUnitX(suriken))
SetUnitX(suriken, GetUnitX(suriken) + 20.00 * Cos(a))
SetUnitY(suriken, GetUnitY(suriken) + 20.00 * Sin(a))

0
29
5 лет назад
0
Установите JNGP и посмотрите код функции
function GroupPickRandomUnit takes group whichGroup returns unit
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupRandomConsidered = 0
    set bj_groupRandomCurrentPick = null
    call ForGroup(whichGroup, function GroupPickRandomUnitEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
    return bj_groupRandomCurrentPick
endfunction

function GroupPickRandomUnitEnum takes nothing returns nothing
    set bj_groupRandomConsidered = bj_groupRandomConsidered + 1
    if (GetRandomInt(1,bj_groupRandomConsidered) == 1) then
        set bj_groupRandomCurrentPick = GetEnumUnit()
    endif
endfunction
2
19
5 лет назад
2
NazarPunk, сорре, я слишком тупой. поясни.
NazarPunk, мне нужно указать set bj_wantDestroyGroup = true?
Перед вызовом, да?
0
26
5 лет назад
0
Поставь перед строкой
set bj_wantDestroyGroup = true
Ну ты догадался)
0
19
5 лет назад
0
8gabriel8, поставил, но утечки все равно остались, хоть их и стало меньше вроде. (Проверял, другие триггеры не влияют)
0
29
5 лет назад
0
KaneThaumaturge, попробуйте так
set bj_wantDestroyGroup = true
set udg_InfoPick[GetConvertedPlayerId(GetTriggerPlayer())] = GroupPickRandomUnit(GetUnitsSelectedAll(GetTriggerPlayer()))
0
19
5 лет назад
0
NazarPunk, Я уже написал так, но утечки все равно появляются, при этом триггере.
1
26
5 лет назад
1
Наверное, дело в GetUnitSelectedAll.
0
19
5 лет назад
0
8gabriel8, Ладно, оставлю пока так.
0
28
5 лет назад
0
утечки все равно появляются
Откуда такая уверенность?
0
18
5 лет назад
0
Это же конвертация из гуи, верно понимаю?)
Если игровой процесс в твоей карте не занимает больше 20-30 минут и утекает не очень сильно - то тебе не нужно волноваться по поводу каждой утечки
0
29
5 лет назад
0
8gabriel8:
Наверное, дело в GetUnitSelectedAll.
Проморгал я работу с выбором
function GetUnitsSelectedAll takes player whichPlayer returns group
    local group g = CreateGroup()
    call SyncSelections()
    call GroupEnumUnitsSelected(g, whichPlayer, null)
    return g
endfunction
1
28
5 лет назад
Отредактирован PT153
1
GetUnitsSelectedAll не освобождает хендл, но это не утечка.
С помощью set bj_wantDestroyGroup = true созданная в GetUnitsSelectedAll группа удаляются, но хендл не освобождается. Это не так страшно, но лучше сделать вот так.
globals
    group TempGroup
endglobals

function GetUnitsSelectedAllFixed takes player whichPlayer returns group
    set TempGroup = CreateGroup()
    call SyncSelections()
    call GroupEnumUnitsSelected(TempGroup, whichPlayer, null)
    return TempGroup
endfunction

...

set bj_wantDestroyGroup = true
set udg_InfoPick[GetConvertedPlayerId(GetTriggerPlayer())] = GroupPickRandomUnit(GetUnitsSelectedAllFixed(GetTriggerPlayer()))
Принятый ответ
0
19
5 лет назад
0
PT153, спасибо. Не исправило постоянное появление при пике новых хэндлов, но все же спасибо. Не думаю, что это хоть как-то сможет повлиять на производительность, но просто стараюсь не повторять прошлых ошибок.
0
28
5 лет назад
0
Не исправило постоянное появление при пике новых хэндлов
Для этого можно после set udg_InfoPick... вставить строчку set TempGroup = null, тогда на хендл ничего ссылаться больше не будет и он вскоре будет освобождён. Но TempGroup - глобальная переменная, а потому подразумевается, что она будет часто перезаписываться.
PT153:
но это не утечка
На самом деле, скорее всего, утечкой тут будет сама переменная g, потому что она ссылается куда-то, и из-за этого может быть не удалена.
0
19
5 лет назад
0
PT153, а не нужно прописывать call DestroyGroup(TempGroup)?
PT153, в общем при пике юнитов появляются и не исчезают хэндлы, равные (кол-ву юнитов - 1)
0
28
5 лет назад
Отредактирован PT153
0
а не нужно прописывать call DestroyGroup(TempGroup)?
Ты же уже написал set bj_wantDestroyGroup = true. Из-за этого данная группа удалится внутри GroupPickRandomUnit.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.