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

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

Ответ
 
BesitzeRuf

offline
Опыт: 560
Активность:
Утечки
Помогите найти и оптимизировать код
function Psycho_Echo_Actions takes nothing returns nothing
if ( GetSpellAbilityId() == 'A00J' ) then
    unit u = GetTriggerUnit()
    integer max = GetUnitAbilityLevel(u,'A00J')*4
    real pom =GetUnitFacing(u)
    integer i=0
    real angle =0
    unit dummy=null
    
    loop
        exitwhen i>max-1
        set angle =pom +i*(360/max)
        local real x = GetUnitX(u) + 30 * Cos(angle * bj_DEGTORAD)
        local real y = GetUnitY(u) + 30 * Sin(angle* bj_DEGTORAD)
        set dummy =CreateUnit(GetOwningPlayer(u), 'h006', x,y,angle)
        SetUnitFacing(dummy,angle)
        SetUnitAbilityLevel(dummy, 'A00K', GetUnitAbilityLevel(u,'A00J'))
        IssuePointOrder(dummy, "carrionswarm", x + 130 * Cos(angle * bj_DEGTORAD), y + 130 * Sin(angle * bj_DEGTORAD))
        ApplyUnitLife(dummy,0.5)
        
    
        set i= i+1
    endloop
    set u=null
    set  dummy=null
endif

endfunction

//===========================================================================
function InitTrig_Psycho_Echo takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( t, function Psycho_Echo_Actions )
    set t =null
endfunction

Пожалуйста!
Старый 26.05.2010, 13:42
Helpmeplz

offline
Опыт: 11,738
Активность:
а с чего тут должны быть утечки?
ни ни локаций, ни групп, ни спецэффектов ты не используешь
Старый 26.05.2010, 14:28
BesitzeRuf

offline
Опыт: 560
Активность:
а оптимизировать?.... не знаю... но все же.. я его (спелл) кастанул несколько десятков раз сразу (чтоб проверить, уберутся лаги или нет)... так вот по моему немного чего-то там остается....
Старый 26.05.2010, 14:33
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ну BJ нет и тогто что сказал Helpmeplz, тоже в чём проблема или лаги в игре из-за этого?
Старый 26.05.2010, 15:04
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
BesitzeRuf, более чем уверен что лагает не из-за утечки в коде, а из-за эффектов самого спелла.
Старый 26.05.2010, 15:12
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
например если он сделан из волны силы
Старый 26.05.2010, 15:19
BesitzeRuf

offline
Опыт: 560
Активность:
ну, лагать и должно (если кучу раз одновременно скастовать..) но потом игра еще какое-то время тормозит.... потом приходит в себя.. но не до конца.. небольшое дергание остается...
Старый 26.05.2010, 15:33
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
используй условия, а не проверяй ид спела в действиях
а еще лучше делать необходимые операции в функции условия и не использовать действия
Старый 26.05.2010, 15:43
BesitzeRuf

offline
Опыт: 560
Активность:
>>используй условия, а не проверяй ид спела в действиях
>>а еще лучше делать необходимые операции в функции условия и не использовать действия
Вот как раз и надо проверять ид спела в действии (быстрее чем вызов функции+ та же самая проверка)
Старый 26.05.2010, 15:48
krosaf4eg

offline
Опыт: 1,859
Активность:
Небольшое замечание: думаю будет лучше переменную angle сразу умножить на bj_DEGTORAD чтобы потом не делать этого 4 раза.
Старый 26.05.2010, 15:53
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
вот, я сделал пример.
» hide/show
scope CarrionSwarmMass initializer OnInit

integer HeroSpellId = 'A000'
integer DummySpellId = 'A001'
integer DummyUnitId = 'hpea'

function MaxCount takes integer lvl returns integer
    return lvl * 6
endfunction

function OnSpellCast takes nothing returns boolean
    local unit c=GetTriggerUnit()
    local unit dummy
    local player p=GetOwningPlayer(c)
    local real x=GetUnitX(c)
    local real y=GetUnitY(c)
    local integer lvl=GetUnitAbilityLevel(c,HeroSpellId)
    local integer max=12
    local integer i=0
    local real a=0.
    
    if GetSpellAbilityId()==HeroSpellId then
    loop
        set i=i+1
        exitwhen i>max
        set a=i*(360./max)
        set dummy=CreateUnit(p,DummyUnitId,x,y,a)
        call UnitAddAbility(dummy,DummySpellId)
        call SetUnitAbilityLevel(dummy,DummySpellId,lvl)
        call IssuePointOrder(dummy,"carrionswarm",x+50.*Cos(a*bj_DEGTORAD),y+50.*Sin(a*bj_DEGTORAD))
        call UnitApplyTimedLife(dummy,'BTLF',.1)
    endloop
    endif
    
    set c=null
    set dummy=null
    set p=null
    
    return false
endfunction

function OnInit takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( t, Condition(function OnSpellCast) )
    set t =null
endfunction

endscope

Отредактировано bee, 26.05.2010 в 17:03.
Старый 26.05.2010, 16:05
BesitzeRuf

offline
Опыт: 560
Активность:
>>>Небольшое замечание: думаю будет лучше переменную angle сразу умножить на bj_DEGTORAD >чтобы потом не делать этого 4 раза.
Дельно))
BesitzeRuf добавил:
call TriggerAddCondition( t, Condition(function OnSpellCast) )
Вот про это можно поподробнее? почему именно так?
Старый 26.05.2010, 18:09
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
лишний вызов функции, и что-то еще там было. return false - обязательно всегда в таких случаях
Старый 26.05.2010, 18:46
BesitzeRuf

offline
Опыт: 560
Активность:
ну, просто ты вызывает условие, я событие... какая разница? мне просто это не понятно... или все равно где что будет?
Старый 26.05.2010, 21:18
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
неособо
я не видел чтоб кто-нибудь юзал действия таким образом
Старый 26.05.2010, 21:31
ZeToX2007

offline
Опыт: 7,009
Активность:
Цитата:
Сообщение от BesitzeRuf
ну, просто ты вызывает условие, я событие... какая разница? мне просто это не понятно... или все равно где что будет?


То что, у тебя событие будет запускаться всегда при использовании любого спела, а на него затрачиваться больше времяни чем на условие.

Цитата:
Сообщение от bee
используй условия, а не проверяй ид спела в действиях
а еще лучше делать необходимые операции в функции условия и не использовать действия


Лучше в фильтре тогда уж XD.
Старый 26.05.2010, 21:45
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Лучше в фильтре тогда уж XD.
не будет работать, проверяли много раз
Старый 26.05.2010, 21:50
BesitzeRuf

offline
Опыт: 560
Активность:
я просто это в статье (на этом форуме) нашел.. про оптимизацию кода ))
Старый 26.05.2010, 21:54
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
call TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,Condition(function AbilityIdMath))
если ты об этом, то проверь еще раз. джон еще оч. давно об этом говорил, что мол ошибок компиляции нет, но он не работает.
Старый 26.05.2010, 22:44
ZeToX2007

offline
Опыт: 7,009
Активность:
bee, id абилок можно не смотреть. нужно смотреть по текущему приказу. если возвратится true или false, то триггер всё равно запустится.


у меня такой баг был и всё сохранилось и работало:

function tgr takes nothing returns nothing

// мои дейсвия.

endfunction

call TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,Filter (function tgr))

делал это в стандартном we, без проверки ошибок.
Старый 27.05.2010, 13:36
Ответ

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

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

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

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



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