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

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

Ответ
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Утечки или что-то ,что вызывает лаги
У меня есть герой у него один джазз спелл,но играя этим героем начинаються лаги со временем(у других героев нет),я думаю что это его спелл виноват,кто может подсказать что вызывает лаги в этом коде
Код:
globals
    unit NS_Caster = null
    location NS_Target = null
    unit array NS_Dammy
    integer NS_Dis = 0
    integer NS_Int = 0
    real NS_Face = 0
    location NS_Cast = null
    group NS_Dam = null
endglobals
function NinjaStrike_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A014' ) ) then
        return false
    endif
    return true
endfunction

function NS_Con takes nothing returns boolean
    return GetBooleanAnd( IsUnitAlly(GetFilterUnit(), GetOwningPlayer(NS_Caster)) == false, IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction

function NS_Damage takes nothing returns nothing
    call AddSpecialEffectTargetUnitBJ( "origin", GetEnumUnit(), "Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl" )
    call UnitDamageTargetBJ(NS_Caster, GetEnumUnit(),(11*I2R(GetUnitAbilityLevelSwapped('A014',NS_Caster)) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call DestroyEffect(GetLastCreatedEffectBJ())
endfunction

function NS_Action takes nothing returns nothing
   local integer i = 1
   if NS_Int<NS_Dis then
      call DestroyGroup(NS_Dam)
      set NS_Dammy[NS_Int] = CreateUnitAtLoc(GetLocalPlayer(),'e003',PolarProjectionBJ(NS_Cast,30*NS_Int,NS_F  ace),NS_Face)
      call SetUnitPathing(NS_Dammy[NS_Int],false)
      call SetUnitVertexColor(NS_Dammy[NS_Int],255,255,255,5*NS_Int)
      call RemoveUnit(NS_Dammy[NS_Int-5])
      call SetUnitPathing(NS_Caster,false)
      call ForGroupBJ(GetUnitsInRangeOfLocMatching(200.00, GetUnitLoc(NS_Caster), Condition(function NS_Con)), function NS_Damage)
      set NS_Dam = GetLastCreatedGroup()
      call SetUnitPositionLoc(NS_Caster,PolarProjectionBJ(NS_Cast,30*(NS_Int+1),NS_Face))
      set NS_Int = NS_Int + 1
   else
      call DestroyTimer(GetExpiredTimer())
      call PauseUnitBJ(false,NS_Caster)
      call SetUnitPathing(NS_Caster,true)
      call DestroyGroup(NS_Dam)
      set NS_Caster = null
      set NS_Face = 0
      set NS_Target = null
      set NS_Int = 0
      set NS_Dis = 0
      set NS_Cast = null
      loop
      exitwhen i>NS_Dis
        call RemoveUnit(NS_Dammy[i])
        set i = i + 1
      endloop
   endif
endfunction

function NinjaStrike_Actions takes nothing returns nothing
   local timer t = CreateTimer()
   set NS_Caster = GetSpellAbilityUnit()
   set NS_Face = GetUnitFacing(NS_Caster)
   set NS_Cast = GetUnitLoc(NS_Caster)
   set NS_Target = GetSpellTargetLoc()
   call PauseUnitBJ(true,NS_Caster)
   set NS_Int = 1
   set NS_Dis = R2I(DistanceBetweenPoints(GetUnitLoc(NS_Caster),NS_Target)/30)
   call TimerStart(t,0.02,true,function NS_Action)
endfunction

//===========================================================================
function InitTrig_NinjaStrike takes nothing returns nothing
    set gg_trg_NinjaStrike = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_NinjaStrike, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_NinjaStrike, Condition( function NinjaStrike_Conditions ) )
    call TriggerAddAction( gg_trg_NinjaStrike, function NinjaStrike_Actions )
endfunction
[+] замечание от Hellfim: Тема не в том разделе.
Старый 16.08.2009, 16:00
Daemonik

offline
Опыт: 5,084
Активность:
У тебя куча BJ функций. И код не оптмизирован.
Да и таймер не обнулен. И зачем ты в середине функции дестроишь таймер?
Старый 16.08.2009, 16:03
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Daemonik, у других героев я даже переменные не обнуляю и по 2 спелла -джазз с BJ функциями не обнуляя таймерами они не лагают
Старый 16.08.2009, 16:05
Daemonik

offline
Опыт: 5,084
Активность:
Ну из самого жуткого я вижу PauseUnitBJ и неудаляемую локацию (SetUnitPositionLoc).
Был бы JPNG под рукой я бы оптимизировал как смог.
Может отцы что-нибудь еще найдут.
А еще у тебя периодический таймер с периодом 0.02, во время которго создается не удаляемая локация.
Старый 16.08.2009, 16:10
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Daemonik, PauseUnitBJ заменил на PauseUnit и ForGroupBJ на ForGroup

Mr_KLOP добавил:
Только оно не помогает

Mr_KLOP добавил:
а я понял её надо в переменную заносить и удалять
Старый 16.08.2009, 16:17
Daemonik

offline
Опыт: 5,084
Активность:
Просто не юзать SetUnitPositoinLoc(). Юзай SetUnitPosition().
Старый 16.08.2009, 16:19
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Я некогда не юзал координаты поэтому пользуюсь с локациями,вот вопрос X,Y это равноситьно что (30,FAcing Unit) передвинеться на 30 с поворотом фейса указанного юнита?
Старый 16.08.2009, 16:23
Daemonik

offline
Опыт: 5,084
Активность:
Моя твоя не понимать. На 30 чего? Причем тут X,Y?
А вообще ща в jasscraft'e оптимизирую.
Старый 16.08.2009, 16:28
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Код:
native SetUnitPosition takes unit whichUnit, real newX, real newY returns nothing
Старый 16.08.2009, 16:32
J
expert
offline
Опыт: 48,447
Активность:
что-то вроде... скорее всего есть ашибки, т.к. писал на глаз, но принцип должен быть понятен, если нет то недорос еще
function Vec2Length takes real x, real y returns real
    return SquareRoot(x*x+y*y)
endfunction

globals
    unit NS_Caster = null
    integer NS_Int = 0
    real NS_CastX = 0.0 
    real NS_CastY = 0.0 
    real NS_SpeedX = 0.0 
    real NS_SpeedY = 0.0
    group NS_Dam = CreateGroup()
endglobals

function NinjaStrike_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A014'
endfunction

function NS_Con takes nothing returns boolean
    local unit fu = GetFilterUnit()
    if GetUnitState(fu, UNIT_STATE_LIFE) > 0 and IsUnitEnemy(fu, GetOwningPlayer(NS_Caster)) then
        call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThi​efBlood.mdl", fu, "origin"))
        call UnitDamageTargetBJ(NS_Caster, fu, 11*GetUnitAbilityLevel(NS_Caster, 'A014'), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL)
    endif
    set fu = null
    return false
endfunction 

function NS_Action takes nothing returns nothing
    local unit damy
    if NS_Int > 0 then
        call DestroyGroup(NS_Dam)
        set NS_CastX = NS_CastX + NS_SpeedX
        set NS_CastY = NS_CastY + NS_SpeedY
        set damy = CreateUnit(GetOwningPlayer(NS_Caster),'e003', NS_CastX, NS_CastY, 0)
        //
        // тут вешай на юнита таймер самоуничтожения на треть секунды
        // я наизусть уже не помню функцию
        //
        call SetUnitPathing(damy, false)
        call SetUnitVertexColor(damy, 255, 255, 255, 5*(30-NS_Int))
        call GroupEnumUnitsInRange(NS_Dam, NS_CastX, NS_CastY, 200.0, Condition(function NS_Con)))
        call SetUnitX(NS_Caster, NS_CastX)
        call SetUnitY(NS_Caster, NS_CastY)
        set NS_Int = NS_Int - 1
        set damy = null
    else
        call PauseUnit(NS_Caster, false)
        call DestroyTimer(GetExpiredTimer())
    endif
endfunction

function NinjaStrike_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local real ang
    local real len
    local location target = GetSpellTargetLoc()
    set NS_Caster = GetSpellAbilityUnit()
    set NS_CastX = GetUnitX(NS_Caster)
    set NS_CastY = GetUnitY(NS_Caster)
    set NS_Int = 30
    set len = Vec2Length(GetLocationX(target)-NS_CastX, GetLocationY(target)-NS_CastY)
    set ang = Atan2(GetLocationY(target)-NS_CastY, GetLocationX(target)-NS_CastX)
    set NS_SpeedX = Cos(ang)*len/NS_Int
    set NS_SpeedY = Sin(ang)*len/NS_Int
    call PauseUnit(NS_Caster, true)
    call TimerStart(t, 0.02, true, function NS_Action)
    call RemoveLocation(target)
    set t = null
    set target = null
endfunction

function InitTrig_NinjaStrike takes nothing returns nothing
    set gg_trg_NinjaStrike = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_NinjaStrike, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_NinjaStrike, Condition(function NinjaStrike_Conditions))
    call TriggerAddAction(gg_trg_NinjaStrike, function NinjaStrike_Actions)
endfunction

Отредактировано J, 16.08.2009 в 17:42.
Старый 16.08.2009, 16:44
Klop
Папа римский
offline
Опыт: 13,006
Активность:
убрал я вообще SetUnitPosition засунул в коментарий ,всёравно лаги
Старый 16.08.2009, 16:45
ScorpioT1000
Работаем
offline
Опыт: отключен
Запомни, утечка памяти не вызывает лагов.
Старый 16.08.2009, 16:48
Daemonik

offline
Опыт: 5,084
Активность:
Ну вот попробуй
» Код
globals
    unit NS_Caster = null
    location NS_Target = null
    unit array NS_Dammy
    integer NS_Dis = 0
    integer NS_Int = 0
    real NS_Face = 0
    location NS_Cast = null
    group NS_Dam = null
endglobals
function NinjaStrike_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A014' 
endfunction

function NS_Con takes nothing returns boolean
    return IsUnitAlly(GetFilterUnit() and GetOwningPlayer(NS_Caster)) == false and IsUnitAliveBJ(GetFilterUnit()) == true 
endfunction

function NS_Damage takes nothing returns nothing
    local effect NS_Effect =  AddSpecialEffectTarget( "Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl", GetEnumUnit(), "origin" ) 
    call UnitDamageTarget(NS_Caster, GetEnumUnit(),(11*I2R(GetUnitAbilityLevel(NS_Caster,'A014')) ), true, false,  ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null )
    call DestroyEffect(NS_Effect)
    set NS_Effect = null
endfunction

function NS_Action takes nothing returns nothing
    local group NS_Group = CreateGroup()
    local real NS_x = GetLocationX(NS_Cast) + 30*NS_Int*Cos(Ns_Face*0.0174)
    local real NS_y = GetLocationY(NS_Cast) + 30*NS_Int*Sin(Ns_Face*0.0174)
    local real NS_x1 = GetLocationX(NS_Cast) + 30*(NS_Int + 1)*Cos(Ns_Face*0.0174)
    local real NS_y1 = GetLocationY(NS_Cast) + 30*(NS_Int + 1)*Cos(Ns_Face*0.0174)
    local integer i = 1
    if NS_Int<NS_Dis then
        call DestroyGroup(NS_Dam)
        set NS_Dammy[NS_Int] = CreateUnit( GetLocalPlayer(), 'e003', NS_x, NS_y, NS_Face )
        call SetUnitPathing(NS_Dammy[NS_Int],false)
        call SetUnitVertexColor(NS_Dammy[NS_Int],255,255,255,5*NS_Int)
        call RemoveUnit(NS_Dammy[NS_Int-5])
        call SetUnitPathing(NS_Caster,false)
        call GroupEnumUnitsInRangeOfLoc(NS_Group, GetUnitLoc(NS_Caster), 200, Condition(function NS_Con))
        call ForGroup(NS_Group, function NS_Damage)
        set NS_Dam = NS_Group
        call DestroyGroup(NS_Group)
        call SetUnitPosition(NS_Caster, NS_x1, NS_y1)
        set NS_Int = NS_Int + 1
        set NS_Group = null
    else
        call DestroyTimer(GetExpiredTimer())
        call PauseUnit(NS_Caster, false)
        call SetUnitPathing(NS_Caster,true)
        call DestroyGroup(NS_Dam)
        set NS_Caster = null
        set NS_Face = 0
        set NS_Target = null
        set NS_Int = 0
        set NS_Dis = 0
        set NS_Cast = null
        loop
            exitwhen i>NS_Dis
            call RemoveUnit(NS_Dammy[i])
            set i = i + 1
        endloop
    endif
endfunction

function NinjaStrike_Actions takes nothing returns nothing
    local timer NS_t = CreateTimer()
    local real NS_dx = GetLocationX(GetUnitLoc(NS_Caster)) - GetLocationX(NS_Target)
    local real NS_dy = GetLocationY(GetUnitLoc(NS_Caster)) - GetLocationY(NS_Target)
    set NS_Caster = GetSpellAbilityUnit()
    set NS_Face = GetUnitFacing(NS_Caster)
    set NS_Cast = GetUnitLoc(NS_Caster)
    set NS_Target = GetSpellTargetLoc()
    call PauseUnit(NS_Caster, true)
    set NS_Int = 1
    set NS_Dis = R2I(SquareRoot(NS_dx*NS_dx + NS_dy*NS_dy)/30)
    call TimerStart(t,0.02,true,function NS_Action)
    set NS_t = null
endfunction

//===========================================================================
function InitTrig_NinjaStrike takes nothing returns nothing
    set gg_trg_NinjaStrike = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_NinjaStrike, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_NinjaStrike, Condition( function NinjaStrike_Conditions ) )
    call TriggerAddAction( gg_trg_NinjaStrike, function NinjaStrike_Actions )
endfunction
Старый 16.08.2009, 16:53
J
expert
offline
Опыт: 48,447
Активность:
Daemonik, еще хуже
Старый 16.08.2009, 17:00
Klop
Папа римский
offline
Опыт: 13,006
Активность:
J, твой код ездит в произвольном порядке а не куда указываю я и лагать не перестаёт
Daemonik, в твоём коде вообще не ездит наверно потому что
Код:
call TimerStart(t,0.02,true,function NS_Action)
    set t = null

таймер переодический
насчёт лагов незнаю
Старый 16.08.2009, 17:03
Daemonik

offline
Опыт: 5,084
Активность:
Точно я забыл что он периодический.
Daemonik добавил:
J, Хуче чем твой? Я знаю.
Старый 16.08.2009, 17:06
J
expert
offline
Опыт: 48,447
Активность:
Daemonik, нет, хуже чем мой это очевидно, я имею виду хуже чем у Mr_KLOP
Mr_KLOP, там угол брался не между двумя точками а поворотом юнита, могбы и сам подправить, fixed
Старый 16.08.2009, 17:09
Klop
Папа римский
offline
Опыт: 13,006
Активность:
J, я вторую неделю как пытаюсь с джаззом разобраться)),а вы мне про углы и координаты,квадраты вычисления формулы)

Mr_KLOP добавил:
А больше всего странно почему начинает лагать именно у этого героя и у него только это спелл остальные стандарт(((
Старый 16.08.2009, 17:14
Daemonik

offline
Опыт: 5,084
Активность:
J, Чем хуже?
Сорри за оффтоп, просто хочется узнать.
Старый 16.08.2009, 17:15
J
expert
offline
Опыт: 48,447
Активность:
  1. ты не избавился от точек, а лишь раскрыл функции по работе с точками, что вносит больше неразберихи в код а толку нет
  2. нужно по максимум сократить вычисления в периодическо выполняющемся коде, предвычилять их
  3. замена SetUnitPositionLoc на SetUnitPosition бессмысленна т.к. ты все равно пользуешься точками, да и выйграша в производительности почти не дает
Старый 16.08.2009, 17:20
Ответ

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

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

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

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



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