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

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

Закрытая тема
 
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Утечки от группы
Вызывает ли функция "Pick Every Unit In Unit Group" утечки? а то непойму где у меня утечки... делал на ГУИ, но обнулял переменные.




Отредактировано Ninbous, 18.05.2009 в 20:22.
Старый 18.05.2009, 20:16
dave_wwid

offline
Опыт: 12,954
Активность:
Вызывает. Пикнутые враги героя должны по идее давать лаг. Скорее надо писать через локальные переменные. Или добавлять их в группу с переменной(глобальной) и чистить эту группу ИМХО.
Старый 18.05.2009, 20:31
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
dave_wwid Как писать через локальные переменные если все равно придется пикать всех юнитов через Pick Every Unit In Unit Group?
Старый 18.05.2009, 20:53
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Правильней сначало присваивать переменной например "grupp" = юниты в радиусе такомто, после чего пикать юнитов в этой переменной, и после этой функции удалять группу

_ViRus_ добавил:
и еще функция перемещения юнита тоже вызывает утечки
Старый 18.05.2009, 21:21
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
_ViRus_ А у меня перемещяются через SetUnitX/Y читал что ето самая быстрая из всех функций перемещений
Старый 18.05.2009, 23:14
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Ninbous ты создаешь локацию не удаляя её вот тебе и утечка, ту её просто обнуляешь а надо
call RemoveLocation(udg_Point[i])
и вот еще , разве в цикле должен быть integer a не Integer A?
Старый 19.05.2009, 09:22
dave_wwid

offline
Опыт: 12,954
Активность:
Цитата:
Как писать через локальные переменные если все равно придется пикать всех юнитов через Pick Every Unit In Unit Group?

Имелась в виду локальная группа. И в твоей системе это не прокатит. Обьявление переменной, добавление в группу действия и очиста группы должны быть в одном триггере при локалках. А ответ подробный имхо уже дали и _Virus_ по группе и ELDAR по удалению локации.
Старый 19.05.2009, 13:56
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
ELDAR Спасибо, чето я забыл удалять точки, integer это глобаляная переменная.

Можно код пример чтобы он прокатил?

Ninbous добавил:
Код:
function Trig_Black_Hole_Move_1_Actions takes nothing returns nothing
    local group g = null
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = udg_integer
    set g = GetUnitsInRangeOfLocAll (900.00, udg_Point[udg_integer])
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        //call ForGroupBJ( g, function ???????? )
        call SetUnitPathing( GetEnumUnit(), false )
        call SetUnitPositionLoc( GetEnumUnit(), Location(( GetLocationX(GetUnitLoc(GetEnumUnit())) + ( CosBJ(AngleBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_Point[udg_integer])) * ( DistanceBetweenPoints(udg_Point[udg_integer], GetUnitLoc(GetEnumUnit())) / 100.00 ) ) ), ( GetLocationY(GetUnitLoc(GetEnumUnit())) + ( SinBJ(AngleBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_Point[udg_integer])) * ( DistanceBetweenPoints(udg_Point[udg_integer], GetUnitLoc(GetEnumUnit())) / 100.00 ) ) )) )
        call SetUnitPathing( GetEnumUnit(), true )
       //call ForGroupBJ( GetUnitsInRangeOfLocAll(900.00, udg_Point[udg_integer]), function Trig_Black_Hole_Move_1_Func001Func001A )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    call DestroyGroup (g)
endfunction


Вот я перевел в жасс и соединил 2 функции в одну, создал локальную группу заносил в нее юнитов, но GetEnumUnit() неработает, как мне взять пикнутых юнитов в группе?
Старый 19.05.2009, 20:43
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
local group g = null

false, local group g = CreateGroup()
а в конце
call DestroyGroup(g)
set g = null
и перелобай весь код в человеческий
Старый 20.05.2009, 09:35
dave_wwid

offline
Опыт: 12,954
Активность:
Цитата:
set g = null

Почему не просто call DestroyGroup?
Старый 20.05.2009, 15:37
SRes
1110101000
offline
Опыт: 9,997
Активность:
Ссылка на группу в памяти остается, если не обнулить, а это == утечка.
Старый 20.05.2009, 15:45
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
А можно вместо
Код:
exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
поставить сразу?
Код:
exitwhen 1 > udg_integer


И еще сделал как сказал ELDAR все равно юниты не пикаются и не мувятся, мб GetEnumUnit() неработает? как мне из группы g пикнуть каждого юнита и мувить его?
Старый 20.05.2009, 17:06
alexkill

offline
Опыт: 18,872
Активность:
Ninbous
потому что обратиться к GetEnumUnit() можно только в callback-функции
Код:
сall ForGroup( g, function Callback )


в целом реализация спелла сделана неправильно. двигать боевых единиц нужно при помощи перидиоческого таймера с интервалом в 0,05 сек (как я понял из первого поста), а не в цикле, как реализовано у тебя в коде.
Старый 20.05.2009, 17:14
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Вот код тригера который мувит юнитов, всё еще есть утечки.
Код:
function Trig_Black_Hole_Move_1_Func001Func001Func001C takes nothing returns boolean
    if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(gg_unit_Hblm_0007)) == true ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
        return false
    endif
    return true
endfunction

function Trig_Black_Hole_Move_1_Func001Func001A takes nothing returns nothing
    if ( Trig_Black_Hole_Move_1_Func001Func001Func001C() ) then
        call SetUnitPathing( GetEnumUnit(), false )
        call SetUnitPositionLoc( GetEnumUnit(), Location(( GetLocationX(GetUnitLoc(GetEnumUnit())) + ( CosBJ(AngleBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_Point[udg_integer])) * ( DistanceBetweenPoints(udg_Point[udg_integer], GetUnitLoc(GetEnumUnit())) / 100.00 ) ) ), ( GetLocationY(GetUnitLoc(GetEnumUnit())) + ( SinBJ(AngleBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_Point[udg_integer])) * ( DistanceBetweenPoints(udg_Point[udg_integer], GetUnitLoc(GetEnumUnit())) / 100.00 ) ) )) )
        call SetUnitPathing( GetEnumUnit(), true )
    else
    endif
endfunction

function Trig_Black_Hole_Move_1_Actions takes nothing returns nothing
    local group g = CreateGroup()
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = udg_integer
    set g = GetUnitsInRangeOfLocAll (900.00, udg_Point[udg_integer])
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call ForGroupBJ( g, function Trig_Black_Hole_Move_1_Func001Func001A )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    call DestroyGroup (g)
    set g = null
endfunction

//===========================================================================
function InitTrig_Black_Hole_Move_1 takes nothing returns nothing
    set gg_trg_Black_Hole_Move_1 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Black_Hole_Move_1, 0.05 )
    call TriggerAddAction( gg_trg_Black_Hole_Move_1, function Trig_Black_Hole_Move_1_Actions )
endfunction


Ninbous добавил:
alexkill сделал через Callback

Ninbous добавил:
Мб нада упростить функцию перемещения?
Старый 20.05.2009, 19:47
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
Код:
function Trig_Black_Hole_Move_1_Func001Func001Func001C takes nothing returns boolean
    if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(gg_unit_Hblm_0007)) == true ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
        return false
    endif
    return true
endfunction


ацтой
Код:
function Trig_Black_Hole_Move_1_Func001Func001Func001C takes nothing returns boolean
return ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(gg_unit_Hblm_0007)) == true ) and ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false )
endfunction
Старый 20.05.2009, 20:00
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
ELDAR Спасиб, а по поводу утечек можеш ченить сказать?

Ninbous добавил:
Код:
function Trig_Black_Hole_Move_1_Func001Func001Func001C takes nothing returns boolean
return ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(gg_unit_Hblm_0007)) == true ) and ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false )
endfunction        

function Trig_Black_Hole_Move_1_Func001Func001A takes nothing returns nothing
     local unit u = GetEnumUnit()
     local location lu = GetUnitLoc(u)
     local real x = GetLocationX(lu)
     local real y = GetLocationY(lu)
    if ( Trig_Black_Hole_Move_1_Func001Func001Func001C() ) then
        call SetUnitPathing( u, false )
        call SetUnitX  (u, ( x + ( CosBJ(AngleBetweenPoints (lu, udg_Point[udg_integer]))) * ( DistanceBetweenPoints(udg_Point[udg_integer], lu) / 100.00 ) ) )
        call SetUnitY  (u, ( y + ( SinBJ(AngleBetweenPoints (lu, udg_Point[udg_integer]))) * ( DistanceBetweenPoints(udg_Point[udg_integer], lu) / 100.00 ) ) )
        call SetUnitPathing( u, true )
        call RemoveLocation (lu)
        set lu = null
        set u = null
    else
    endif
endfunction

function Trig_Black_Hole_Move_1_Actions takes nothing returns nothing
    local group g = CreateGroup()
    local integer i1 = 1
    local integer i2 = udg_integer
    set g = GetUnitsInRangeOfLocAll (900.00, udg_Point[udg_integer])
    loop
        exitwhen i1 > i2
        call ForGroupBJ( g, function Trig_Black_Hole_Move_1_Func001Func001A )
        set i1 = i1 + 1
    endloop
    call DestroyGroup (g)
    set g = null
endfunction

//===========================================================================
function InitTrig_Black_Hole_Move_1 takes nothing returns nothing
    set gg_trg_Black_Hole_Move_1 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Black_Hole_Move_1, 0.05 )
    call TriggerAddAction( gg_trg_Black_Hole_Move_1, function Trig_Black_Hole_Move_1_Actions )
endfunction


Вот еще немного оптимизировал, утечек стало меньше намного, но все равно они есть, кто еще ченить ожет подсказать?

Jon подскажи ченить плз =)
Старый 20.05.2009, 21:52
Freezen
Тут должен быть бред
offline
Опыт: 2,517
Активность:
Ninbous
Обнуления ставь в конце, после endifa
Старый 20.05.2009, 22:49
SRes
1110101000
offline
Опыт: 9,997
Активность:
WildFreezen правильно сказал, у тебя обнуление идет только при условии, а должно всегда независимо от чего-либо. А больше утечек нету.
Старый 21.05.2009, 10:25
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
SResFreezen Поставил обнуление
Спасибо всем, вроде норм, лаги все равно есть, но уже не такие как были.

Ninbous добавил:
А и еще один вопрос: Нада обнулять GetEnumUnit ()?
Старый 21.05.2009, 15:27
alexkill

offline
Опыт: 18,872
Активность:
вот как нужно было делать (шаблон, скажем так)
» раскрыть
Код:
library BH initializer Init

globals
  private unit u = null
  private trigger tr = CreateTrigger()
  private group g = CreateGroup()
  private location loc = Location(0,0)
  private timer end = CreateTimer()
  private timer t = CreateTimer()
  private filterfunc ff = null
endglobals

function Angle takes real AX, real AY, real BX, real BY returns real
  return Atan2(BY-AY, BX-AX)*57.2958
endfunction 

function Distance takes real AX, real AY, real BX, real BY returns real
  local real dx = BX - AX
  local real dy = BY - AY
  return SquareRoot(dx * dx + dy * dy)
endfunction

private function Ends takes nothing returns nothing
    call PauseTimer(t)
endfunction

private function Filt takes nothing returns boolean
   local unit f = GetFilterUnit()
   local real angle = Angle(GetUnitX(f), GetUnitY(f), GetLocationX(loc), GetLocationY(loc))
   local real dist = Distance(GetUnitX(f), GetUnitY(f), GetLocationX(loc), GetLocationY(loc))/50
     if IsUnitEnemy(f, GetOwningPlayer(u)) and not IsUnitType(f, UNIT_TYPE_STRUCTURE) then
        call SetUnitPathing(f, false)
        call SetUnitPosition(f, GetUnitX(f)+dist*Cos(angle), GetUnitY(f)+dist*Sin(angle))
        call SetUnitPathing(f, true)
     endif     
   set f = null  
   return false
endfunction

private function Go takes nothing returns nothing
    set ff = Filter(function Filt)
    call GroupEnumUnitsInRange(g,GetLocationX(loc), GetLocationY(loc), 900, ff)
endfunction

private function Actions takes nothing returns nothing
   if GetSpellAbilityId() == 'AHbn'  then
     set u = GetTriggerUnit()
     set loc = GetSpellTargetLoc() 
     call TimerStart(t,0.05, true, function Go)
     call TimerStart(end,6, false, function Ends)
   endif  
endfunction
//===========================================================================
private function Init takes nothing returns nothing
    call TriggerRegisterAnyUnitEventBJ( tr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( tr, function Actions )
endfunction

endlibrary

чтоб я доделал до конца, пусть автор скажет, когда нужно паузить таймер

Отредактировано alexkill, 21.05.2009 в 16:22.
Старый 21.05.2009, 15:31
Закрытая тема

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

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

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

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



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