Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
не стоит тебе думать о таких вещах
ибо плохо получается
во первых в j файле весь код а не только триггеры
во вторых там всё записано в джасс и нету никакого гуи и разделения на триггеры
и в третьих (что самое важное) его можно открыть в БЛОКНОТЕ и заюзать поиск по файлу
Пушистый, создал и удалил 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
Darknessay, ждать (иначе говоря wait или TriggerSleepAction) не может быть меньше чем 0,1 секунды и имеет погрешность в 0,1 секунды
единственный выход это переходить на таймеры
таймеры на гуи нормально не заюзаешь поэтому нужен джасс
если не нравиться то близы с радостью выслушают твои пожелания и включат в следующий патч
Fraps, пофиг какой дебаг
главное чтобы лог десинка был
да нужно играть с людьми
составив лог и зная время десинка мы получаем список функций которые могут приводить к десинку
проанализировав их все мы можем узнать что именно вызвало десинк
кэп подсказывает что проанализировать 10 строк кода найденные с помощью дебага намного проще чем анализировать весь код Fraps, и скинь наконец j файл
Пушистый, сколько времени ждал?
gc ведь не сразу их подбирает
пока найдёт
пока покурит
пока соберёт Пушистый, кинь свой счётчик в виде кода
а то переписывать со скрина нету никаких желаний
если речь про хэндлы то кроме удаления объектов нужно обнулять переменные
хэндлы бывают разными
100к точек это меньше 1 метра
а 100к юнитов это намного больше
Fraps, а как мы должны понять в каком месте десинк?
читать весь код?
а так мы бы просто дебаг сделали и узнали что приводит к десинку
к слову по правилам академии ты сам должен был сделать дебаг и скинуть результаты
и если так хочешь чтобы мы проверили код то кидай не карту а j файл
+ десинк бывает ещё из за кривого ланда и кривых моделей
наличия триггера на получение урона для каждого юнита
так делать нельзя
это же полный бред
просто добавляем событие к уже существующему триггеру вот и всё
нормального сборщика мусора в варе нет и скорее всего не будет(если близы даже рб поленились убрать то о нормальном gc можно забыть)
так же не стоит забывать что сборщик мусора срабатывает не сразу
если мне не изменяет память то save сохраняет объекты и значения переменных
а при загрузке восстанавливает связи (заносит значения в переменные, регистрирует события и прочее)
так что всякий мусор просто не проходит
а вообще лучше забей на это
в варе есть более серьёзные утечки от которых нельзя избавиться
например руны
+ создание и удаление триггеров вредит намного больше чем пара сотен килобайт памяти
да и вряд ли у тебя за игру будет 50к юнитов
событие это 4 байта вроде
50к событий тогда занимают целые 200кб
так что можно особо не волноваться
но вообще если ты удаляешь триггеры значит ты криво написал код
при нормальной архитектуре в этом нету необходимости
molot39, очень очень очень криво и костыльно gabriel_fisher, заводишь логическую переменную (назовём её isItem)
устанавливаем переменную isItem в false(ложь/нет)
циклом перебираешь слоты с 1 по 6
если предмет в слоте "переменная цикла" имеет 2 уровень и не равен подобранному предмету то устанавливаем isItem в true(истина/да)
после цикла идёт условие
если isItem равно true(истина/да) то
выбрасываем подобранный предмет
для того чтобы было муи нужно юзать локалки и джасс
подробнее можно найти там
quq_CCCP, создавать в прелоаде никто и не собирается
сначала считываем данные (своего рода маска) а потом накладываем эту маску на функцию создания триггеров
Кет, это 4 оператора взятых из вджасс и сиджасс
видимо так юные айсфроги называют эти 2 диалекта jass
ответ прост
качаем джнгп последней версии и ЧИТАЕМ МАНУАЛЫ
Clamp, да элементарных знаний о принципе работы программ достаточно чтобы понять что без записей такого не сделать
значит и вопрос надо формулировать иначе
я не утверждаю что автор полный нуб
но не думаю что он знает всё что написано в тех статьях
особенно этих
Clamp, учитывая вопрос автора он "впервые открыл WE"
ну по крайне мере джасс не особо хорошо знает
иначе бы сам нашёл ответ
так что я скинул всё что может понадобиться для того чтобы разобраться в прелоаде
если триггеров много то делать кучу файлов не лучшее решение
лучше 1 файл с загрузочным кодом который бы говорил какие триггеры надо выключать
Denis55, перезапись будет
но из за того что это гуи локалки использовать нельзя (условия это другая функция)
так что выход лишь 1
вместо переменных подставляй сразу значения
или сделай бд всех цен
и вместо того чтобы делать по триггеру на каждый тип юнита сделай 1 триггер который будет брать параметры из бд и проверять хватает ли ресурсов
если хватает то отнимает цену из бд от текущего количества
если нет то пишет что не хватает
вот статья про бд
FlyTab, ему нужно чтобы когда игрок играет первый раз триггер работал
а при втором запуске карты не работал
для этого нужно хранить данные на диске
для одиночной игры это можно сделать через кэш
для мультиплеера с помощью прелоада
и то и то описано в статьях
для того чтобы сделать это придётся прочитать часть 2 раздела и почти половину 1 раздела
это около 30 статей
вот некоторые из них (в порядке возрастания сложности)
» WarCraft 3 / Как ждать меньше 0.10? v2.0
иначе НИКАК
в следующий раз дам бан
» WarCraft 3 / vjass Нужна помощь
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
Ред. nvc123
» WarCraft 3 / Десинхронизация на карте (выложил карту)
ибо плохо получается
во первых в j файле весь код а не только триггеры
во вторых там всё записано в джасс и нету никакого гуи и разделения на триггеры
и в третьих (что самое важное) его можно открыть в БЛОКНОТЕ и заюзать поиск по файлу
Ред. nvc123
» WarCraft 3 / Генерация handle'ов в Warcraft 3
результат счётчика 1100
на всякий случай сообщу что 1100 меньше чем 100к
так же не стоит забывать что вар тупит с большими сериями (если подряд создаётся/удаляется много объектов)
и начинает добавлять после последнего удалённого хэндла хотя предыдущие свободны и не занимают память
при следующей пересборке таблицы это проходит
для того чтобы счётчик адекватно реагировал на это надо чтобы размер серии счётчика был больше чем размер серии создаваемых объектов
длинна серии счётчика задаётся в sizehc (в моём случае это 300)
» WarCraft 3 / Как ждать меньше 0.10?
единственный выход это переходить на таймеры
таймеры на гуи нормально не заюзаешь поэтому нужен джасс
если не нравиться то близы с радостью выслушают твои пожелания и включат в следующий патч
» WarCraft 3 / Ослабление
либо спелы с кучей уровней либо куча спелов
напрямую менять нельзя
» WarCraft 3 / Десинхронизация на карте (выложил карту)
главное чтобы лог десинка был
да нужно играть с людьми
составив лог и зная время десинка мы получаем список функций которые могут приводить к десинку
проанализировав их все мы можем узнать что именно вызвало десинк
кэп подсказывает что проанализировать 10 строк кода найденные с помощью дебага намного проще чем анализировать весь код
Fraps, и скинь наконец j файл
» WarCraft 3 / Генерация handle'ов в Warcraft 3
gc ведь не сразу их подбирает
пока найдёт
пока покурит
пока соберёт
Пушистый, кинь свой счётчик в виде кода
а то переписывать со скрина нету никаких желаний
Ред. nvc123
» WarCraft 3 / Генерация handle'ов в Warcraft 3
хэндлы бывают разными
100к точек это меньше 1 метра
а 100к юнитов это намного больше
» WarCraft 3 / Десинхронизация на карте (выложил карту)
читать весь код?
а так мы бы просто дебаг сделали и узнали что приводит к десинку
к слову по правилам академии ты сам должен был сделать дебаг и скинуть результаты
и если так хочешь чтобы мы проверили код то кидай не карту а j файл
+ десинк бывает ещё из за кривого ланда и кривых моделей
» WarCraft 3 / Освобождается ли память корректно после удаления триггера
это же полный бред
просто добавляем событие к уже существующему триггеру вот и всё
нормального сборщика мусора в варе нет и скорее всего не будет(если близы даже рб поленились убрать то о нормальном gc можно забыть)
так же не стоит забывать что сборщик мусора срабатывает не сразу
если мне не изменяет память то save сохраняет объекты и значения переменных
а при загрузке восстанавливает связи (заносит значения в переменные, регистрирует события и прочее)
так что всякий мусор просто не проходит
а вообще лучше забей на это
в варе есть более серьёзные утечки от которых нельзя избавиться
например руны
+ создание и удаление триггеров вредит намного больше чем пара сотен килобайт памяти
да и вряд ли у тебя за игру будет 50к юнитов
» WarCraft 3 / Точка приложения Аттачмента
Ред. nvc123
» WarCraft 3 / Освобождается ли память корректно после удаления триггера
50к событий тогда занимают целые 200кб
так что можно особо не волноваться
но вообще если ты удаляешь триггеры значит ты криво написал код
при нормальной архитектуре в этом нету необходимости
» WarCraft 3 / Fatal Error при загрузке карты?
» WarCraft 3 / Смена оружия.
gabriel_fisher, заводишь логическую переменную (назовём её isItem)
устанавливаем переменную isItem в false(ложь/нет)
циклом перебираешь слоты с 1 по 6
если предмет в слоте "переменная цикла" имеет 2 уровень и не равен подобранному предмету то устанавливаем isItem в true(истина/да)
после цикла идёт условие
если isItem равно true(истина/да) то
выбрасываем подобранный предмет
для того чтобы было муи нужно юзать локалки и джасс
подробнее можно найти там
» WarCraft 3 / Существует вообще такой способ?
сначала считываем данные (своего рода маска) а потом накладываем эту маску на функцию создания триггеров
Ред. nvc123
» WarCraft 3 / Fatal Error при загрузке карты?
видимо так юные айсфроги называют эти 2 диалекта jass
ответ прост
качаем джнгп последней версии и ЧИТАЕМ МАНУАЛЫ
http://cjass.xgm.guru/manual-ru
» WarCraft 3 / Утечка при вызове функции
» WarCraft 3 / Баланс в карте
вроде ктото ещё кроме него есть
если как я уже писал мне не изменяет память
» WarCraft 3 / Существует вообще такой способ?
значит и вопрос надо формулировать иначе
я не утверждаю что автор полный нуб
но не думаю что он знает всё что написано в тех статьях
особенно этих
https://www.xgm.guru/p/wc3/code-flow-and-data-access
и хорошо если дело ограничится лишь
» WarCraft 3 / Существует вообще такой способ?
» WarCraft 3 / Существует вообще такой способ?
ну по крайне мере джасс не особо хорошо знает
иначе бы сам нашёл ответ
так что я скинул всё что может понадобиться для того чтобы разобраться в прелоаде
если триггеров много то делать кучу файлов не лучшее решение
лучше 1 файл с загрузочным кодом который бы говорил какие триггеры надо выключать
» WarCraft 3 / С глобальными перемеными будет работать или локальные лучше?
но из за того что это гуи локалки использовать нельзя (условия это другая функция)
так что выход лишь 1
вместо переменных подставляй сразу значения
или сделай бд всех цен
и вместо того чтобы делать по триггеру на каждый тип юнита сделай 1 триггер который будет брать параметры из бд и проверять хватает ли ресурсов
если хватает то отнимает цену из бд от текущего количества
если нет то пишет что не хватает
вот статья про бд
» WarCraft 3 / World Editor (вопрос)
если ты не умеешь читать(или писать) это твои и только твои проблемы
Ред. nvc123
» WarCraft 3 / Существует вообще такой способ?
а при втором запуске карты не работал
для этого нужно хранить данные на диске
для одиночной игры это можно сделать через кэш
для мультиплеера с помощью прелоада
и то и то описано в статьях
это около 30 статей
вот некоторые из них (в порядке возрастания сложности)
https://www.xgm.guru/p/wc3/jass_introduction
https://www.xgm.guru/p/wc3/creating_loading_code
https://www.xgm.guru/p/wc3/getlocalplayer
https://www.xgm.guru/p/wc3/code-flow-and-data-access