Добавлен Пушистый
Приветствую знающих. Столкнулся с весьма интересным в Варе явлением. Решил воспользоваться счетчиком handle'ов для проверки созданных мной заклинаний на карте. Понимаю, что данный метод может оказаться необъективным, но все же в этом должно что-то быть, так как основой есть id объекта. У меня игра при очень разных показателей таблицы ведет себя одинаково гладко (производительность остается на одном уровне, что видно по количеству кадров в секунду(хоть и это замерять глупо)). Это происходит после удаления всех объектов, созданных после действия заклинаний. Что при 5 тысячах handle'ов, что при практически 100 тысячах FPS сохраняется в виде 60 кадров (тестировал в Grimoire, в самой игре на 4 кадра выше). Вопрос: почему количество объектов остается на одном уровне, даже после удаления native-функциями или сама наработка со счетчиком необъективна?
Принятый ответ
Пушистый, создал и удалил 100к юнитов
результат счётчика 1100
на всякий случай сообщу что 1100 меньше чем 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)
длинна серии счётчика задаётся в 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. nvc123
хэндлы бывают разными
100к точек это меньше 1 метра
а 100к юнитов это намного больше
gc ведь не сразу их подбирает
пока найдёт
пока покурит
пока соберёт
Пушистый, кинь свой счётчик в виде кода
а то переписывать со скрина нету никаких желаний
Ред. Пушистый
nvc123,
Ред. nvc123
результат счётчика 1100
на всякий случай сообщу что 1100 меньше чем 100к
так же не стоит забывать что вар тупит с большими сериями (если подряд создаётся/удаляется много объектов)
и начинает добавлять после последнего удалённого хэндла хотя предыдущие свободны и не занимают память
при следующей пересборке таблицы это проходит
для того чтобы счётчик адекватно реагировал на это надо чтобы размер серии счётчика был больше чем размер серии создаваемых объектов
длинна серии счётчика задаётся в sizehc (в моём случае это 300)