XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Неужели есть утечки?
Сделал способность, вычистил ее до предела.
Начал проверять на утечки c помощью триггера "Handle Debug Test"
В коде присутствует переменная "udg_Handle" - глобалка (для удобства)
Я при каждой проверке, я захожу в карту, смотрю выводящиеся число, выхожу, записываю в переменную, и запускаю карту с кодом выше. Он долже выводить то что и выводит - 0. И так, к делу.
Триггер (на скрине) выводит отрицательные числа, после окончания способности, хотя не должен.
Это значит, что после окончания способности остаются обьекты. (Поправьте меня, могу ошибаться.)
Так где же у меня утечки, собственно?
» Jass
function CrashAttack_HeroSpellRawCode takes nothing returns integer
    return 'A000'
endfunction
function CrashAttack_Damage takes integer lvl, integer str returns real
    return ( lvl * 10. + 10. ) + (  (0.2 * lvl ) * str )
endfunction
function CrashAttack_HeroHandsEffect takes nothing returns string
    return "units\\human\\phoenix\\phoenix.mdl"
endfunction
function CrashAttack_KnockbackEffect takes nothing returns string
    return "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl"
endfunction
function CrashAttack_Hashtable takes nothing returns hashtable
    return udg_Hashtable
endfunction
function CrashAttack_AttackType takes nothing returns attacktype
    return ATTACK_TYPE_MELEE
endfunction
function CrashAttack_DamageType takes nothing returns damagetype
    return DAMAGE_TYPE_NORMAL
endfunction
function CrashAttack_WeaponType takes nothing returns weapontype
    return WEAPON_TYPE_WHOKNOWS
endfunction

// Setup ===========|

function CrashAttack_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == CrashAttack_HeroSpellRawCode()
endfunction

function CrashAttack_OnTimer takes nothing returns nothing
    local hashtable ht = CrashAttack_Hashtable()
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit trg = LoadUnitHandle(ht, id, 0)
    local real kbp = LoadReal(ht, id, 1)
    local real kbrs = LoadReal(ht, id, 2)
    local real a = LoadReal(ht, id, 3)
    local real tx = GetUnitX(trg)
    local real ty = GetUnitY(trg)
    local string e = CrashAttack_KnockbackEffect()
    
    set kbp = kbp - kbrs
    call SaveReal(ht, id, 1, kbp)
    
    if kbp <= 0. then
    call FlushChildHashtable(ht, id)
    call PauseTimer(t)
    call DestroyTimer(t)
    else
    call DestroyEffect(AddSpecialEffectTarget(e, trg, "origin"))
    call SetUnitX(trg, tx + kbp * Cos(a * bj_DEGTORAD))
    call SetUnitY(trg, ty + kbp * Sin(a * bj_DEGTORAD))
    endif
    
    set ht = null
    set t = null
    set trg = null
endfunction

function CrashAttack_Actions takes nothing returns nothing
    local hashtable ht = CrashAttack_Hashtable()
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local unit c = GetTriggerUnit()
    local unit trg = GetSpellTargetUnit()
    local real cx = GetUnitX(c)
    local real cy = GetUnitY(c)
    local real tx = GetUnitX(trg)
    local real ty = GetUnitY(trg)
    local integer abi = CrashAttack_HeroSpellRawCode()
    local integer lvl = GetUnitAbilityLevel(c, abi)
    local integer str = GetHeroStr(c, true)
    local real dmg = CrashAttack_Damage(lvl, str)
    local real kbp = 20.
    local real kbrs = .9
    local attacktype at = CrashAttack_AttackType()
    local damagetype dt = CrashAttack_DamageType()
    local weapontype wt = CrashAttack_WeaponType()
    local string e = CrashAttack_HeroHandsEffect()
    local real period = .03
    local real a = 57.295827 * Atan2(ty-cy, tx-cx)
    
    call UnitDamageTarget(c, trg, dmg, false, false, at, dt, wt)
    
    call DestroyEffect(AddSpecialEffectTarget(e, c, "hand right"))
    call DestroyEffect(AddSpecialEffectTarget(e, c, "hand left"))
    
    call SaveUnitHandle(ht, id, 0, trg)
    call SaveReal(ht, id, 1, kbp)
    call SaveReal(ht, id, 2, kbrs)
    call SaveReal(ht, id, 3, a)
    
    call TimerStart(t, period, true, function CrashAttack_OnTimer)
    
    set ht = null
    set t = null
    set c = null
    set trg = null
    set at = null
    set dt = null
    set wt = null
    set e = ""
endfunction

function CrashAttack_Filter takes nothing returns boolean
    return true
endfunction

function InitTrig_Crash_Attack takes nothing returns nothing
    local integer i = 0
    local filterfunc f = Filter(function CrashAttack_Filter)
    
    set gg_trg_Crash_Attack = CreateTrigger()
    
    loop
    exitwhen i == 16
    call TriggerRegisterPlayerUnitEvent(gg_trg_Crash_Attack, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, f)
    set i = i + 1
    endloop
    
    call TriggerAddCondition(gg_trg_Crash_Attack, Condition(function CrashAttack_Conditions))
    call TriggerAddAction(gg_trg_Crash_Attack, function CrashAttack_Actions)
    
    call Preload(CrashAttack_HeroHandsEffect())
    call Preload(CrashAttack_KnockbackEffect())
    
    call DestroyFilter(f)
    set f = null
endfunction
PS: Если у меня не правильно работает debug триггер, то можете его пожалуста поправить.
Старый 06.12.2009, 04:43
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
"Стринги утечек не вызывают" ©, лол. =)
Старый 06.12.2009, 15:10
YellowStar
poon
offline
Опыт: 15,144
Активность:
Нет смысла обнулять строку, у нее разграничено все - это не хендл.
Старый 06.12.2009, 15:11
XOR

offline
Опыт: 38,159
Активность:
Есть. Читай дополнение от адольфа(если там не ошибка) по идее нул только у хандлов
Старый 06.12.2009, 15:19
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
да блин я не всевидищий. хотяб ссылку дайте)
и давайте точно сейчас определимся до конца, какие типы переменных НЕ нужно обнулять вконце:
local location l = GetUnitLoc(GetTriggerUnit())
call RemoveLocation(l)
set l = null
вот то что сверху не вызывает утечек. локации нужно не только обнулять (приравнивать к null) но и уничтожать, так а у строк что?
Вы же говорите что они вызывают утечки ><
Что с ними делать? Только обнулять?
local string s = "bee !!!"
...
вот то что сверху вызывает утечки?
а то вы все загадками говорите...
вот все типы которые не надо обнулять:
code
player
real
integer
boolean
правильно?
Старый 06.12.2009, 15:27
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
покажи мне строку в моем коде, я не могу найти...))))
Bee добавил:
local string e = CrashAttack_KnockbackEffect()
это чтоли? xO
Bee добавил:
вот почистенный код.
ктонибудь опытный, пробегитесь глазами, чтонибудь сдесь может мешать игровому процессу?
Bee добавил:
function CrashAttack_HeroSpellRawCode takes nothing returns integer
    return 'A000'
endfunction
function CrashAttack_Damage takes integer lvl, integer str returns real
    return ( lvl * 10. + 10. ) + (  (0.2 * lvl ) * str )
endfunction
function CrashAttack_HeroHandsEffect takes nothing returns string
    return "units\\human\\phoenix\\phoenix.mdl"
endfunction
function CrashAttack_KnockbackEffect takes nothing returns string
    return "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl"
endfunction
function CrashAttack_Hashtable takes nothing returns hashtable
    return udg_Hashtable
endfunction
function CrashAttack_AttackType takes nothing returns attacktype
    return ATTACK_TYPE_MELEE
endfunction
function CrashAttack_DamageType takes nothing returns damagetype
    return DAMAGE_TYPE_NORMAL
endfunction
function CrashAttack_WeaponType takes nothing returns weapontype
    return WEAPON_TYPE_WHOKNOWS
endfunction

// Setup ===========|

function CrashAttack_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == CrashAttack_HeroSpellRawCode()
endfunction

function CrashAttack_OnTimer takes nothing returns nothing
    local hashtable ht = CrashAttack_Hashtable()
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit trg = LoadUnitHandle(ht, id, 0)
    local real kbp = LoadReal(ht, id, 1)
    local real kbrs = LoadReal(ht, id, 2)
    local real a = LoadReal(ht, id, 3)
    local real tx = GetUnitX(trg)
    local real ty = GetUnitY(trg)
    local string e = CrashAttack_KnockbackEffect()
    
    set kbp = kbp - kbrs
    call SaveReal(ht, id, 1, kbp)
    
    if kbp <= 0. then
    call FlushChildHashtable(ht, id)
    call PauseTimer(t)
    call DestroyTimer(t)
    else
    call DestroyEffect(AddSpecialEffectTarget(e, trg, "origin"))
    call SetUnitX(trg, tx + kbp * Cos(a * bj_DEGTORAD))
    call SetUnitY(trg, ty + kbp * Sin(a * bj_DEGTORAD))
    endif
    
    set ht = null
    set t = null
    set trg = null
    set e = ""
endfunction

function CrashAttack_Actions takes nothing returns nothing
    local hashtable ht = CrashAttack_Hashtable()
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local unit c = GetTriggerUnit()
    local unit trg = GetSpellTargetUnit()
    local real cx = GetUnitX(c)
    local real cy = GetUnitY(c)
    local real tx = GetUnitX(trg)
    local real ty = GetUnitY(trg)
    local integer abi = CrashAttack_HeroSpellRawCode()
    local integer lvl = GetUnitAbilityLevel(c, abi)
    local integer str = GetHeroStr(c, true)
    local real dmg = CrashAttack_Damage(lvl, str)
    local real kbp = 20.
    local real kbrs = .9
    local attacktype at = CrashAttack_AttackType()
    local damagetype dt = CrashAttack_DamageType()
    local weapontype wt = CrashAttack_WeaponType()
    local string e = CrashAttack_HeroHandsEffect()
    local real period = .03
    local real a = 57.295827 * Atan2(ty-cy, tx-cx)
    
    call UnitDamageTarget(c, trg, dmg, false, false, at, dt, wt)
    
    call DestroyEffect(AddSpecialEffectTarget(e, c, "hand right"))
    call DestroyEffect(AddSpecialEffectTarget(e, c, "hand left"))
    
    call SaveUnitHandle(ht, id, 0, trg)
    call SaveReal(ht, id, 1, kbp)
    call SaveReal(ht, id, 2, kbrs)
    call SaveReal(ht, id, 3, a)
    
    call TimerStart(t, period, true, function CrashAttack_OnTimer)
    
    set ht = null
    set t = null
    set c = null
    set trg = null
    set at = null
    set dt = null
    set wt = null
    set e = ""
endfunction

function CrashAttack_Filter takes nothing returns boolean
    return true
endfunction

function InitTrig_Crash_Attack takes nothing returns nothing
    local integer i = 0
    local filterfunc f = Filter(function CrashAttack_Filter)
    
    set gg_trg_Crash_Attack = CreateTrigger()
    
    loop
    exitwhen i == 16
    call TriggerRegisterPlayerUnitEvent(gg_trg_Crash_Attack, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, f)
    set i = i + 1
    endloop
    
    call TriggerAddCondition(gg_trg_Crash_Attack, Condition(function CrashAttack_Conditions))
    call TriggerAddAction(gg_trg_Crash_Attack, function CrashAttack_Actions)
    
    call Preload(CrashAttack_HeroHandsEffect())
    call Preload(CrashAttack_KnockbackEffect())
    
    call DestroyFilter(f)
    set f = null
endfunction
Bee добавил:
помогите
Старый 06.12.2009, 18:12
ScorpioT1000
Работаем
offline
Опыт: отключен
что это за бред, функции, возвращающие константу? cjass/конст. глобалки не в моде?
ScorpioT1000 добавил:
а для аттак тип энумерации существуют тоже на cjass
ScorpioT1000 добавил:
в целом дебильный хэштейбл, который никто не юзает) если сами не умеете составлять свои бд, юзайте XAT чтоли..
Старый 07.12.2009, 02:58
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
ScorpioT1000, расчитывается на юзера, который не использует JNGP ==> JESP style =)
в целом дебильный хэштейбл, который никто не юзает)
соврал
если сами не умеете составлять свои бд, юзайте XAT чтоли..
что за бд и что за ХАТ? oO
Старый 07.12.2009, 05:54
ScorpioT1000
Работаем
offline
Опыт: отключен
просто составляешь набор массивов и находишь ячейку по handleId. остальные ф-ции хэша не нужны
Старый 07.12.2009, 13:10
XOR

offline
Опыт: 38,159
Активность:
Лол. База данных. XAT
Не надо юзать хэш. Массивы.
Старый 07.12.2009, 14:27
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
так чем вам товарищи хеш не угадил? =)
Старый 08.12.2009, 23:53
ScorpioT1000
Работаем
offline
Опыт: отключен
он совершенно бесполезен в данном случае. это всеравночто когда надо вскипятить воду, ты не включаешь свой чайник, а переливаешь эту воду из своего чайника в чайник соседей, в нем кипятишь, потом обратно переливаешь.
Старый 09.12.2009, 00:33
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
ScorpioT1000:
он совершенно бесполезен в данном случае. это всеравночто когда надо вскипятить воду, ты не включаешь свой чайник, а переливаешь эту воду из своего чайника в чайник соседей, в нем кипятишь, потом обратно переливаешь.
)))
ну просто я все же потом переведу на cJass. если смогу и если буду использовать в своей карте.
меня просто попросили сделать эту способность, но я не очень хочу выкладывать ее, не убедившись в том что она без утечечна и MUI и настраиваема.
MUI - Да
настраиваема - да, JESP, но зато не нужен JNGP которым он пренебрегает...
утечки - ?
вот я и создал темку.
ответьте уважаемый скорп и закройте ее.
Старый 09.12.2009, 00:55
silumin

offline
Опыт: 11,153
Активность:
Bee, я могу ошибаться, т.к. с хеш-таблицами я так и не сдружился, но сохраняя и в последствии загружая данные из ХТ их нужно ещё и удалять. А так как при каждом касте спелла у тебя создаётся новый таймер (через локалку), то имхо хендл ид у него каждый раз разный. Соответсвенно ХТ хранит неудалённые данные со всех прошлых кастов.

п.с. возможно я ошибаюсь.
Старый 09.12.2009, 22:36
Nekit1234007

offline
Опыт: 11,916
Активность:
Цитата:
Сообщение от silumin
п.с. возможно я ошибаюсь.

Да, ошибаешься. Т.к. все данные связанные с таймером стираются call FlushChildHashtable(ht, id) + Хендл ид берётся из ExpiredTimer
Старый 09.12.2009, 22:39
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
видимо код без утечек.
Closed.
Старый 14.12.2009, 01:16
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 06:34.