Приветствую знающих. Столкнулся с весьма интересным в Варе явлением. Решил воспользоваться счетчиком handle'ов для проверки созданных мной заклинаний на карте. Понимаю, что данный метод может оказаться необъективным, но все же в этом должно что-то быть, так как основой есть id объекта. У меня игра при очень разных показателей таблицы ведет себя одинаково гладко (производительность остается на одном уровне, что видно по количеству кадров в секунду(хоть и это замерять глупо)). Это происходит после удаления всех объектов, созданных после действия заклинаний. Что при 5 тысячах handle'ов, что при практически 100 тысячах FPS сохраняется в виде 60 кадров (тестировал в Grimoire, в самой игре на 4 кадра выше). Вопрос: почему количество объектов остается на одном уровне, даже после удаления native-функциями или сама наработка со счетчиком необъективна?

Пушистый, создал и удалил 100к юнитов
результат счётчика 1100
на всякий случай сообщу что 1100 меньше чем 100к
так же не стоит забывать что вар тупит с большими сериями (если подряд создаётся/удаляется много объектов)
и начинает добавлять после последнего удалённого хэндла хотя предыдущие свободны и не занимают память
при следующей пересборке таблицы это проходит
для того чтобы счётчик адекватно реагировал на это надо чтобы размер серии счётчика был больше чем размер серии создаваемых объектов
я слегка модифицировал твой счётчик
globals
    leaderboard udg_HandleBoard = null
endglobals
define sizehc=300;
function HandleCounter_Update takes nothing returns nothing
   local integer i = 0
   local integer id
   local location array P
   local integer result=0
   local integer min=-1;
   loop
      exitwhen i >= sizehc
      set i = i + 1
      set P[i] = Location(0,0)
      set id = GetHandleId(P[i])
      id-=0x100000
      if(min==-1){
        min=id;
      }
      if(id>result){
        result=id;
      elseif(id<min)
        min=id;
      }
   endloop
   if(result-min>sizehc){
    result=min;
   else
    result-=sizehc
   }
   loop
      call RemoveLocation(P[i])
      set P[i] = null
      exitwhen i <= 1
      set i = i - 1
   endloop
   call LeaderboardSetItemValue(udg_HandleBoard,0,result)
endfunction

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

function InitTrig_HandleCounter takes nothing returns nothing
   call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction
у меня создаётся и удаляется более 2к юнитов сериями по 200
длинна серии счётчика задаётся в sizehc (в моём случае это 300)
вот триггер создания юнитов
function Trigcru takes nothing returns nothing
    local unit u= CreateUnit(Player(0),'hfoo',0,0,0)
    call RemoveUnit(u)
    set u=null
endfunction

function Trigcrul takes nothing returns nothing
    local integer i=0
    loop
        call Trigcru()
        exitwhen i==200
        set i=i+1
    endloop
    
     
endfunction

function Trig___________________________u_Actions takes nothing returns nothing
    local integer i=0
    loop
        call Trigcrul()
        call TriggerSleepAction(0.1)
        call DisplayTextToPlayer(GetLocalPlayer(),0,0,I2S(i))
        exitwhen i==10
        set i=i+1
    endloop
    set i=0
    call DisplayTextToPlayer(GetLocalPlayer(),0,0,"end")
    call TriggerSleepAction(1)
    
endfunction

//===========================================================================
function InitTrig___________________________u takes nothing returns nothing
    set gg_trg___________________________u = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg___________________________u, 2 )
    call TriggerAddAction( gg_trg___________________________u, function Trig___________________________u_Actions )
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Не все объекты удаляются, яркий пример события триггеров - увы но даже удалив триггер и объект на который было повышено событие ( речь о событиях на конкретный виджет) + часть памяти занимают объекты сидящие на карте, вроде юнитов, Предметов и так далее.
28
если речь про хэндлы то кроме удаления объектов нужно обнулять переменные
хэндлы бывают разными
100к точек это меньше 1 метра
а 100к юнитов это намного больше
13
nvc123, переменные также подлежали обнулению, но все равно количество росло вверх. Даже, если, например, в переодике в моей магии написать DestroyEffect(AddSpecialEffect(...)), то количество handle'ов растет.
28
Пушистый, сколько времени ждал?
gc ведь не сразу их подбирает
пока найдёт
пока покурит
пока соберёт
Пушистый, кинь свой счётчик в виде кода
а то переписывать со скрина нету никаких желаний
13
nvc123, я даже сохранил игру с 97 тысячами объектов и загрузил ее. Их количество не захотело уменьшаться после создания новых объектов. Переназначение id не произошло.
nvc123,
globals
    leaderboard udg_HandleBoard = null
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(udg_HandleBoard,0,R2I(result))
endfunction

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

function InitTrig_HandleCounter takes nothing returns nothing
   call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction
28
Пушистый, создал и удалил 100к юнитов
результат счётчика 1100
на всякий случай сообщу что 1100 меньше чем 100к
так же не стоит забывать что вар тупит с большими сериями (если подряд создаётся/удаляется много объектов)
и начинает добавлять после последнего удалённого хэндла хотя предыдущие свободны и не занимают память
при следующей пересборке таблицы это проходит
для того чтобы счётчик адекватно реагировал на это надо чтобы размер серии счётчика был больше чем размер серии создаваемых объектов
я слегка модифицировал твой счётчик
globals
    leaderboard udg_HandleBoard = null
endglobals
define sizehc=300;
function HandleCounter_Update takes nothing returns nothing
   local integer i = 0
   local integer id
   local location array P
   local integer result=0
   local integer min=-1;
   loop
      exitwhen i >= sizehc
      set i = i + 1
      set P[i] = Location(0,0)
      set id = GetHandleId(P[i])
      id-=0x100000
      if(min==-1){
        min=id;
      }
      if(id>result){
        result=id;
      elseif(id<min)
        min=id;
      }
   endloop
   if(result-min>sizehc){
    result=min;
   else
    result-=sizehc
   }
   loop
      call RemoveLocation(P[i])
      set P[i] = null
      exitwhen i <= 1
      set i = i - 1
   endloop
   call LeaderboardSetItemValue(udg_HandleBoard,0,result)
endfunction

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

function InitTrig_HandleCounter takes nothing returns nothing
   call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction
у меня создаётся и удаляется более 2к юнитов сериями по 200
длинна серии счётчика задаётся в sizehc (в моём случае это 300)
вот триггер создания юнитов
function Trigcru takes nothing returns nothing
    local unit u= CreateUnit(Player(0),'hfoo',0,0,0)
    call RemoveUnit(u)
    set u=null
endfunction

function Trigcrul takes nothing returns nothing
    local integer i=0
    loop
        call Trigcru()
        exitwhen i==200
        set i=i+1
    endloop
    
     
endfunction

function Trig___________________________u_Actions takes nothing returns nothing
    local integer i=0
    loop
        call Trigcrul()
        call TriggerSleepAction(0.1)
        call DisplayTextToPlayer(GetLocalPlayer(),0,0,I2S(i))
        exitwhen i==10
        set i=i+1
    endloop
    set i=0
    call DisplayTextToPlayer(GetLocalPlayer(),0,0,"end")
    call TriggerSleepAction(1)
    
endfunction

//===========================================================================
function InitTrig___________________________u takes nothing returns nothing
    set gg_trg___________________________u = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg___________________________u, 2 )
    call TriggerAddAction( gg_trg___________________________u, function Trig___________________________u_Actions )
endfunction
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.