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

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

Ответ
 
BinGO_rltm

offline
Опыт: 71
Активность:
Утечки, нужна помощь в оптимизации
Код:
function Trig_Pistol_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Trig_Pistol_Check takes nothing returns boolean
    return IsUnitEnemy(GetFilterUnit(), Player(1))
endfunction

function Trig_Pistol_Move takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(udg_HashTable, GetHandleId(t), 1)
    local integer i = LoadInteger(udg_HashTable, GetHandleId(t), 1)
    local unit shooter = LoadUnitHandle(udg_HashTable, GetHandleId(t), 2)
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local real f = GetUnitFacing(u)*.01745
    local group g = CreateGroup()
    local unit target = null
    call SetUnitPosition(u, x+10*Cos(f), y+10*Sin(f))
    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 100, Condition(function Trig_Pistol_Check)) 
    set target = FirstOfGroup(g)
    if target != null then
        call UnitDamageTarget(u, target, 150-udg_Difficulty*5, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)
        call KillUnit(u)
        call PauseTimer(t)
        call DestroyTimer(t)
        call GroupEnumUnitsInRange(g, GetUnitX(target), GetUnitY(target), 200+udg_Difficulty*100, Condition(function Trig_Pistol_Check))
        call GroupPointOrder(g, "attack", GetUnitX(shooter), GetUnitY(shooter))
        call FlushChildHashtable(udg_HashTable, GetHandleId(t))
    endif
    if i == 500 then
        call FlushChildHashtable(udg_HashTable, GetHandleId(t))
        call KillUnit(u)
        call PauseTimer(t)
        call DestroyTimer(t)
    else
        set i = i + 1
        call SaveInteger(udg_HashTable, GetHandleId(t), 1, i)
    endif
    set t = null
    set u = null
    set shooter = null
    set target = null
    call DestroyGroup(g)
    set g = null
endfunction

function Trig_Pistol_Actions takes nothing returns nothing
    local unit u = CreateUnit(GetOwningPlayer(GetSpellAbilityUnit()), 'hdhw', GetUnitX(GetSpellAbilityUnit()), GetUnitY(GetSpellAbilityUnit()), GetUnitFacing(GetSpellAbilityUnit()))
    local timer t = CreateTimer()
    call SaveUnitHandle(udg_HashTable, GetHandleId(t), 1, u)
    call SaveUnitHandle(udg_HashTable, GetHandleId(t), 2, GetSpellAbilityUnit())
    call SaveInteger(udg_HashTable, GetHandleId(t), 1, 1)
    call SetUnitPathing(u, false)
    call TimerStart(t, 0.01, true, function Trig_Pistol_Move)
    set u = null
    set t = null
endfunction

//===========================================================================
function InitTrig_Pistol takes nothing returns nothing
    set gg_trg_Pistol = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Pistol, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Pistol, Condition( function Trig_Pistol_Conditions ) )
    call TriggerAddAction( gg_trg_Pistol, function Trig_Pistol_Actions )
endfunction


Работает исправно, но после каждого применения постепенно прибавляются лаги, в итоге после 15-20 применений играть становится некомфортно, а после 30 уже просто невозможно.
Старый 27.07.2010, 07:29
inhuman89

offline
Опыт: 3,019
Активность:
как мне в свое время подсказали, возможно здесь проблема в настройках спела: там надо поставить "скорость дистанционной атаки" на очень большое число и все будет норм.
Старый 27.07.2010, 08:02
Arty3ooo
...
offline
Опыт: 3,125
Активность:
Какой спел ты взял за основу?
Старый 27.07.2010, 08:33
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
  1. 0.01 - огромная ошибка, минимальный период для спелов - 0.025, лучший 0.035 это и быстрота и производительность
  2. Все добро что ты делаешь с груп энумом - потеря времени
  3. Делается так:
globals
booexpr bx = null
endglobals

function Trig_Pistol_Check
и тут все, нанесение урона итд итп
return false
endfunction

call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 100,bx ) 
...
function InitTrig......
bx = Condition(function Trig_Pistol_Check)
..
  1. Читаем статью RazArt'a по хешу
ошибок море:
call SaveUnitHandle(udg_HashTable, GetHandleId(t), 1, u)
call SaveUnitHandle(udg_HashTable, GetHandleId(t), 2, GetSpellAbilityUnit())
call SaveInteger(udg_HashTable, GetHandleId(t), 1, 1)
2 раза кто в еденицу разное сует то, ячейки разные должны быть
О пункте 3 подробнее можно узнать в разделе академия, используя поиск, где-то пол месяца назад ADOLF объяснял на пальцах, как пользоваться группами

Отредактировано AlexKARASb, 27.07.2010 в 11:43.
Старый 27.07.2010, 10:01
BinGO_rltm

offline
Опыт: 71
Активность:
Цитата:
Сообщение от inhuman89
как мне в свое время подсказали, возможно здесь проблема в настройках спела: там надо поставить "скорость дистанционной атаки" на очень большое число и все будет норм.

Действительно помогло, у меня стояло 0. Спасибо ;)

За основу брал Волну силы.

AlexKARASb, хеш таблица работает очень даже правильно. Хотя сам посмотрел, даже удивился, что функционирует вообще) Или так делать можно?.. Ведь и юнит перемещается, и счетчик идет, все как надо. А по поводу третьего пункта, идея очень даже неплохая, попробую переделать код.
Старый 27.07.2010, 12:44
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
делать можно?..
это защита от крита в последней версии патча, у тебя просто ячейка с интеджером не записывается, сделай ее в 3 и не парься
За основу брал Волну силы.
самый багнутый спел взял тк он деформирует рельеф и при больших использованиях сбоит, лучше темная стая
Старый 27.07.2010, 12:49
EdiTTORR

offline
Опыт: 183
Активность:
BinGO_rltm:
set t = null
(2 раза)
а call DestroyTimer забыл?
ну будет висеть в памяти значит...
BinGO_rltm:
GetSpellAbilityUnit()
GetFilterUnit()
уг все верно... шучу! =)
создаешь хендлы а потом юниты не удалятся полностью при смерти или даже при RemoveUnit
утечка
BinGO_rltm:
GetHandleId(t)
Давай в локалку раз много раз юзаешь(лишние вызовы функции)
Старый 30.07.2010, 19:06
Ответ

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

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

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

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



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