Cawa_rux
offline
Опыт:
48Активность: |
Оптимизация, помогите!)))
Все работает, но тока неделю, как на Джазе) если ошибки?
Способность кидаю баф на юнита +10% хп, когда заканчивается время, юнит умирает или заново наложить баф все работает. есть ошибки оптимизации или что-то лишнее? баф от способности замедления торнадо, активный скил: канал и скил: добавить здоровья 7лвл Ссылка на файл скила » Юнит приводит способность в действия function Buff takes nothing returns nothing local timer t = GetExpiredTimer() local integer a = GetHandleId(t) local unit u = LoadUnitHandle(udg_hash,a,1) local real c = LoadReal(udg_hash,a,2) local integer b = GetHandleId(u) local integer d ='A026' call UnitRemoveBuffBJ( 'B00H', u ) call UnitRemoveAbilityBJ( 'A028', u ) call DestroyTimer(t) call FlushChildHashtable(udg_hash,a) call FlushChildHashtable(udg_hash,b) » IfLoop if c > 0 then loop exitwhen c == 0 call UnitAddAbilityBJ( d, u ) if c >= 100 then set c = c - 100 call SetUnitAbilityLevelSwapped( d, u, 7 ) elseif c >= 10 then set c = c - 10 call SetUnitAbilityLevelSwapped( d, u, 6 ) else set c = c - 1 call SetUnitAbilityLevelSwapped( d, u, 5 ) endif call UnitRemoveAbilityBJ( d, u ) endloop endif set u = null set t = null endfunction function Spell takes nothing returns nothing local unit u = GetSpellTargetUnit() local integer d ='A026' local integer b = GetHandleId(u) local real c = LoadReal(udg_hash,b,2) local timer t = LoadTimerHandle(udg_hash,b,1) local integer a = GetHandleId(t) call UnitRemoveBuffBJ( 'B00H', u ) call UnitRemoveAbilityBJ( 'A028', u ) call DestroyTimer(t) call FlushChildHashtable(udg_hash,a) call FlushChildHashtable(udg_hash,b) » IfLoop if c > 0 then loop exitwhen c == 0 call UnitAddAbilityBJ( d, u ) if c >= 100 then set c = c - 100 call SetUnitAbilityLevelSwapped( d, u, 7 ) elseif c >= 10 then set c = c - 10 call SetUnitAbilityLevelSwapped( d, u, 6 ) else set c = c - 1 call SetUnitAbilityLevelSwapped( d, u, 5 ) endif call UnitRemoveAbilityBJ( d, u ) endloop endif set t = CreateTimer() set a = GetHandleId(t) set c = ( GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u) * ( I2R(GetUnitAbilityLevelSwapped('A027', GetTriggerUnit())) * 0.10 ) ) call SaveUnitHandle(udg_hash,a,1,u) call SaveReal(udg_hash,a,2,c) call SaveTimerHandle(udg_hash,b,1,t) call SaveReal(udg_hash,b,2,c) call UnitAddAbilityBJ( 'A028', u) call TimerStart(t,6,true,function Buff) » IfLoop if c > 0 then loop exitwhen c == 0 call UnitAddAbilityBJ( d, u ) if c >= 100 then set c = c - 100 call SetUnitAbilityLevelSwapped( d, u, 4 ) elseif c >= 10 then set c = c - 10 call SetUnitAbilityLevelSwapped( d, u, 3 ) else set c = c - 1 call SetUnitAbilityLevelSwapped( d, u, 2 ) endif call UnitRemoveAbilityBJ( d, u ) endloop endif set u = null set t = null endfunction » Условия function SpellCond takes nothing returns boolean return GetSpellAbilityId()=='A027' endfunction » События function InitTrig_Skill_25 takes nothing returns nothing set gg_trg_Skill_25 = CreateTrigger() call TriggerRegisterAnyUnitEventBJ( gg_trg_Skill_25, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition(gg_trg_Skill_25,Condition(function SpellCond)) call TriggerAddAction(gg_trg_Skill_25,function Spell) set udg_hash = InitHashtable() endfunction » Юнит умирает » Условия function Trig_Skill25v_Conditions takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A028', GetTriggerUnit()) > 0 ) ) then return false endif return true endfunction function Trig_Skill25v_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local integer d ='A026' local integer b = GetHandleId(u) local real c = LoadReal(udg_hash,b,2) local timer t = LoadTimerHandle(udg_hash,b,1) local integer a = GetHandleId(t) call UnitRemoveBuffBJ( 'B00H', u ) call UnitRemoveAbilityBJ( 'A028', u ) call DestroyTimer(t) call FlushChildHashtable(udg_hash,a) call FlushChildHashtable(udg_hash,b) » IfLoop if c > 0 then loop exitwhen c == 0 call UnitAddAbilityBJ( d, u ) if c >= 100 then set c = c - 100 call SetUnitAbilityLevelSwapped( d, u, 7 ) elseif c >= 10 then set c = c - 10 call SetUnitAbilityLevelSwapped( d, u, 6 ) else set c = c - 1 call SetUnitAbilityLevelSwapped( d, u, 5 ) endif call UnitRemoveAbilityBJ( d, u ) endloop endif endfunction » События function InitTrig_Skill25a takes nothing returns nothing set gg_trg_Skill25a = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Skill25a, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddCondition( gg_trg_Skill25a, Condition( function Trig_Skill25v_Conditions ) ) call TriggerAddAction( gg_trg_Skill25a, function Trig_Skill25v_Actions ) endfunction Отредактировано Cawa_rux, 10.11.2013 в 20:07. |
10.11.2013, 14:42 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Карточка
Kicked by SSrunX
offline
Опыт:
2,017Активность: |
ты давай тэг кода для начала поставь |
10.11.2013, 14:59 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,124Активность: |
вот когда ошибки появятся, тогда и пишите |
10.11.2013, 15:02 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cawa_rux
offline
Опыт:
48Активность: |
Удаляется таймер или его не надо удалять? не могу понять, нечего не меняется, связано это с оптимизацией?)
set udg_hash = InitHashtable() нужно один раз грузить? можно при загрузки карты? или в каждом триггере писать где есть эта глобалка? UnitAddAbilityBJ , без BJ неработает какие переменные надо обнулять? Cawa_rux добавил: » из Code1 function Spell takes nothing returns nothing local unit u = GetSpellTargetUnit() local integer d ='A026' local integer b = GetHandleId(u) local real c = LoadReal(udg_hash,b,2) local timer t = LoadTimerHandle(udg_hash,b,1) local integer a = GetHandleId(t) call UnitRemoveBuffBJ( 'B00H', u ) call UnitRemoveAbilityBJ( 'A028', u ) call DestroyTimer(t) call FlushChildHashtable(udg_hash,a) call FlushChildHashtable(udg_hash,b) Нужно ли грузить, чтобы удалить:call DestroyTimer(t), ИЗ local timer t = LoadTimerHandle(udg_hash,b,1) или не надо удалять таймер, он обновится? set t = CreateTimer()? Cawa_rux добавил: Использовал ячейки хеш таблицы по id юнита и таймера, правельно ли использовать сразу 2 варианта? достовая id юнита из хеш с id таймера и наоборот. Отредактировано Cawa_rux, 10.11.2013 в 15:59. |
10.11.2013, 16:27 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Карточка
Kicked by SSrunX
offline
Опыт:
2,017Активность: |
1 раз в начале игры
твой таймер удалять надо, т.к. ты его создаёшь, значит и удаляй
тэг кода не тот, это спойлер у тебя
хранить всю шнягу можно только по таймеру. в том числе юнита и любое что вообще есть. |
10.11.2013, 16:27 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
для большей читабельности кода надо убрать пробелы и переносы строк, и катов побольше добавьте. |
10.11.2013, 16:38 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cawa_rux
offline
Опыт:
48Активность: |
Спс большое. Так при смерти юнита баф должен удалятся, вот и присвоил id юнита в хеш, можно ли сделать по другому? при смерти гружу хеш таб, делаю что надо и удоляю хеш таб с Id таймера и юнита, гружу и удаляю таймер. А если скил закончелся по времени то, без загрузки хеш таб с id юнита удаляю: два варианта
Cawa_rux добавил: » строка можно без скобок или меньше сделать?set c = ( GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u) * ( I2R(GetUnitAbilityLevelSwapped('A027', GetTriggerUnit())) * 0.10 ) ) » Cod if ( not ( GetUnitAbilityLevelSwapped('A028', GetTriggerUnit()) > 0 ) ) then return false endif return true endfunction Убрать лишнее, чтобы работало) пример: » строка так красиво, а то у меня не получилось)return GetSpellAbilityId()=='A027' endfunction Cawa_rux добавил: В триггере можно менять местами строчки кода типа: условия, действия?) Cawa_rux добавил: Что лучше запиливать все данные в хеш таблицу или создать переменную глобал интегер? Отредактировано Cawa_rux, 10.11.2013 в 17:16. |
10.11.2013, 18:26 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
запилите лучше автоматический сборщик мусора и откажитесь от локалок, глобалки чистятся автоматически при следующем использовании, объекты ждут своего часа в мусорке. |
10.11.2013, 18:29 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
автосборщик мусора - ALL.j называется |
10.11.2013, 18:30 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cawa_rux
offline
Опыт:
48Активность: |
Цитата:
Занимаюсь джазом неделю, взял код: увеличения здоровья и код: из статей про осваиваем jass. изменил и добавил свое. Это не автосборщик мусора, нашел что хотел) До этого сделал скил на гуи, решил переделать, теперь мучаюсь. Cawa_rux добавил: Не сразу понял что ты имеешь введу) автоматический сборщик мусора что это такое?)))))) Cawa_rux добавил: теперь знаю что такое автосборщик мусора, спасибо. мне это не подходит. Cawa_rux добавил: Лучше мне скажите, что изменить в коде для лучшей работе и есть ли утечки? хочу создать шаблон, для преобразования других спелов. Отредактировано Cawa_rux, 10.11.2013 в 18:41. |
|
10.11.2013, 18:49 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
|
10.11.2013, 19:29 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cawa_rux
offline
Опыт:
48Активность: |
Цитата:
Спасибо большое уже прочитал) можешь сказать: если у меня утечки?) даже файл загрузил в 1 сообщении) |
|
10.11.2013, 19:42 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ZLOY5
offline
Опыт:
912Активность: |
DioD:
зачемпочему |
10.11.2013, 20:59 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cawa_rux
offline
Опыт:
48Активность: |
Цитата:
Затем что это адресовано мне, а я нуб) |
|
10.11.2013, 22:34 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Карточка
Kicked by SSrunX
offline
Опыт:
2,017Активность: |
отказаться можно, чтобы получить:
можно ещё на этом фоне говорить о полностью реюз объектах и попробовать переписывать всю карту под это. но это такой байтодрочерский рак мозга, что и писать об этом забавно |
11.11.2013, 12:58 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
локалки быстрее глобалок если что, это тестед адиком и тоадкопом в годах 2005-2006
там идет так по времени local < global < local array < global array < hashtable < gamecache |
11.11.2013, 13:01 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
107,539Активность: |
Именно, в 2005 и 2006 (на самом деле на пару лет позже, но сути это не меняет). Думать об этом в 2013 и 2014, когда любой компьютер исполнит 1000 лишних операций и не задумается - дурной тон.
Стабильность, переносимость, легкость в поддержке, читаемость > скорость выполнения |
11.11.2013, 15:06 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
можно вообще другой язык сделать, динамически типизированный, интерпретируемый, на жассе, но зачем трахать трупы ? |
11.11.2013, 15:10 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
глобалки не надо обнулять потому что, сохранил что надо, заюзал, бросил, сам объект соберёт сборщик мусора.
кстати pseudocode:
local int timer = new_timer()
new_timer()
getID() somearray[ID] = CreateTimer() return ID unwrap(timer).start();
или чтото в таком духе позволит реализовать автоматическую сборку мусора и другие вещи без особых извращений. |
11.11.2013, 15:22 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
зачем таймеры, адекватная сборка мусора работает по тикам. |
11.11.2013, 15:29 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|