Вариант 1 или 2, как лучше? Или нет разницы?
Cкрин

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

SNART, утечка в BJ-функции. ты обо всех видимых утечках позаботился. А вот группу не удалил, не обнулил локалки. Это где "Юниты в радиусе в .... " - это группа создается при каждом вызове этой команды, и остается не удаленной, Не обнуляются внутри локалки
NazarPunk, ежесекундно утекает группа GetUnitsInRectAll(GetPlayableMapRect()), так как каждый раз создается новая группа, и будет огромное кол-во срзданных групп, и локалки не обнуляются
хотя никогда не пользовался set bj_wantDestroyGroup = true - надо видеть, где это работает
ссылка
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
6 лет назад
0
Второе лучше, но там еще походу утечки. Так же не вижу удаление группы, да и что то не пойму что вы там заморозить хотите?
0
18
6 лет назад
0
quq_CCCP:
Второе лучше, но там еще походу утечки. Так же не вижу удаление группы, да и что то не пойму что вы там заморозить хотите?
Заморозить: случайного юнита из группы юнитов - юниты в радиусе 350 от точки - позиция атакующий юнит - при условии - владелец юнита - совпадающий юнит - равно - противник.
0
28
6 лет назад
0
SNART, второй вариант немного лучше
но утечек всеравно дофига
Этот комментарий удален
0
8
6 лет назад
0
Раз тут такой разговор, то зачем очищать переменные для которых уже выделено место в памяти, разве они не будут просто перезаписываться?
2
21
6 лет назад
2
Соблюдай 2 правила:
  • не плоди хендлы (обычно - локации)
  • удаляй ссылки (обнуляй переменные)
Для дебага можешь использовать небольшую
систему
library HandleCounter initializer Initialization

   globals
      leaderboard HandleBoard
   endglobals
   
   function HandleCounter_Update takes nothing returns nothing
      
      local integer i = 0
      local integer id
      local location array P
      local real result=0
      
      loop
      exitwhen i >= 50
         set i = i + 1
         set P[i] = Location(0,0)
         set id = GetHandleId(P[i])
         set result = result + (id-0x100000)
      endloop
      set result = result/i-i/2
      loop
          call RemoveLocation(P[i])
          set P[i] = null
          exitwhen i <= 1
          set i = i - 1
      endloop
      call LeaderboardSetItemValue(HandleBoard,0,R2I(result))
   
   endfunction


   function HandleCounter_Actions takes nothing returns nothing
       
      set HandleBoard = CreateLeaderboard()
      call LeaderboardSetLabel(HandleBoard, "Handle Counter")
      call PlayerSetLeaderboard(GetLocalPlayer(),HandleBoard)
      call LeaderboardDisplay(HandleBoard,true)
      call LeaderboardAddItem(HandleBoard,"Handles",0,Player(0))
      call LeaderboardSetSizeByItemCount(HandleBoard,1)
      call HandleCounter_Update()
      call TimerStart(GetExpiredTimer(),0.05,true,function HandleCounter_Update)

   endfunction

function Initialization takes nothing returns nothing

        call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
        
endfunction

endlibrary

Эту библиотеку можешь закинуть в любое место вне функции/библиотеки/структуры.
1
20
6 лет назад
1
статейка по утечкам
старая, но актуальная
0
18
6 лет назад
0
Сделал так:
Скрин
Тест: (версия игры 1.26)
1000 юнитов (без способностей) с перезарядкой 0.25 сек. атакуют 150 юнитов в течении 5 минут. Тормозов не заметил причем даже при отключенной функции - "set bj_wantDestroyGroup = true".
Но есть проблема:
Если атакующим дать способность, например - "дыхание холода", то возникает утечка, которая вроде бы исчезает, если удалить атакуемых.
Загруженные файлы
0
29
6 лет назад
Отредактирован nazarpunk
0
Если атакующим дать способность, например - "дыхание холода", то возникает утечка, которая вроде бы исчезает, если удалить атакуемых.
Если исчезает при удалении юнитов, значит "дыхание холода" резервирует хэндлы для работы
Тормозов не заметил причем даже при отключенной функции - "set bj_wantDestroyGroup = true".
Попробуйте часто выбирать всех юнитов на карте и будут вам тормоза с утечками
Код
function Trig_handle_Func002002 takes nothing returns nothing
    call DoNothing()
endfunction

function Trig_handle_Actions takes nothing returns nothing
    call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_handle_Func002002 )
endfunction

function InitTrig_handle takes nothing returns nothing
    set gg_trg_handle = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_handle, 0.01 )
    call TriggerAddAction( gg_trg_handle, function Trig_handle_Actions )
endfunction
3
27
6 лет назад
Отредактирован MpW
3
SNART, утечка в BJ-функции. ты обо всех видимых утечках позаботился. А вот группу не удалил, не обнулил локалки. Это где "Юниты в радиусе в .... " - это группа создается при каждом вызове этой команды, и остается не удаленной, Не обнуляются внутри локалки
NazarPunk, ежесекундно утекает группа GetUnitsInRectAll(GetPlayableMapRect()), так как каждый раз создается новая группа, и будет огромное кол-во срзданных групп, и локалки не обнуляются
хотя никогда не пользовался set bj_wantDestroyGroup = true - надо видеть, где это работает
ссылка
Принятый ответ
0
18
6 лет назад
Отредактирован SNART
0
ссылка
Нет, в jass не разбираюсь...
В общем сойдёт такой вариант,
так, как в нужной карте нагрузка на триггер будет примерно в 100 раз меньше, чем при тесте с 1000 юнитов.
Загруженные файлы
0
29
6 лет назад
0
SNART:
ссылка
Нет, в jass не разбираюсь...
В общем сойдёт такой вариант,
так, как в нужной карте нагрузка на триггер будет примерно в 100 раз меньше, чем при тесте с 1000 юнитов.
Я просто поражаюсь, как вместо того, чтобы понять несколько строчек на JASS люди тратят кучу чужого и своего времени, чтобы сделать криво, но просто.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.