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

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

Ответ
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Спелл вызывает лаги
» cJass
library FocusPunch initializer Init{
   
   define{
      private sId = 'A006'
      private dId = 'd004'
      private aId = 'S005'
      private bId = 'B002'
      private load = LoadUnitHandle(h,id,1)
   }
   
   private bool Check(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      unit f = GetFilterUnit()
      bool b = IsUnitEnemy(f,GetOwningPlayer(load)) and \
               GetWidgetLife(f)>0.405 and               \
               GetUnitAbilityLevel(f,bId) == 0          ;
      f = null
      t = null
      return b
   }
   
   private void Damage(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      unit u = load
      unit e = GetEnumUnit()
      real damage = GetHeroAgi(u,true)*GetUnitAbilityLevel(u,sId)
      UnitDamage(u,e,damage)
      if GetWidgetLife(e) > 0.405{
         UnitAddAbility(e,aId)
         SetPlayerAbilityAvailable(GetOwningPlayer(e),aId,false)
      }
      e = null
      u = null
      t = null
   }
   
   private bool Check2(){
      return GetUnitAbilityLevel(GetFilterUnit(),bId) > 0
   }
   
   private void DeleteBuff(){
      UnitRemoveAbility(GetEnumUnit(),aId)
   }
   
   private void Buffed(){
      timer t = GetExpiredTimer()
      group g = CreateGroup()
      boolexpr b = Condition(function Check2)
      GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,b)
      ForGroup(g,function DeleteBuff)
      DestroyBoolExpr(b)
      DestroyGroup(g)
      g = null
      b = null
      DestroyTimer(t)
      t = null
   }
   
   private void Destr(){
      KillDestructable(GetEnumDestructable())
   }
   
   private void Dummed(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      int i = LoadInteger(h,id,4)
      unit d = LoadUnitHandle(h,id,2)
      if i < 14{
         real a = LoadReal(h,id,3)
         real x = GetUnitX(d)+50*Cos(a)
         real y = GetUnitY(d)+50*Sin(a)
         rect r = Rect(x-100,y-100,x+100,y+100)
         SetUnitPosition(d,x,y)
         group g = CreateGroup()
         boolexpr b = Condition(function Check)
         EnumDestructablesInRect(r,null,function Destr)
         RemoveRect(r)
         r = null
         GroupEnumUnitsInRange(g,x,y,200,b)
         ForGroup(g,function Damage)
         DestroyBoolExpr(b)
         DestroyGroup(g)
         b = null
         g = null
         i++
         SaveInteger(h,id,4,i)
      }else{
         KillUnit(d)
         RemoveUnit(d)
         FlushChildHashtable(h,id)
         DestroyTimer(t)
         t = CreateTimer()
         TimerStart(t,5.,false,function Buffed)
      }
      d = null
      t = null
   }
   
   private void Effected(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      unit u = load
      real a = LoadReal(h,id,2)
      real x = GetUnitX(u)+100*Cos(a)
      real y = GetUnitY(u)+100*Sin(a)
      DestroyTimer(t)
      PauseUnit(u,false)
      unit d = CreateUnit(GetOwningPlayer(u),dId,x,y,Rad2Deg(a))
      t = CreateTimer()
      id = GetHandleId(t)
      SaveUnitHandle(h,id,1,u)
      SaveUnitHandle(h,id,2,d)
      SaveReal(h,id,3,a)
      SaveInteger(h,id,4,0)
      TimerStart(t,0.04,true,function Dummed)
      d = null
      u = null
      t = null
   }
   
   private void Next(){
      timer t  = GetExpiredTimer()
      int id = GetHandleId(t)
      unit u = load
      real a = LoadReal(h,id,2)
      SetUnitAnimationByIndex(u,3)
      FlushChildHashtable(h,id)
      DestroyTimer(t)
      t = CreateTimer()
      id = GetHandleId(t)
      SaveUnitHandle(h,id,1,u)
      SaveReal(h,id,2,a)
      TimerStart(t,0.75,false,function Effected)
      t = null
      u = null
   }
   
   private void Action(){
      if GetSpellAbilityId() == sId{
      timer t = CreateTimer()
      unit u = GetTriggerUnit()
      int id = GetHandleId(t)
      real a = Atan2(GetSpellTargetY()-GetUnitY(u),GetSpellTargetX()-GetUnitX(u))
      PauseUnit(u,true)
      SetUnitAnimation(u,"ready")
      SaveUnitHandle(h,id,1,u)
      SaveReal(h,id,2,a)
      TimerStart(t,1.4,false,function Next)
      u = null
      t = null
      }
   }
   
   private void Init(){
      trigger t = CreateTrigger()
      MasEvent(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
      TriggerAddAction(t,function Action)
      t = null
   }
}
При частом использовании вызывает глюки,не пойму причину при чём когда проходит пик то есть когда на врагов попадает волна,при попадании даётся баф черег спелбук и ауру внутри,возможно что при добавлении книги вызываются лаги?,проще давать баф через дамми? это позволит не вызывать лаги?,я не думаю что пик в цикле вызывает лаги часто делал спеллы через пик в цикле они не вызывали лаги
Старый 09.03.2012, 02:03
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
Klop, если лагает постоянно то с кодом что то, если единоразого при добавлении книги - то прелоад книгу до юза спелла, к прмиеру при ините мапы
Старый 09.03.2012, 02:09
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Sidhe, прелоад есть
лагать начинает при использовании раза 7 на юнитов 10-15
перед каждым созданием нового таймера после удаления добавил обнуление не помогло
думал вызывает когда на дохлого баф вешается добавил условие не помогло
думал когда бафф снимается в пике на всей карты убирал снятие не помогло
пойду дальше тестить
Старый 09.03.2012, 02:12
Hellfim
Новичок
online
Опыт: 79,707
Активность:
      FlushChildHashtable(h,id)
      DestroyTimer(t)
      t = CreateTimer()
      id = GetHandleId(t)
      SaveUnitHandle(h,id,1,u)
      SaveReal(h,id,2,a)
Это так тупо, что у меня нет слов. Аналогично и далее. Зачем уничтожать таймер, если ты потом его создаешь?
Довольно забавно выглядит то, что ты в другой функции взываешь к GetExpiredTimer(), если много таймеров, в карте, то есть шанс, что она вернет тебе не тот таймер, который ты хочешь, т.к. это уже другая функция.
Старый 09.03.2012, 02:16
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hellfim, я хз почему так делаю)),ща быстро перепишу),и посмотрим что изменится)
» Переписал
library FocusPunch initializer Init{
   
   define{
      private sId = 'A006'
      private dId = 'd004'
      private aId = 'S005'
      private bId = 'B002'
      private load = LoadUnitHandle(h,id,1)
   }
   
   private bool Check(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      unit f = GetFilterUnit()
      bool b = IsUnitEnemy(f,GetOwningPlayer(load)) and \
               GetWidgetLife(f)>0.405 and               \
               GetUnitAbilityLevel(f,bId) == 0          ;
      f = null
      t = null
      return b
   }
   
   private void Damage(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      unit u = load
      unit e = GetEnumUnit()
      real damage = GetHeroAgi(u,true)*GetUnitAbilityLevel(u,sId)
      UnitDamage(u,e,damage)
      if GetWidgetLife(e) > 0.405{
         UnitAddAbility(e,aId)
         SetPlayerAbilityAvailable(GetOwningPlayer(e),aId,false)
      }
      e = null
      u = null
      t = null
   }
   
   private bool Check2(){
      return GetUnitAbilityLevel(GetFilterUnit(),bId) > 0
   }
   
   private void DeleteBuff(){
      UnitRemoveAbility(GetEnumUnit(),aId)
   }
   
   private void Buffed(){
      timer t = GetExpiredTimer()
      group g = CreateGroup()
      boolexpr b = Condition(function Check2)
      GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,b)
      ForGroup(g,function DeleteBuff)
      DestroyBoolExpr(b)
      DestroyGroup(g)
      g = null
      b = null
      DestroyTimer(t)
      t = null
   }
   
   private void Destr(){
      KillDestructable(GetEnumDestructable())
   }
   
   private void Dummed(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      int i = LoadInteger(h,id,4)
      unit d = LoadUnitHandle(h,id,3)
      if i < 14{
         real a = LoadReal(h,id,2)
         real x = GetUnitX(d)+50*Cos(a)
         real y = GetUnitY(d)+50*Sin(a)
         rect r = Rect(x-100,y-100,x+100,y+100)
         SetUnitPosition(d,x,y)
         group g = CreateGroup()
         boolexpr b = Condition(function Check)
         EnumDestructablesInRect(r,null,function Destr)
         RemoveRect(r)
         r = null
         GroupEnumUnitsInRange(g,x,y,200,b)
         ForGroup(g,function Damage)
         DestroyBoolExpr(b)
         DestroyGroup(g)
         b = null
         g = null
         i++
         SaveInteger(h,id,4,i)
      }else{
         KillUnit(d)
         RemoveUnit(d)
         FlushChildHashtable(h,id)
         TimerStart(t,5.,false,function Buffed)
      }
      d = null
      t = null
   }
   
   private void Effected(){
      timer t = GetExpiredTimer()
      int id = GetHandleId(t)
      unit u = load
      real a = LoadReal(h,id,2)
      real x = GetUnitX(u)+100*Cos(a)
      real y = GetUnitY(u)+100*Sin(a)
      PauseUnit(u,false)
      unit d = CreateUnit(GetOwningPlayer(u),dId,x,y,Rad2Deg(a))
      id = GetHandleId(t)
      SaveUnitHandle(h,id,3,d)
      SaveInteger(h,id,4,0)
      TimerStart(t,0.04,true,function Dummed)
      d = null
      u = null
      t = null
   }
   
   private void Next(){
      timer t  = GetExpiredTimer()
      int id = GetHandleId(t)
      unit u = load
      SetUnitAnimationByIndex(u,3)
      TimerStart(t,0.75,false,function Effected)
      t = null
      u = null
   }
   
   private void Action(){
      if GetSpellAbilityId() == sId{
      timer t = CreateTimer()
      unit u = GetTriggerUnit()
      int id = GetHandleId(t)
      real a = Atan2(GetSpellTargetY()-GetUnitY(u),GetSpellTargetX()-GetUnitX(u))
      PauseUnit(u,true)
      SetUnitAnimation(u,"ready")
      SaveUnitHandle(h,id,1,u)
      SaveReal(h,id,2,a)
      TimerStart(t,1.4,false,function Next)
      u = null
      t = null
      }
   }
   
   private void Init(){
      trigger t = CreateTrigger()
      MasEvent(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
      TriggerAddAction(t,function Action)
      t = null
   }
}
Есть куча таймеров даже ежесекундных)
получается избавиться от проблемы можно только глобальным таймером?
Возможно что лаги может вызывать бафф доспехов веры только на себя но их сразу накладывается штук 15 и это приводит к лагам?
значит щас буду пробовать глобавльный таймер,потом заменю наложение баффа

Отредактировано Klop, 09.03.2012 в 02:29.
Старый 09.03.2012, 02:19
Hellfim
Новичок
online
Опыт: 79,707
Активность:
Klop, ну да, или использовать конструкцию
unit f=null
group g=null
...
loop
{
    f=FirstOfGroup(g)
    exitwhen f==null
    //действия над юнитом
    GroupRemoveUnit(f)
}
Хотя такая конструкция многим здесь не нравится, а мне нравится, хз.
Старый 09.03.2012, 02:40
Klop
Папа римский
offline
Опыт: 13,006
Активность:
в общем замена таймера не помогла
замена спелбука на кастующего дамми не помогла
консрукция Hellfim'a не помогла
дейсвия над группой засовывая в комментрий помогает)
Старый 09.03.2012, 03:20
Hellfim
Новичок
online
Опыт: 79,707
Активность:
Klop, в какой комментарий? Ты имеешь в виду, что нашел причину лага, но не можешь её устранить?
Старый 09.03.2012, 03:44
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hellfim,я могу тебе скинуть карту в ЛС,я уже хз что вызывает лаги,просто её применяя чем больше раз тем больше лаги начинаются даже убрав пик и нанесение баффов и дамага прерывая просто циклом,также не используя этот спелл убедился что лагов нет,другие спеллы с длинными таймерами не вызывают лагов или ещё чего
несмотря на другие таймеры и работают нормально,почему именно этот будет конфликтовать я хз)
я щас ещё попробую что нить в коменты позасовывать и опередлить что лаги вызывает,если не получится скину карту в ЛС,там секретная инфа,нельзя публично),и посмотри почему именно этот спелл вызывает лаги ведь утечек та нету,другие работают и всё нормально)
Klop добавил:
Проблема решилась скажу как,будет просто смешно
удалил спелл A006 сделанный на основе Волна силы,и создал A006 на основе Девятый вал и не каких проблем в коде не оказалось,хотя я весь код перерыл)
Старый 09.03.2012, 04:22
Hellfim
Новичок
online
Опыт: 79,707
Активность:
Klop, :facepalm:
Скилы, деформирующие землю вызывают лаги. Удар грома тоже пролагивает, вроде больше нету. Если в других местах с GetExpiredTimer не возникает ошибок, то это хорошо, но я бы посоветовал использовать конструкцию/глобалку, т.к. так логически правильнее.
Старый 09.03.2012, 04:30
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hellfim, и твой пост насчёт зачем таймер дестроить и потом снова создавать это была увереность что данные запишутся куда надо)
Старый 09.03.2012, 04:31
Msey
????
offline
Опыт: 67,346
Активность:
Hellfim:
Скилы, деформирующие землю вызывают лаги
У тоадкопа в стоункрашере ничего не лагало и деформация ланда была ого-го.
klop
Если пользуешься сиджассом - пиши флуш локалс, он нормально работает (то, чем пользуюсь я)
Старый 09.03.2012, 16:03
Hellfim
Новичок
online
Опыт: 79,707
Активность:
Msey, потому что тс триггерно вызывал деформацию, а не через волну сили, или удар грома, насколько я помню.
Старый 09.03.2012, 17:00
adic3x

offline
Опыт: 108,439
Активность:
Если пользуешься сиджассом - пиши флуш локалс, он нормально работает (то, чем пользуюсь я)
В последней бете есть флаг, можно вообще ничего не писать. И еще много вкусностей типа callback'ов, цикла по группам и анонимных функций.
Карту могу глянуть, т.к. лагать по сути нечему.
Клоп, ведь это ты? У тебя в профиле ася актуальная?
Старый 09.03.2012, 22:10
Ответ

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

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

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

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



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