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

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

Ответ
 
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
Прикрепленные файлы
Тип файла: w3x Skill.w3x (53.3 Кбайт, 15 просмотров )

Отредактировано Cawa_rux, 10.11.2013 в 20:07.
Старый 10.11.2013, 14:42
Карточка
Kicked by SSrunX
offline
Опыт: 2,017
Активность:
ты давай тэг кода для начала поставь
Старый 10.11.2013, 14:59
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
вот когда ошибки появятся, тогда и пишите
Старый 10.11.2013, 15:02
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
Карточка
Kicked by SSrunX
offline
Опыт: 2,017
Активность:
set udg_hash = InitHashtable() нужно один раз грузить? можно при загрузки карты? или в каждом триггере писать где есть эта глобалка?
1 раз в начале игры
твой таймер удалять надо, т.к. ты его создаёшь, значит и удаляй
тэг кода не тот, это спойлер у тебя
хранить всю шнягу можно только по таймеру. в том числе юнита и любое что вообще есть.
Старый 10.11.2013, 16:27
ScorpioT1000
Работаем
offline
Опыт: отключен
для большей читабельности кода надо убрать пробелы и переносы строк, и катов побольше добавьте.
Старый 10.11.2013, 16:38
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
DioD

offline
Опыт: 45,184
Активность:
запилите лучше автоматический сборщик мусора и откажитесь от локалок, глобалки чистятся автоматически при следующем использовании, объекты ждут своего часа в мусорке.
Старый 10.11.2013, 18:29
ScorpioT1000
Работаем
offline
Опыт: отключен
автосборщик мусора - ALL.j называется
Старый 10.11.2013, 18:30
Cawa_rux

offline
Опыт: 48
Активность:
Цитата:
Сообщение от ScorpioT1000
автосборщик мусора - ALL.j называется

Занимаюсь джазом неделю, взял код: увеличения здоровья и код: из статей про осваиваем jass. изменил и добавил свое.
Это не автосборщик мусора, нашел что хотел) До этого сделал скил на гуи, решил переделать, теперь мучаюсь.

Cawa_rux добавил:
Не сразу понял что ты имеешь введу)

автоматический сборщик мусора что это такое?))))))

Cawa_rux добавил:
теперь знаю что такое автосборщик мусора, спасибо. мне это не подходит.

Cawa_rux добавил:
Лучше мне скажите, что изменить в коде для лучшей работе и есть ли утечки? хочу создать шаблон, для преобразования других спелов.

Отредактировано Cawa_rux, 10.11.2013 в 18:41.
Старый 10.11.2013, 18:49
ScorpioT1000
Работаем
offline
Опыт: отключен
Старый 10.11.2013, 19:29
Cawa_rux

offline
Опыт: 48
Активность:
Цитата:
Сообщение от ScorpioT1000
http://warcraft3ft.info/forum/60-26099-1

Спасибо большое уже прочитал) можешь сказать: если у меня утечки?)
даже файл загрузил в 1 сообщении)
Старый 10.11.2013, 19:42
ZLOY5

offline
Опыт: 912
Активность:
DioD:
и откажитесь от локалок
зачемпочему
Старый 10.11.2013, 20:59
Cawa_rux

offline
Опыт: 48
Активность:
Цитата:
Сообщение от ZLOY5
~DioD:
> и откажитесь от локалок
зачемпочему

Затем что это адресовано мне, а я нуб)
Старый 10.11.2013, 22:34
Карточка
Kicked by SSrunX
offline
Опыт: 2,017
Активность:
отказаться можно, чтобы получить:
  • геморрой с написанием кода, особенно если делаешь это часто и много
  • получаешь ничтожный плюс на производительности, но не всегда да и не важен такой буст
можно ещё на этом фоне говорить о полностью реюз объектах и попробовать переписывать всю карту под это. но это такой байтодрочерский рак мозга, что и писать об этом забавно
Старый 11.11.2013, 12:58
ScorpioT1000
Работаем
offline
Опыт: отключен
локалки быстрее глобалок если что, это тестед адиком и тоадкопом в годах 2005-2006
там идет так по времени
local < global < local array < global array < hashtable < gamecache
Старый 11.11.2013, 13:01
adic3x

offline
Опыт: 107,539
Активность:
это тестед адиком и тоадкопом в годах 2005-2006
Именно, в 2005 и 2006 (на самом деле на пару лет позже, но сути это не меняет). Думать об этом в 2013 и 2014, когда любой компьютер исполнит 1000 лишних операций и не задумается - дурной тон.
Стабильность, переносимость, легкость в поддержке, читаемость > скорость выполнения
Старый 11.11.2013, 15:06
ScorpioT1000
Работаем
offline
Опыт: отключен
можно вообще другой язык сделать, динамически типизированный, интерпретируемый, на жассе, но зачем трахать трупы ?
Старый 11.11.2013, 15:10
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
ScorpioT1000
Работаем
offline
Опыт: отключен
зачем таймеры, адекватная сборка мусора работает по тикам.
Старый 11.11.2013, 15:29
Ответ

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

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

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

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



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