Сейчас 17:53:59 Вторник, 26 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Утечки, нужна помощь в оптимизации
BinGOДата: Вторник, 27 Июля 2010, 07:33:08 | Сообщение # 1
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Code
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 уже просто невозможно.

 

-Arypt-Дата: Вторник, 27 Июля 2010, 10:26:36 | Сообщение # 2
5 уровень
Группа: Заблокированные
Сообщений: 126
Награды: 0
Репутация: 18
Блокировки:
ты не удаляеш локальные переменные, либо это, либо я незнаю :(

Добавлено (27-07-2010, 10:26)
---------------------------------------------
скорее всего локальные, тк у тебя событие с очень малым периодом
если нельзя удалять локальные переменные (если это повредит процессу), то попробуй через присваивание локальных глобальным после дейсвий ,

ну если я в чемто не прав, то я в этом нуб :(


Я могу ошибаться
Но не ошибается, тот, кто ничего не делает

Я стал проверенным, и поставил аватарку^^

 

BinGOДата: Вторник, 27 Июля 2010, 12:32:23 | Сообщение # 3
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Ошибка была довольно глупой. В редакторе объектов в настройках спелла-пустышки "Скорость дистанционной атаки" стояла 0, поэтому и были лаги. Топик можно закрыть/удалить :)
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz