|
|
|
|
[Вопрос] Помогите оптимизировать код
|
|
demon_nrt | Дата: Четверг, 29 Августа 2013, 19:16:57 | Сообщение # 1 |
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
| Я знаю что он плохо написан, но это то что я могу. Я хочу попросить оптимизировать этот код. А то когда используешь способность карта подлагивает, а когда используешь часто, то лаги не проходят. [code=jass] function Trig_Krovavy_reka_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A04U' ) ) then return false endif return true endfunction function Krovavy_reka takes nothing returns nothing local timer Krt = GetExpiredTimer() local integer h = GetHandleId(Krt) local unit Kru = LoadUnitHandle(udg_Hash,h,1) local unit Kru1 = LoadUnitHandle(udg_Hash,h,3) local location Krp1 = GetUnitLoc (Kru1) local real TargX local real TargY local real TargA local real Fr local location Krp = LoadLocationHandle(udg_Hash,h,2) set TargX = GetUnitX(Kru1) set TargY = GetUnitY(Kru1) set Fr = GetUnitFacing(Kru1) set TargA = Fr set TargX = TargX + 50.00 * Cos(TargA * 0.0174532) set TargY = TargY + 50.00 * Sin(TargA * 0.0174532) call SetUnitPosition( Kru1, TargX, TargY) if ( not ( R2I(DistanceBetweenPoints(Krp, Krp1)) >= 1200 ) ) then else call RemoveUnit( Kru1 ) call FlushChildHashtable(udg_Hash,h) call PauseTimer (Krt) call DestroyTimer (Krt) set Krt = null call RemoveLocation (Krp) call RemoveLocation (Krp1) set Krp = null set Krp1 = null set Kru = null set Kru1 = null set TargX = 0.00 set TargY = 0.00 set TargA = 0.00 set Fr = 0.00 endif call RemoveLocation (Krp1) set Krp1 = null endfunction function Krovavy_reka_Actions takes nothing returns nothing local timer Krt = CreateTimer() local integer h = GetHandleId(Krt) local unit Kru = GetSpellAbilityUnit() local integer Kri = 0 local integer Kri1 = 0 local location Krp = GetUnitLoc (Kru) local unit Kru1 local real x=GetWidgetX(Kru) local real y=GetWidgetY(Kru) set Kru1 = CreateUnit( GetOwningPlayer (Kru), 'e00P',x,y,GetUnitFacing(Kru)) call SetUnitAbilityLevelSwapped( 'A04V',Kru1 , GetUnitAbilityLevelSwapped('A04U',Kru) ) call SaveUnitHandle(udg_Hash,h,1,Kru) call SaveLocationHandle(udg_Hash,h,2,Krp) call SaveUnitHandle(udg_Hash,h,3,Kru1) call TimerStart(Krt,0.05,true, function Krovavy_reka ) call PolledWait (1) set Kru1 = null set Kru = null call PolledWait (6) call RemoveLocation (Krp) call PauseTimer (Krt) call DestroyTimer (Krt) set Krt = null call FlushChildHashtable(udg_Hash,h) endfunction
//=========================================================================== function InitTrig_Krovavy_reka takes nothing returns nothing set gg_trg_Krovavy_reka = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Krovavy_reka, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Krovavy_reka, Condition( function Trig_Krovavy_reka_Conditions ) ) call TriggerAddAction( gg_trg_Krovavy_reka, function Krovavy_reka_Actions) endfunction [/code]
|
|
|
|
FEARKILLER | Дата: Пятница, 30 Августа 2013, 04:51:49 | Сообщение # 2 |
6 уровень
Группа: Проверенные
Сообщений: 175
Награды: 0
Репутация: 149
Блокировки:
| Цитата (demon_nrt) Я знаю что он плохо написан Очень. Цитата (demon_nrt) Я хочу попросить оптимизировать этот код. А то когда используешь способность карта подлагивает, а когда используешь часто, то лаги не проходят. Твой побоялся код проверять, но переписанный проверил, лагов нет. Но я не знаю что за абилки у даммика, так что возможно ещё из-за них лагает, если там за основу взяты абилки деформирующие землю, но опять же я не увидел в твоём коде приказы даммику что либо кастовать, но повышение уровня какой-то абилки даммику есть. Одним словом, урон то где? Я не стал особо разбираться с этим, и переписал как было, урон сам прикрутишь.
И ещё, для чего ты это делаешь? Код set TargX = 0.00 set TargY = 0.00 set TargA = 0.00 set Fr = 0.00 Ты логические ещё обнулять не пробовал? Вообщем целочисленные, реальные и логические не требуют обнуления, а также строки, хотя им в отличии от предыдущих типов можно присвоить значение null. Ну и если переменная глобальная, то её тоже обнулять не нужно, потому что ты её перезаписываешь каждый раз и смысл в таком обнулении?
Код function KrovavyRekaLoop takes nothing returns nothing local integer h=GetHandleId(GetExpiredTimer()) local unit u=LoadUnitHandle(udg_Hash,h,1) local unit d=LoadUnitHandle(udg_Hash,h,2) local real a=GetUnitFacing(d) local real x1=LoadReal(udg_Hash,h,3) local real y1=LoadReal(udg_Hash,h,4) local real x2=GetWidgetX(d)+50.*Cos(a*bj_DEGTORAD) local real y2=GetWidgetY(d)+50.*Sin(a*bj_DEGTORAD) call SetUnitX(d,x2) call SetUnitY(d,y2) if SquareRoot((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))>1200. then call RemoveUnit(d) call FlushChildHashtable(udg_Hash,h) call PauseTimer(GetExpiredTimer()) call DestroyTimer(GetExpiredTimer()) endif set u=null set d=null endfunction function KrovavyReka takes unit u,timer t returns nothing local integer h=GetHandleId(t) local real x=GetWidgetX(u) local real y=GetWidgetY(u) local unit d=CreateUnit(GetTriggerPlayer(),'e00P',x,y,GetUnitFacing(u)) call SetUnitAbilityLevel(d,'A04V',GetUnitAbilityLevel(u,'A04U')) call SaveUnitHandle(udg_Hash,h,1,u) call SaveUnitHandle(udg_Hash,h,2,d) call SaveReal(udg_Hash,h,3,x) call SaveReal(udg_Hash,h,4,y) call TimerStart(t,.05,true,function KrovavyRekaLoop) set u=null set d=null set t=null endfunction function KrovavyRekaCond takes nothing returns boolean if GetSpellAbilityId()=='A04U'then call KrovavyReka(GetTriggerUnit(),CreateTimer()) endif return false endfunction function InitTrig_Krovavy_reka takes nothing returns nothing local trigger t=CreateTrigger() local integer i=0 loop call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null) exitwhen i>14 set i=i+1 endloop call TriggerAddCondition(t,Condition(function KrovavyRekaCond)) set t=null endfunction
Делаю из воды вино, хожу по воде...
|
|
|
|
demon_nrt | Дата: Пятница, 30 Августа 2013, 09:05:57 | Сообщение # 3 |
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
| А у дамика встроенная абилка,а урон наноситься волной силы. То есть летит дамик с аурой, а волна силы наносит урон. Просто я боюсь пользоваться pick every unit ибо боюсь что использую ее не правильна и она сильно засоряет память. Добавлено (30 Августа 2013, 08:48:50) --------------------------------------------- Попытался воспроизвести ваш код, но ничего не происходит. Хоть все равкоды совпадают. Добавлено (30 Августа 2013, 09:01:07) --------------------------------------------- Большое спасибо, полностью разобрался. Кстати у меня еще 1 вопрос)) Как сделать так чтобы юнит проходил сквозь юнитов, но не рельеф. И еще 1 вопрос чтобы не создавать миллион тем.
Как точку GetSpellTargetLoc() сделать в виде x,y то есть координат. Добавлено (30 Августа 2013, 09:05:57) ---------------------------------------------
Цитата (FEARKILLER) Твой побоялся код проверять, но переписанный проверил, лагов нет. Но я не знаю что за абилки у даммика, так что возможно ещё из-за них лагает, если там за основу взяты абилки деформирующие землю, но опять же я не увидел в твоём коде приказы даммику что либо кастовать, но повышение уровня какой-то абилки даммику есть. Одним словом, урон то где? Я не стал особо разбираться с этим, и переписал как было, урон сам прикрутишь. А как собственно его прикрутить? Именно в ваш код. Я могу через Pick every unit, но вроде как там нужны точки. Покажите еще с пиком юнитов буду благодарен. А раньше я вместе с этим скилом запускал волну силы, то есть она по тому же пути летела что и наш дамик. Она и наносила урона, но она деформировала землю, может быть и за нее и лагало сильно.
|
|
|
|
SirNikolas | Дата: Пятница, 30 Августа 2013, 10:47:15 | Сообщение # 4 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата (demon_nrt) Как точку GetSpellTargetLoc() сделать в виде x,y GetSpellTargetX/YЦитата (demon_nrt) Я могу через Pick every unit, но вроде как там нужны точки. Отряд, ForGroup, Grouploop. Использовать одну глобальную группу.Добавлено (30 Августа 2013, 10:47:15) --------------------------------------------- P. S. demon_nrt, пиши код в теге code=jass. Он автотабулируется и подсвечивается.
|
|
|
|
FEARKILLER | Дата: Пятница, 30 Августа 2013, 12:37:44 | Сообщение # 5 |
6 уровень
Группа: Проверенные
Сообщений: 175
Награды: 0
Репутация: 149
Блокировки:
| Цитата (demon_nrt) урон наноситься волной силы Боишся пикать юнитов и наносить урон? Тогда замени свою "Волна силы" на "Тёмная стая", точно такая же абилка, но без деформации. Цитата (demon_nrt) может быть и за нее и лагало сильно. Не может, а из-за неё, также все прочие абилки деформирующие рельеф. Цитата (demon_nrt) Как точку GetSpellTargetLoc() сделать в виде x,y то есть координат. Насчёт этого тебе уже подсказали, но я ещё дополню, что есть такой файл в варике как common.j, его извлеки из архивов вара и открой в любом текстовом редакторе, там весь список функций. Вот там можешь поискать похожие, которые работают не с точками, а напрямую с координатами X/Y.
Делаю из воды вино, хожу по воде...
|
|
|
|
demon_nrt | Дата: Пятница, 30 Августа 2013, 16:17:13 | Сообщение # 6 |
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
| Цитата (SirNikolas) GetSpellTargetX/Y А как ею пользоваться? То есть мне нужно создать юнита в этой области GetSpellTargetLoc. А мне нужно через координаты X|Y найти эту точку.
|
|
|
|
DragoN | Дата: Пятница, 30 Августа 2013, 18:01:46 | Сообщение # 7 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Цитата (demon_nrt) А как ею пользоваться? То есть мне нужно создать юнита в этой области GetSpellTargetLoc. А мне нужно через координаты X|Y найти эту точку. real x = GetSpellTargetX() real y = GetSpellTargetY() и при создание через CreateUnit указываешь в координаты создания эти x,y
El Psy Congroo
|
|
|
|
SirNikolas | Дата: Пятница, 30 Августа 2013, 18:18:22 | Сообщение # 8 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| [code=jass]call CreateUnit(GetOwningPlayer(GetTriggerUnit()), 'h000', GetSpellTargetX(), GetSpellTargetY(), .0)[/code]
|
|
|
|
demon_nrt | Дата: Пятница, 30 Августа 2013, 23:03:43 | Сообщение # 9 |
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
| Большое спасибо, очень помогло.
|
|
|
|
|
|
|
|
|
|
|