Тестирую свою карту (которая еще, конечно, не закончена), и вот иногда, чтобы проверить на утечность и другие траблы времени, оставляю ее на произвол и ухожу по делам. Но дважды, что я оставлял на ночь. Она переставала работать нормально ровно через 6000 сек (по таймеру времени карты). Второй раз я лично сам это наблюдал. То есть вначале юниты начинали бегать на месте, через 10 сек они телепортировались, а еще через 2-3 минуты экран в игре зависал, и даже не откликается. В диспетчере задач игра работает и отвечает, ресурсы не жрет чрезмерно. Утечек за все 6000 сек нет, но что не так, я не понимаю. Триггеров и таймеров или чего-то другого именно на 6000 сек - нет.
Есть идеи в чем проблема?

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

Возможно какой-либо переодический таймер на +- 0.7 сек, заполняющий массивы.
Массив в 8192 закончился, и при подборе свободных ячеек каждый раз уходит в бесконечный луп, который выдаёт лаг в 3 сек и обрывается на оп лимите.
Единственная идея, ибо сам сталкивался с этим
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
18
5 лет назад
0
Мб наслоились где-то таймеры, запускающие события. ИИ есть? И вообще, телепаты в отпуске
0
8
5 лет назад
Отредактирован pAxsIs
0
BrEd Pitt:
Мб наслоились где-то таймеры, запускающие события. ИИ есть? И вообще, телепаты в отпуске
Написал же, что утечек нет (таймеры\триггеры не плодятся и не висят). ИИ допотопный в духе беги и сражайся, когда появился. Войска обновляются каждые 30 сек сами, но и умирают в бою. (Можно бесконечно смотреть на эту битву). Юнитов не бывает на карте больше 60 для всех игроков +-100 нейтральные.
0
17
5 лет назад
0
Возможно какой-либо переодический таймер на +- 0.7 сек, заполняющий массивы.
Массив в 8192 закончился, и при подборе свободных ячеек каждый раз уходит в бесконечный луп, который выдаёт лаг в 3 сек и обрывается на оп лимите.
Единственная идея, ибо сам сталкивался с этим
Принятый ответ
0
8
5 лет назад
Отредактирован pAxsIs
0
PyCCKuu_4eJl:
Возможно какой-либо переодический таймер на +- 0.7 сек, заполняющий массивы.
Массив в 8192 закончился, и при подборе свободных ячеек каждый раз уходит в бесконечный луп, который выдаёт лаг в 3 сек и обрывается на оп лимите.
Единственная идея, ибо сам сталкивался с этим
Идея хорошая, но у меня стоит круговой счетчик записи на массивах (их всего парочка), при этом если оставлять карту на произвол (без взаимодействия с игроком), то в них ничего не записывается.
Есть Хэш таблица, с которой работаю относительно недавно, но все FlushChildHashtable() - производятся своевременно в порядке. Счетчик Handler-ов всегда на экране и колеблется от 5000 до 5200 выше и ниже не изменяется.

Золото растет, может это? Сейчас буду тестировать на предел золота.
Есть способности, которые создают триггеры и таймеры, но все это самоуничтожается (имеет таймаут после чего уничтожается), утечек тоже не вызывает, поскольку счетчик Handler-ов всегда колеблется в одном диапазоне. Триггеры удаляю правильно (читал как это делать и смотрел как сделаны в других картах, так что алгоритм верный).
Возможно ли, что даже при том, что триггеры уничтожаются и не висят, есть определенный лимит на создание триггеров на одну карту, даже с учетом уже уничтоженных, которых уже нет.

Золото дошло до 10^6 и все, оно тоже не вызвало такие проблемы (это было очевидно).
0
26
5 лет назад
0
А ты наблюдал баг тоже через 6000 секунд?
Просто у меня недавно тоже что-то странное произошло. Когда варик включён, то ноут не уходит в ждущий режим и всё такое, а тут начал игру, но по какой-то там причине лёг спать, не закончив её, утром ноут типа отключился, а когда включил, то там был варик. Вот гадаю, может Майкрософт что-то в винде обновили, что выключаться с игрой ноут стал, либо какая-то служба корректно не сработала, либо раньше корректно не срабатывала.
Короче, это к тому, что может винда что-то делает через 6000 секунд
0
8
5 лет назад
0
8gabriel8:
А ты наблюдал баг тоже через 6000 секунд?
Да, оба раза именно через этот промежуток времени. На ноуте стоит при работе от сети не уходить в ждущий режим и вообще куда-либо. Хотя при включенном warcraft 3 вообще не вырубается сам.
Просто ведь по сути зависает же не через 6000 сек после включения warcaft 3, а именно на карте. Хотя игра отвечает, то есть нет надписи (Не отвечает). Могу переключать окна на Windows.

Сейчас пока запустил карту в фоновом режиме. 500 секунд никаких подозрений.
(Кстати я был во второй раз за пару минут до 6000 сек и тоже никаких подозрений на лаги.)
0
26
5 лет назад
0
А были случаи, что и через 6000 секунд всё нормально было с картой?
0
8
5 лет назад
0
8gabriel8:
А были случаи, что и через 6000 секунд всё нормально было с картой?
Только 2 раза доходил до такой отметки. Обычно не провожу таких долгих тестов, ибо уже через 5-10 минут понятно есть ли утечки или нет. (По счетчику)
1
26
5 лет назад
1
Рекомендую протестировать на 6000 секунд любую другую карту, если с ней история не повторится, то, пожалуйста, карту в студию.
0
18
5 лет назад
0
Варкрафт же пишет реплей и после каждой игры создает файл LastReplay
Вроде помню что говорилось: типа можно отключать запись реплея и нагрузка на карту/варкрафт уменьшится
А 6000 секунд это 4 с лишним дня)
Вдруг всё таки из за этого

Вот нативка, чтобы отключать запись реплея
native DoNotSaveReplay takes nothing returns nothing
0
26
5 лет назад
0
UrsaBoss, 6000 секунд=100 минут, а не 100 часов.
0
18
5 лет назад
0
8gabriel8:
UrsaBoss, 6000 секунд=100 минут, а не 100 часов.
а, да, перепутал)
0
21
5 лет назад
0
любопытно... просто вспомнилось, что в какой-то игре официально был такой баг, официально пофиксенный патчем: она зависала, если непрерывно работала 2 с половиной недели
О, даже удалось найти!!! Только не две, а три с половиной
И не какой-то, а ВАРКРАФТЕ, лол. Только втором.
www.igromania.ru/article/8934/CD-MANIYa.html поиск по словам "на клики" на странице.
0
8
5 лет назад
0
UrsaBoss:
Вроде помню что говорилось: типа можно отключать запись реплея и нагрузка на карту/варкрафт уменьшится
Всегда отключаю реплей пока делаю карту, только после того, как закончу проверяю работу карты с включенным реплеем. (Сейчас отключен)

Сегодня на ночь ставил и зависло через 12 000 сек. Буду тестить другую карту на подобный баг. Надеюсь это не в моей карте проблема.
0
17
5 лет назад
0
Надеюсь это не в моей карте проблема.
Я бы надеялся на обртаное, ибо свою карту можно исправить, а с багом движка придется жить. Ждем результатов, мне тоже стало интересно.
0
23
5 лет назад
0
не знаю о чем вы но у мя код чисто jass и 2 дня играл со скорость х3 и нормально
0
8
5 лет назад
Отредактирован pAxsIs
0
GetLocalPlayer:
Надеюсь это не в моей карте проблема.
Я бы надеялся на обртаное, ибо свою карту можно исправить, а с багом движка придется жить. Ждем результатов, мне тоже стало интересно.
В общем другие карты не вызывают таких проблем. Отыграл на карте (из XGM - Королевства 2.0) 14 500 сек и ничего подобного не случилось. Хотя на той карте нет динамических юнитов. Все юниты созданы еще в редакторе карт. Динамических триггеров тоже нет. Таймеры не уверен.
У меня есть все динамическое (кроме зданий и боссов). Карта еще далека до выхода, так что не обращайте внимания на всякие погрешности.
Прикрепляю карту (Версия 1.2.4e):

Если кто скачал, отписывайтесь здесь, пожалуйста, чтобы понимать, кто в деле.

Возможно кто-то тоже может оставить карту включенной на 6000 - 12000+ сек на тест, и сказать после о результатах, буду благодарен. Ну или подскажет в чем может быть дело.

UPD: Закинул карту в шапку
Загруженные файлы
0
26
5 лет назад
0
Поставил на тест, но продержался лишь более 2000 секунд, слишком уж ноутбуком надо воспользоваться. Потом как-нибудь оставлю.
0
29
5 лет назад
0
А какая версия warcraft'a нужна? У меня на 1.26a даже не запускается.
0
8
5 лет назад
Отредактирован pAxsIs
0
NazarPunk:
А какая версия warcraft'a нужна? У меня на 1.26a даже не запускается.
pAxsIs:
Прикрепляю карту (Версия 1.2.4e):
Да и в названии файла написал 1.2.4e, будьте внимательнее ;)
1
26
5 лет назад
1
У меня работает на 1.26а. NazarPunk, может из редактора запускал?
0
29
5 лет назад
0
8gabriel8:
У меня работает на 1.26а. NazarPunk, может из редактора запускал?
И из игры тоже, а карта оказывается для 1.2.4e.
А там насколько помню были баги в TriggerAddAction, из-за чего я досих пор в условиях действия пишу.
0
26
5 лет назад
0
Словил этот баг, как и описано, чуть ранее 6000 секунд. Причём понял его так, что часть юнитов триггерно получает приказ Стоп в ответ на другие приказы, а другая часть юнитов просто тупит на базе. Потому предполагаю какой-то косяк в триггерах на создание и движение волн. pAxsIs, ты говорил, что у тебя триггеры создаются, но может есть на них какой лимит. Не пробовал проверять их?
А вообще почему решил плодить триггеры, может саму систему переделать, чтобы использовать переменные по кругу вместо создания триггеров?
0
8
5 лет назад
0
8gabriel8:
pAxsIs, ты говорил, что у тебя триггеры создаются, но может есть на них какой лимит. Не пробовал проверять их?
Могу, конечно, счетчик завести на триггеры, но мне кажется вряд ли есть лимиты на триггеры. Та же дота написана на JASS и у нее каждая способность создает временный триггер. Попробую во всяком случае.
А вообще почему решил плодить триггеры, может саму систему переделать, чтобы использовать переменные по кругу вместо создания триггеров?
Вот пример, как ты представляешь сделать без временного триггера отлов момента удара юнита без создания временного триггера. В момент замаха юнита, на цель создается временный триггер с событием EVENT_UNIT_DAMAGED. Который отлавливает удар, чтобы нанести доп урон.
Альтернативный вариант:
Можно, конечно, написать уже заранее триггер без события и добавлять событие во время замаха. Тогда количество триггеров не изменится, но будут плодиться события, которые нельзя удалить.
Смотреть код
function StunnedSpellDmg_Actions takes unit attacker, unit target, boolean isStunned returns nothing
    if ( !isStunned ) then
        call UnitDamageTarget( attacker, target, ( ( I2R(GetUnitPointValueByType(GetUnitTypeId(attacker))) ) + 1 ), true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS )
    else
        call UnitDamageTarget( attacker, target, ( ( 4.00 * I2R(GetUnitPointValueByType(GetUnitTypeId(attacker))) ) + 1 ), true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS )
    endif
endfunction

function StunnedSpellDmg_Conditions takes nothing returns boolean
    local trigger trg      = GetTriggeringTrigger()
    local integer trgH     = GetHandleId( trg )
    local unit    attacker = LoadUnitHandle( udg_kiwHash, trgH, StringHash("attacker") )
    local unit    target   = LoadUnitHandle( udg_kiwHash, trgH, StringHash("target") )
    local boolean isBuffed = LoadBoolean( udg_kiwHash, trgH, StringHash("isStunned") )
    
    if GetTriggerEventId() == EVENT_UNIT_DAMAGED then
        if GetEventDamageSource() == attacker then
            call DisableTrigger( trg )
            call StunnedSpellDmg_Actions( attacker, target, isBuffed )
            
            call FlushChildHashtable( udg_kiwHash, trgH )
            call DestroyTriggerEx( trg )
        endif
    else
        call FlushChildHashtable( udg_kiwHash, trgH )
        call DestroyTriggerEx( trg )
    endif
    
    set trg      = null
    set attacker = null
    set target   = null
    
    return false
endfunction

function StunnedSpellDmg_EventReg takes nothing returns nothing
    local trigger trg      = CreateTrigger()
    local unit    target   = GetTriggerUnit()
    local unit    attacker = GetAttacker()
    local integer trgH     = GetHandleId( trg )
    local boolean isBuffed = false
    
    if ( GetUnitAbilityLevel( target, 'BPSE') > 0 ) then
        set isBuffed = true
    endif
    
    
    call TriggerRegisterUnitEvent( trg, target, EVENT_UNIT_DAMAGED )
    call TriggerRegisterTimerEvent( trg, 1, false )
    call TriggerAddCondition( trg, Condition( function StunnedSpellDmg_Conditions ) )
    call SaveUnitHandle( udg_kiwHash, trgH, StringHash("attacker"), attacker )
    call SaveUnitHandle( udg_kiwHash, trgH, StringHash("target"), target )
    call SaveBoolean( udg_kiwHash, trgH, StringHash("isStunned"), isBuffed )
    
    set target   = null
    set attacker = null
    set trg      = null
endfunction

function Trig_Stunned_Conditions takes nothing returns boolean
    return ( ( GetUnitTypeId(GetAttacker()) == udg_arrBTypes_Warriors[1] ) or \\
    ( GetUnitTypeId(GetAttacker()) == udg_arrBTypes_Warriors[2] ) or \\
    ( GetUnitTypeId(GetAttacker()) == udg_arrBTypes_Warriors[3] ) or \\
    ( GetUnitTypeId(GetAttacker()) == udg_arrBTypes_Warriors[4] ) or \\
    ( GetUnitTypeId(GetAttacker()) == udg_arrBTypes_Warriors[5] ) )
endfunction

function Trig_Stunned_Actions takes nothing returns nothing
    call StunnedSpellDmg_EventReg()
endfunction

//===========================================================================
function InitTrig_Stunned takes nothing returns nothing
    set gg_trg_Stunned = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Stunned, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Stunned, Condition( function Trig_Stunned_Conditions ) )
    call TriggerAddAction( gg_trg_Stunned, function Trig_Stunned_Actions )
endfunction
NazarPunk:
А там насколько помню были баги в TriggerAddAction, из-за чего я досих пор в условиях действия пишу.
Поподробнее пожалуйста. Что за баги?
0
30
5 лет назад
0
как ты представляешь сделать без временного триггера отлов момента удара юнита без создания временного триггера
Чтобы оставить комментарий, пожалуйста, войдите на сайт.