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

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

Ответ
 
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Оптимизация и все что с ней сязано
Решил оптимизировать карту, почитал умную статью Jona, но вопросы остались.
Допустим через мой триггер идет связь с юнитом кастующим заклинание. В действиях я присваиваю ему переменную SPELL_castingmag. Потом после выполнения триггера мне нужно почистить переменную SPELL_castingmag. Чтобы это сделать, мне достаточно (если я не прав - поправьте) в конце триггера влепить следующее действие:

Custom script: call RemoveUnit( udg_SPELL_castingmag )

Но как это будет выглядеть для переменных работающих в массиве:
SPELL_castingmag[(integer A)]
SPELL_castingmag[someVar], где someVar - какая-то целочисленная переменная.
SPELL_castingmag[1....12]

з.ы: я так понял желательно чистить переменные юнитов, эфектов и булеанов. Целочисленные можно не трогать.
Старый 04.08.2007, 15:45
adic3x

offline
Опыт: 108,439
Активность:
путаешь обнуление переменных с удалением ненужных обьектов.

вообще то я непонял вопрос=/

ADOLF добавил:
+ кинь кусок кода, так буит легше
+ едем в жасс раздел.
Старый 04.08.2007, 15:53
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Причем тут джасс. Я говорю про действие (CTRL+R) Custom Script через который можно обнулять/удалять не переводя триггер в текст.
Значит Custom script: set SPELL_castingmag = null, так?

set SPELL_castingmag[(integer A)] = null

Зевс добавил:
Проверил - не работает!(
Старый 04.08.2007, 16:20
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Если ты используеш локальные переменные юниты, эффекты...тогда их нужно очищать в конце триггера, но если это глобальные(обычные) и они часто используются, то их очищать не нужно, тк вскоре они опять чем-нибудь заполнятся...а вообще в твоем случае, где нужно удалить объект и обнулить глобалку, нужно использовать:
Код:
call RemoveUnit(udg_SPELL_castingmag)

как ты и написал...
А в массиве тоже самое
Код:
call RemoveUnit(udg_SPELL_castingmag[X])//где X - номер ячейки массива...


Alex_Hell добавил:
Цитата:
Сообщение от Зевс
set SPELL_castingmag[(integer A)] = null
Проверил - не работает!(

это у тебя не работает?
так ты через цикл прогнал ее?
легче создать и цикл и удаление воина на jass'e, а не на триггерах!
Старый 04.08.2007, 16:23
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Вот оно рабочее Custom script: set udg_SPELL_castingmag = null

Зевс добавил:
Alex_Hell опередил меня))

Зевс добавил:
call RemoveUnit(udg_SPELL_castingmag) - удалит переменную целиком и безвозвратно, а null - просто ее почистит... вроде разобрались.

Теперь хотелось бы узнать кто как чистит точки. Например триггер "телепортировать юнит в точку(позиция другого юнита)" Не задовать же каждую точку через переменную, а потом ее обнулять/удалять. Есть способы попроще?

Отредактировано Зевс, 04.08.2007 в 17:17.
Старый 04.08.2007, 16:37
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от Зевс
Вот оно рабочее Custom script: set udg_SPELL_castingmag = null
Адольф опередил меня))

Когда это он успел? он только 1 пост оставил тут и никакого udg у него нет!

Цитата:
Сообщение от Зевс
Теперь хотелось бы узнать кто как чистит точки. Например триггер "телепортировать юнит в точку(позиция другого юнита)" Не задовать же каждую точку через переменную, а потом ее обнулять/удалять. Есть способы попроще?

Незнаю насчет способа попроще...да и обычный довольно простой...присвоил локалке позицию, куда надо телепортиться, а после телепорта удалил и обнулил локалку...вот и все!

Alex_Hell добавил:
А как еще можно?!
Старый 04.08.2007, 17:01
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Это будет типа
local location loc = GetUnitLoc(udg_SPELL_caster)
call SetUnitPositionLoc (udg_SPELL_caster, loc)
call AddSpecialEffectLocBJ( loc, "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" )
call RemoveLocation (loc)
set loc = null
Старый 04.08.2007, 17:30
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Цитата:
call RemoveUnit(udg_SPELL_castingmag) - удалит переменную целиком и безвозвратно, а null - просто ее почистит... вроде разобрались.
шозабред, "RemoveUnit" - удалить юнита, а "set x=null" почистить переменную.

ЗЫ Зевс не юзай локации, перемещай юнита и создавай эффекты по X Y
Старый 04.08.2007, 17:43
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от Зевс
Это будет типа

local location loc = GetUnitLoc(udg_SPELL_caster)
call SetUnitPositionLoc (udg_SPELL_caster, loc)
call AddSpecialEffectLocBJ( loc, "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" )
call RemoveLocation (loc)
set loc = null

Че-то я ваще не врубаюсь зачем ты сначала присвоил loc позицию кастера, а потом переместил этого кастера на эту позицию...ничего не произойдет...или ты имееш ввиду, что ты поставиш
Код:
local location loc = GetUnitLoc(кастер)

тогда будет норм...
ну а так все как надо!

Alex_Hell добавил:
Но я все-таки не врубился зачем тебе передвигать кастера...двигать тут ниче не надо(не даст ничего)

Alex_Hell добавил:
Спецэффект удалять тоже надо!
Код:
call RemoveEffect(WhichEffect)
Старый 04.08.2007, 18:24
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
call RemoveUnit(udg_SPELL_castingmag) - удалит переменную целиком и безвозвратно, а null - просто ее почистит... вроде разобрались.

Не правильно разобрались... РемувЮнит удалит с карты юнита, ссылка на которого идёт через эту переменную. А null - это правильно.

Код:
local location loc = GetUnitLoc(udg_SPELL_caster) 
call SetUnitPositionLoc (udg_SPELL_caster, loc)
call AddSpecialEffectLocBJ( loc, "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" )
call RemoveLocation (loc)
set loc = null

В этом коде какая-то ошибка... Т.е. технически-то всё правильно, но это ничего не даст, ибо юнит останется на месте (переместится на своё же место).
Старый 04.08.2007, 19:24
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Переменная SPELL_caster тупо для примера. А вобще я уже разобрался с убийственными лагами)
Старый 04.08.2007, 20:20
YasonDelAlt

offline
Опыт: 862
Активность:
DFlyer,
Код:
local location loc = GetUnitLoc(udg_SPELL_target) // Ошибка была здесь! Нужно получить позицию цели
call SetUnitPositionLoc (udg_SPELL_caster, loc) // И переместь туда юнита
call AddSpecialEffectLocBJ( loc, "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" )
call RemoveLocation (loc)
set loc = null

А вообще грамотнее будет так:
Код:
local real x = GetUnitX(udg_SPELL_target)
local real y = GetUnitY(udg_SPELL_target)
local effect e
call SetUnitPosition(udg_SPELL_caster, x, y)
set e = AddSpecialEffect("Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl", x, y)
call DestroyEffect(e)

А вот об'null'ять переменные после удаления объекта, я думаю, не нужно, т.к. какая разница, что осталось в переменной, она всеравно уничтожится по завершении функции, в независимости от ее значения.
Старый 05.08.2007, 15:28
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
YasonDelAlt
Нужно обнулять переменные, которые сразу при инициализации получили значение объекта, который был создан!
Код:
local location Loc = GetUnitLoc(...)
local unit dummy = CreateUnit(...)
...
call RemoveLocation(Loc)
set Loc = null
set dummy = null
// тут надо обнулять, ибо "точка" и "юнит были созданы!
Старый 05.08.2007, 20:59
YasonDelAlt

offline
Опыт: 862
Активность:
DFlyer, черт, ну почему так? Ведь когда мы создаем объект, мы получаем не сам объект, а ссылку (указатель) на него. Ссылка же является 4-х байтовым числом (unsigned integer или DWORD, кому как больше нравится), адресом во внутреннем менеджере памяти вара. Когда мы удаляем объект, мы опять же передаем _адрес_, а не объект, содержащийся в нашей переменной. Так какая разница, что за адрес лежит в переменной после уничтожения объекта, ей самой не долго жить осталось, зачистку обычно же производят под конец функции. После завершения функции, стековый фрейм уничтожается вмести со всеми локальными переменными, которые в нем содержались.
Так, свою точку зрения я обосновал, теперь попрошу обосновать твою точку зрения (у-у-у-у как сложно выразился =) ).
Старый 06.08.2007, 07:31
adic3x

offline
Опыт: 108,439
Активность:
вообще то насколько я знаю идея, что обнулять локалки надо только если в них заносится только что созданный обьект пошло от жоника (правда он говорил что кешь перед инитом не нужно флушить)... вобщем то как это все сомнительно=/
Старый 06.08.2007, 12:43
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
YasonDelAlt ты выразился с точки зрения "нормальных" языков программирования, а Jass это только тестовый язык управления игровыми процесами вара, над которым близы не очень сильно работали т.е. он далеко не оптимальный, это значит что далеко не всё работает т.к. работает в С++, Pascal, АСМ и т.д. и т.п. Многие люди тестировали и пришли к выводу что при создании "сложных" обьектов(точки, юниты, декорации...) и прямом присвоении локальной переменной происходит утечка т.е. локальная переменная не уничтожается как положено :\
Старый 06.08.2007, 15:23
YasonDelAlt

offline
Опыт: 862
Активность:
MrSmiLe, это что ж получается, если локальная переменная указывает на что-то (пусть даже на мусор), то при выходе из функции она остается висеть в памяти?!!
Т. е. такая конструкция:
Код:
function takes handle link returns nothing
    local handle local_link = link // <---- ????
endfunction
породит утечку?
Старый 06.08.2007, 17:02
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
YasonDelAlt нет, только в том случае если обьект создаётся внутри функции.
Старый 06.08.2007, 18:52
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Код:
function Func takes handle link returns nothing
  local handle local_link = link // <---- ????
endfunction

Будет утечка, если link - является созданным объектом
К примеру:
Код:
function Dunc takes handle link returns nothing
  local location local_link = GetUnitLoc(не важно какой юнит)
// Тут создаётся точка, поэтому надо
  call RemoveLocation(local_link)
  set local_link = null
endfunction


А вот тут:
Код:
function Func takes handle link returns nothing
  local real local_link = GetUnitState(мана или жизни юнита - не важно)

// Обнулять не надо, ибо жизни/мана юнита есть изначально,
// они используются во время всей игры.
// Т.е. этот объект (мана/жизни) не создан, а уже существовал.
endfunction
Старый 06.08.2007, 20:24
J
expert
offline
Опыт: 48,447
Активность:
Никто так и не сказал полностью правельно)

Отредактировано Jon, 06.08.2007 в 21:16.
Старый 06.08.2007, 20:39
Ответ

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

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

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

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



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