У меня карта с множеством волн, проблема складывается из за утечки, которая появляется во время их долгого спавна где то на 50 мин игры. Уже и пробовал вынести локации отдельно в глобальне для уменьшения утечек, но все же текут именно Handle созданных юнитов, хотя при их смерти юниты удаляются. Карта делается на Jass. Ставил счетчик и при волнах, было множество утечек Handle. С этими волнами юнитов, возможно хоть как то бороться, знаю если скопировать юнита в редакторе, он будет иметь одинаков handle, такое нельзя как то использовать в карте, что бы для юнитов не создавались новые, переменная у меня одна, для юнитов(глобальная), что бы избежать частого создания, просто обнуляється в конце всех действий.
Или все таки придется усиливать монстров и делать их количество к минимуму, сейчас их не особо много бегает., но теперь начинаю думать и это уменьшить.

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

Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
32
8 лет назад
1
Сударь, а теперь внимательно посмотрите скрин и прочитайте что я там написал...
Trig_Star_Set_Add_Actions не обнулена локалка, кучка бж функций.
0
6
8 лет назад
0
quq_CCCP:
Сударь, а теперь внимательно посмотрите скрин и прочитайте что я там написал...
А теперь возьмите и отключите спавн юнитов и посмотрите на Handle, я пришел с этой проблемой с теми вещами на GUI я еще просто не добрался до тех функций, как следует, конкретно в моем случаи вы мне не подсказываете, а лишь тыкаете на места, про которые суть в этом вопросе и не стояла, здесь мне лишь интересен способ оптимизировать спав и не более.
0
32
8 лет назад
0
так же
function Trig_Star_Set_Jass1_pickup_item_Actions takes nothing returns nothing
local integer array item_check
local unit Star_set_item_unit = GetManipulatingUnit()
local boolean array item_check_status
local integer start = 0
//local string text = "Предмет взят"
    set item_check[0] = 'I00A'
    set item_check[1] = 'I009'
    set item_check[2] = 'I00E'
    set item_check[3] = 'I00B'
    set item_check[4] = 'I00D'
    loop
    exitwhen ((start > bj_MAX_INVENTORY) or ((item_check_status[0] == true) and (item_check_status[1] == true) and (item_check_status[2] == true) and (item_check_status[3] == true) and (item_check_status[4] == true)))
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[0] ) then
    set item_check_status[0] = true
  //  call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[1] ) then
    set item_check_status[1] = true
//    call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[2] ) then
    set item_check_status[2] = true
//    call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[3]) then
    set item_check_status[3] = true
 //   call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[4] ) then
    set item_check_status[4] = true
 //   call DisplayTextToForce( GetPlayersAll(), text )
    endif
    set start = start + 1
    endloop
    if ((item_check_status[0] == true) and (item_check_status[1] == true) and (item_check_status[2] == true) and (item_check_status[3] == true) and (item_check_status[4] == true)) then
 //   call DisplayTextToForce( GetPlayersAll(), text )
    call TriggerExecute( gg_trg_Star_Set_Add )
    endif
    set Star_set_item_unit = null
endfunction
В этой функции мы сделали локальный массив а обнулять его видимо будут чуваки с форума XGM (массивы переменных, если они созданы локально требуют обнуление, 1 значение 2 байте оперативки, не забываем об этом, не нужно обнулять только базовые типы не массивы.)
0
6
8 лет назад
0
quq_CCCP:
так же
function Trig_Star_Set_Jass1_pickup_item_Actions takes nothing returns nothing
local integer array item_check
local unit Star_set_item_unit = GetManipulatingUnit()
local boolean array item_check_status
local integer start = 0
//local string text = "Предмет взят"
    set item_check[0] = 'I00A'
    set item_check[1] = 'I009'
    set item_check[2] = 'I00E'
    set item_check[3] = 'I00B'
    set item_check[4] = 'I00D'
    loop
    exitwhen ((start > bj_MAX_INVENTORY) or ((item_check_status[0] == true) and (item_check_status[1] == true) and (item_check_status[2] == true) and (item_check_status[3] == true) and (item_check_status[4] == true)))
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[0] ) then
    set item_check_status[0] = true
  //  call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[1] ) then
    set item_check_status[1] = true
//    call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[2] ) then
    set item_check_status[2] = true
//    call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[3]) then
    set item_check_status[3] = true
 //   call DisplayTextToForce( GetPlayersAll(), text )
    endif
    
    if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[4] ) then
    set item_check_status[4] = true
 //   call DisplayTextToForce( GetPlayersAll(), text )
    endif
    set start = start + 1
    endloop
    if ((item_check_status[0] == true) and (item_check_status[1] == true) and (item_check_status[2] == true) and (item_check_status[3] == true) and (item_check_status[4] == true)) then
 //   call DisplayTextToForce( GetPlayersAll(), text )
    call TriggerExecute( gg_trg_Star_Set_Add )
    endif
    set Star_set_item_unit = null
endfunction
В этой функции мы сделали локальный массив а обнулять его видимо будут чуваки с форума XGM (массивы переменных, если они созданы локально требуют обнуление, 1 значение 2 байте оперативки, не забываем об этом, не нужно обнулять только базовые типы не массивы.)
Серьезно integer вы советуете обнулять или может boolean который по сути 1 байт (0 или 1) ?
0
32
8 лет назад
0
Дикая смешь простого jassа с cjass (не пишите так, потом будет плохо - я вас предупредил)
Как оно выглядит у тебя, переменные мы объявляем где хотим а не вначале...
 call SetUnitInvulnerable( gg_unit_ubon_0063, true )
    call SetUnitInvulnerable( gg_unit_ubon_0115, true )
    call SetUnitInvulnerable( gg_unit_ubon_0120, true )
    call SetUnitInvulnerable( gg_unit_ubon_0126, true )
    call SetUnitInvulnerable( gg_unit_ubon_0131, true )
    call SetUnitInvulnerable( gg_unit_ubon_0177, true )
    call SetUnitInvulnerable( gg_unit_ubon_0176, true )
    call SetUnitInvulnerable( gg_unit_ubon_0175, true )
    call SetUnitInvulnerable( gg_unit_ubon_0174, true )
    call SetUnitInvulnerable( gg_unit_ubon_0173, true )
    call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 45.00, "TRIGSTR_1489")
    local integer start = 0
    loop
        call Spawn_Initialization(start)
        set start = start + 1
        exitwhen start > 9
    endloop
    local location SpawnLoc = Location(GetRectCenterX(gg_rct_Start_Sorl), GetRectCenterY(gg_rct_Start_Sorl))
    call PanCameraToTimed(GetLocationX(SpawnLoc), GetLocationY(SpawnLoc), 0)
    call ClearSelection()
    RemoveLocation(SpawnLoc)
    set udg_FlyingSheep = 3
    set udg_FlyingSheepBeginning = true
    call SetTimeOfDayScale(70.00 * 0.01)
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func016002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func017002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func019002 )
    call SetFloatGameState(GAME_STATE_TIME_OF_DAY, bj_MELEE_STARTING_TOD)
    call SetPlayerState( Player(11) , PLAYER_STATE_GIVES_BOUNTY, IntegerTertiaryOp(true, 1, 0))
    call SetPlayerFlagBJ( PLAYER_STATE_GIVES_BOUNTY, true, Player(11) )
    call PlayThematicMusic("Sound\\Music\\mp3Music\\Undead3.mp3")
    call SetSoundVolume(bj_lastPlayedSound, PercentToInt(100.00, 127))
    call TriggerExecute( gg_trg_CreateLeaderBoard )
    set Hash = InitHashtable()
Вот как Adic Helper переделает код
function Trig_Initialization_jass_Actions takes nothing returns nothing
    local location SpawnLoc = null
    local integer start = 0
    call SetUnitInvulnerable( gg_unit_ubon_0063, true )
    call SetUnitInvulnerable( gg_unit_ubon_0115, true )
    call SetUnitInvulnerable( gg_unit_ubon_0120, true )
    call SetUnitInvulnerable( gg_unit_ubon_0126, true )
    call SetUnitInvulnerable( gg_unit_ubon_0131, true )
    call SetUnitInvulnerable( gg_unit_ubon_0177, true )
    call SetUnitInvulnerable( gg_unit_ubon_0176, true )
    call SetUnitInvulnerable( gg_unit_ubon_0175, true )
    call SetUnitInvulnerable( gg_unit_ubon_0174, true )
    call SetUnitInvulnerable( gg_unit_ubon_0173, true )
    call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 45.00, "TRIGSTR_1489")
    loop
        call Spawn_Initialization(start)
        set start = start + 1
        exitwhen start > 9
    endloop
    set SpawnLoc = Location(GetRectCenterX(gg_rct_Start_Sorl), GetRectCenterY(gg_rct_Start_Sorl))
    call PanCameraToTimed(GetLocationX(SpawnLoc), GetLocationY(SpawnLoc), 0)
    call ClearSelection()
    call RemoveLocation(SpawnLoc)
    set udg_FlyingSheep = 3
    set udg_FlyingSheepBeginning = true
    call SetTimeOfDayScale(70.00 * 0.01)
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func016002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func017002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func019002 )
    call SetFloatGameState(GAME_STATE_TIME_OF_DAY, bj_MELEE_STARTING_TOD)
    call SetPlayerState( Player(11) , PLAYER_STATE_GIVES_BOUNTY, IntegerTertiaryOp(true, 1, 0))
    call SetPlayerFlagBJ( PLAYER_STATE_GIVES_BOUNTY, true, Player(11) )
    call PlayThematicMusic("Sound\\Music\\mp3Music\\Undead3.mp3")
    call SetSoundVolume(bj_lastPlayedSound, PercentToInt(100.00, 127))
    call TriggerExecute( gg_trg_CreateLeaderBoard )
    set Hash = InitHashtable()
endfunction
Кстати неужели нельзя было написать так
call PanCameraToTimed( GetRectCenterY(gg_rct_Start_Sorl), GetRectCenterX(gg_rct_Start_Sorl), 0)
В 1 сточку и не надо даже никаких переменных, которые ты все равно не обнуляешь и ловишь утечки.
0
6
8 лет назад
Отредактирован FlyTab
0
quq_CCCP:
Дикая смешь простого jassа с cjass (не пишите так, потом будет плохо - я вас предупредил)
Как оно выглядит у тебя, переменные мы объявляем где хотим а не вначале...
 call SetUnitInvulnerable( gg_unit_ubon_0063, true )
    call SetUnitInvulnerable( gg_unit_ubon_0115, true )
    call SetUnitInvulnerable( gg_unit_ubon_0120, true )
    call SetUnitInvulnerable( gg_unit_ubon_0126, true )
    call SetUnitInvulnerable( gg_unit_ubon_0131, true )
    call SetUnitInvulnerable( gg_unit_ubon_0177, true )
    call SetUnitInvulnerable( gg_unit_ubon_0176, true )
    call SetUnitInvulnerable( gg_unit_ubon_0175, true )
    call SetUnitInvulnerable( gg_unit_ubon_0174, true )
    call SetUnitInvulnerable( gg_unit_ubon_0173, true )
    call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 45.00, "TRIGSTR_1489")
    local integer start = 0
    loop
        call Spawn_Initialization(start)
        set start = start + 1
        exitwhen start > 9
    endloop
    local location SpawnLoc = Location(GetRectCenterX(gg_rct_Start_Sorl), GetRectCenterY(gg_rct_Start_Sorl))
    call PanCameraToTimed(GetLocationX(SpawnLoc), GetLocationY(SpawnLoc), 0)
    call ClearSelection()
    RemoveLocation(SpawnLoc)
    set udg_FlyingSheep = 3
    set udg_FlyingSheepBeginning = true
    call SetTimeOfDayScale(70.00 * 0.01)
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func016002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func017002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func019002 )
    call SetFloatGameState(GAME_STATE_TIME_OF_DAY, bj_MELEE_STARTING_TOD)
    call SetPlayerState( Player(11) , PLAYER_STATE_GIVES_BOUNTY, IntegerTertiaryOp(true, 1, 0))
    call SetPlayerFlagBJ( PLAYER_STATE_GIVES_BOUNTY, true, Player(11) )
    call PlayThematicMusic("Sound\\Music\\mp3Music\\Undead3.mp3")
    call SetSoundVolume(bj_lastPlayedSound, PercentToInt(100.00, 127))
    call TriggerExecute( gg_trg_CreateLeaderBoard )
    set Hash = InitHashtable()
Вот как Adic Helper переделает код
function Trig_Initialization_jass_Actions takes nothing returns nothing
    local location SpawnLoc = null
    local integer start = 0
    call SetUnitInvulnerable( gg_unit_ubon_0063, true )
    call SetUnitInvulnerable( gg_unit_ubon_0115, true )
    call SetUnitInvulnerable( gg_unit_ubon_0120, true )
    call SetUnitInvulnerable( gg_unit_ubon_0126, true )
    call SetUnitInvulnerable( gg_unit_ubon_0131, true )
    call SetUnitInvulnerable( gg_unit_ubon_0177, true )
    call SetUnitInvulnerable( gg_unit_ubon_0176, true )
    call SetUnitInvulnerable( gg_unit_ubon_0175, true )
    call SetUnitInvulnerable( gg_unit_ubon_0174, true )
    call SetUnitInvulnerable( gg_unit_ubon_0173, true )
    call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 45.00, "TRIGSTR_1489")
    loop
        call Spawn_Initialization(start)
        set start = start + 1
        exitwhen start > 9
    endloop
    set SpawnLoc = Location(GetRectCenterX(gg_rct_Start_Sorl), GetRectCenterY(gg_rct_Start_Sorl))
    call PanCameraToTimed(GetLocationX(SpawnLoc), GetLocationY(SpawnLoc), 0)
    call ClearSelection()
    call RemoveLocation(SpawnLoc)
    set udg_FlyingSheep = 3
    set udg_FlyingSheepBeginning = true
    call SetTimeOfDayScale(70.00 * 0.01)
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func016002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func017002 )
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Initialization_jass_Func019002 )
    call SetFloatGameState(GAME_STATE_TIME_OF_DAY, bj_MELEE_STARTING_TOD)
    call SetPlayerState( Player(11) , PLAYER_STATE_GIVES_BOUNTY, IntegerTertiaryOp(true, 1, 0))
    call SetPlayerFlagBJ( PLAYER_STATE_GIVES_BOUNTY, true, Player(11) )
    call PlayThematicMusic("Sound\\Music\\mp3Music\\Undead3.mp3")
    call SetSoundVolume(bj_lastPlayedSound, PercentToInt(100.00, 127))
    call TriggerExecute( gg_trg_CreateLeaderBoard )
    set Hash = InitHashtable()
endfunction
Кстати неужели нельзя было написать так
call PanCameraToTimed( GetRectCenterY(gg_rct_Start_Sorl), GetRectCenterX(gg_rct_Start_Sorl), 0)
В 1 сточку и не надо даже никаких переменных, которые ты все равно не обнуляешь и ловишь утечки.
Я в курсе как компилятор переделывает код и как переносит, так удобно понимать, а сам принцип я и так знаю.
Цитирую себя опять "Как бороться с утечкой Handle при волнах", эти ответы можно приравнять к оффтопу, мне интересен только этот момент, он ведет к огромным утечкам, остальные я рано или поздно исправлю.
0
32
8 лет назад
0
Ну про волы поподробнее, то у вас там не все так уж явно, с верху вниз пробежался и глянул, еще у вас походу крипы спаунятся постоянно?
0
6
8 лет назад
Отредактирован FlyTab
0
quq_CCCP:
Ну про волы поподробнее, то у вас там не все так уж явно, с верху вниз пробежался и глянул, еще у вас походу крипы спаунятся постоянно?
В зависимости от того сколько разрушенных костяных заводов, сначала 3 раза переключаються, отключая предыдущий спавн, а последний добавляется, дополнительно к предпоследнему. На центре когда атакуешь баззу отключаются пред последние и включается центральный финальный, последние с големами остаются. Функция в первом триггере. Переключения в SwitchAttacker, пока там не было никаких правок.
0
32
8 лет назад
0
Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
Принятый ответ
0
20
8 лет назад
0
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
Мм... Дай сабж с такой инфой почитать.
0
32
8 лет назад
0
Diaboliko:
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
Мм... Дай сабж с такой инфой почитать.
У говорящего с думами вызови волка и убей, кости останутся ? (нет, вызванные не разлагаются а сразу каюк, без кишков и крови)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.