[Главная Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: [san9], Ахил  
[Статья] Виды переменных, локальные переменные
kaisarДата: Суббота, 28.08.2010, 20:19 | Сообщение # 1
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
Вы наверное знаете что такое переменные, как с ними работать и так далее. Я делю все переменные на 4 вида по мере уязвимости:
1.Уязвимые переменные
Как вы поняли этот вид переменных наиболее уязвим в игре, так как вероятность утечки информации больше всего. К ним относятся те юниты, здания, декорации, всё что вы создали в WE во время создания карты. Они уязвимы так как в игре с ними может случиться что угодно, в частности они могут умереть/уничтожиться.
2.Переменные зависяшие от событий и действий в триггере.
Например:
Действия:
Боевая еденица убить Переключающий юнит.
Щёлкнув на строчке вы сможете выбрать и другие переменные, к примеруумирающий юнит, юнит цель заклинания, но по умолчанию стоит переключающий юнит. Итак вы заметили что перед всеми этими переменными припасанно "Реакция на событие"? Это значит что эти виды переменных зависят от события триггера, то есть если выбрать Убивающий юнит то событие должно быть Юнит умирает. Но в этом списке не каждая строка имеет эту приставку, так например строчка Последний созданный юнит, не зависит от события, она зависит от предыдущего действия триггера типа боевая еденица создать юнит....
Эти переменные так же практически никак незащищенны от утечек.
3.Глобальные переменные
Это переменные которыми вы можете воспользоваться путём создания их в окне переменных, которое находится на панели инструментовРТ(редактор триггеров), или нажав горячие клавиши cntrl + B. Они предназначены для хранения информации, путём приравнивания действием Установить переменную *** = "Переменная 3-его вида" . Но даже они не достаточно защищенны от утечек информации.
4.Локальные переменные
Это переменные созданные jass строчками, путём перевода всего триггера на jass или же действием Личный сценарий, этот вид новичкам особенно трудно понять, но всё не так уж и сложно. Именно локальыне переменные ПРАКТИЧЕСКИ полностью защищенны от утечек информации.


В последнее время я, как спеллмейкер стал сталкиваться с утечками информации, которые возникают при триггерном осуществлении какого либо спелла. Чаще всего это спеллы которые дают какие либо эффекты через какой - либо промежуток времени. К примеру вам захочется сделать скилл который полностью останавливает юнита на определённое время:

Итак в этом триггере ясно дано понять, что юнит абсолютно обездвиживается на 3 секунды реального времени. Триггер довольно прост, но всё ли сделанно в этом триггере верно? НЕТ! Потому что промежуток времени - 3 секунды, которое наш юнит проведёт неподвижно, довольно уязвим утечкой информации, так как в промежуток 3 секунд есть вероятность что второй юнит с таким же скиллом может использовать этот скилл, и тогда значение (Юнит - цель заклинания) будет перезаписанно, и первая цель останется в паузе навсегда :) Это и называется утечкой информации. Что же делать, как избежать этого багга? Есть способ.
Итак рассмотрим поближе 2 последних вида переменных.
[color=orange]Глабальные переменные, локальные переменные.[/color] Само слово глобальные, вам не о чём не говорит? Слово глобальный ассоциируется с чём то большим, влияющим на всё, распространнёным. Этот вид переменных можно задействовать во всём редакторе, скажем если необходимо создать скилл который каждую 1 секунду отнимал 20 жизни юнита, то нужно создать 2 триггера:


А вот локальные переменные, могут использоваться только в одном триггере, и то их нельзя создавать путём создания глобальных переменных. Для того чтобы создать локальную переменную нужно сделать вот такое действие:
Личный сценарий - в появившемся окне вбиваем: local "ТИП ПЕРЕМЕННОЙ" "НАЗВАНИЕ ПЕРЕМЕННОЙ"
ОЧЕНЬ ВАЖНО!Все локальные переменные можно создать только в начале триггера, ПОВЕРХ всех остальных действий, иначе редактор выдаст ошибку и заблокирует ваш триггер. В разных триггерах можно создавать переменные с одинаковыми именами, это не влияет на работу остальных локальных переменых и не выдаёт ошибки. При каждом запуске триггера создастся свой набор локальных переменых, никак несвязанный с предыдущим набором. При завершении всех действий триггера, локальные переменные удаляются. Кроме переменной типа unit, чтобы удалить эту переменную во избежания утечек памяти, после использования этой переменной следует сделать такое действие:
Личный сценарий - set "НАЗВАНИЕ ПЕРЕМЕННОЙ ТИПА unit" = null


Итак, вернёмся к нашему примеру:

Так как локальные переменные создаются при каждом запуске триггера и удаляются после завершения действий и никак не связаны с другими наборами локальных переменных в этом случае именно они станут решением нашей проблемы. Для начала запишем требуемого юнита в глобальную переменную:

Итак наш юнит занесён в глобальную переменную, теперь мы можем прировнять какую либо локальную переменную к ней. Добавлю в триггер несколько действий "Личный сценарий".

Пока что почти ничего не ясно, но мы быстро это исправим. В начале триггера написана строчка "local unit u", как вы уже догадываетесь, я создал локальную переменную типа unit с названием u. Идём далее, следующая строчка это "set udg_unit = u" - слово с английского переводится как равно, прировнять, сравнить, значит только что в переменную u был записан наш юнит, и значит он полностью в безопасности, и не произойдёт никаких утечек, так как действия локальных переменных в одном запуске триггера никак не связанно с другими действиями переменных в этом же триггере при вторичном запуске. Но что же значит то что написанно перед названием переменной unit? Дело в том что в jass'e принято перед всеми глобальными переменными приписывать приставку "udg_", что не очень удобно, ну что делать, таковы правила. далее идёт отсчёт 5 секунд, после этого сново одна jass строчка!
set udg_unit = u, догадываетесь что это значит? Мы записали в глобальную переменную unit значение переменной u, тем самым позволяя себе продолжать запланированные действия, а далее мы освобождаем нашего юнита из оков. И последняя строчка нашего триггера это: set u = null, как вы догодались, мы удаляем локальную переменную, а точнее обнуляем.


Это был довольно простой пример использования локальных переменных, если вы его освоите, то вы сможете уйти намного дальше. Сможете юзать их в самых затруднительных обстоятельствах, когда казалось бы это невозможно.


Но, не путайтесь, локальные переменные не могут защитить против событий времяожидания! Только против действий типа "ждать".


Статья написанна не для специалистов, а для триггерщиков, что освоили основы ГУИ и глобальные переменные.
Вопросы что возникнут, спрашивать в этой теме.
Спасибо за внимание.

Типы локальных переменных.
Часть типов локальных переменных
_____________________________________________________________________________________________
Боевая еденица - unit
_____________________________________________________________________________________________
Способность - integer
_____________________________________________________________________________________________
Декорация - destructable
_____________________________________________________________________________________________
Разрушаемый обьект - integer
_____________________________________________________________________________________________
Диалог - dialog
_____________________________________________________________________________________________
Кнопка диалога - button
_____________________________________________________________________________________________
Плавающий текст - texttag
_____________________________________________________________________________________________
Картинка - image
_____________________________________________________________________________________________
Целочисленная - integer
_____________________________________________________________________________________________
Тип предмета - integer
_____________________________________________________________________________________________
Предмет - item
_____________________________________________________________________________________________
Лидерборд - leaderboard
_____________________________________________________________________________________________
Игрок - player
_____________________________________________________________________________________________
Точка - location
_____________________________________________________________________________________________
Реальная - real
_____________________________________________________________________________________________
Область - rect
_____________________________________________________________________________________________
Cпецэфект - effect
_____________________________________________________________________________________________
Cтрока - string
_____________________________________________________________________________________________
Таймер - timer
_____________________________________________________________________________________________
Отряд - group
_____________________________________________________________________________________________
Погодный эффект - weathereffect
_____________________________________________________________________________________________
______________________________ _______________________________________________________________

 
NormДата: Суббота, 28.08.2010, 20:22 | Сообщение # 2
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (kaisar)
юниты

Если отслеживать определённого, а не тип, шанс утечки нулевой.


 
kaisarДата: Суббота, 28.08.2010, 20:27 | Сообщение # 3
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
GetPrise, поподробней... что за определённый, я пишу про действие ожидать какое либо время. Скоростной читатель ^______^.
 
NormДата: Суббота, 28.08.2010, 20:41 | Сообщение # 4
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (kaisar)
Как вы поняли этот вид переменных наиболее уязвим в игре, так как вероятность утечки информации больше всего. К ним относятся те юниты

Я об этом, если переменной выбирать определённо существующего юнита, то шанс утечки нулевой.


 
kaisarДата: Суббота, 28.08.2010, 20:43 | Сообщение # 5
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
А шанс что юнит подохнет как нибудь
 
NormДата: Суббота, 28.08.2010, 20:45 | Сообщение # 6
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (kaisar)
А шанс что юнит подохнет как нибудь

Про шанс что юнит подохнет я ничего не говорил, я к тому, что утечек при выборе существующего юнита не бывает, ну или почти не бывает (у меня ещё ни разу не было).


 
kaisarДата: Суббота, 28.08.2010, 20:48 | Сообщение # 7
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
Я говорю что этот метод небезопасен, то есть несоветую, если только этот объект будет неприкосновенен.
 
NormДата: Суббота, 28.08.2010, 20:50 | Сообщение # 8
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (kaisar)
Я говорю что этот метод небезопасен, то есть несоветую, если только этот объект будет неприкосновенен.

Не обязательно, его можно возрождать и всё будет нормально.


 
G@NIB@LДата: Суббота, 28.08.2010, 20:52 | Сообщение # 9
Ветеран сайта.
Группа: Модераторы
Сообщений: 147
Статус: Отсутсвует
Бред facepalm

Сделай себе подпись уже)
 
kaisarДата: Суббота, 28.08.2010, 20:53 | Сообщение # 10
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
Лишнии мороки, лучше обойтись более продвинутым путём :D
 
NormДата: Суббота, 28.08.2010, 20:55 | Сообщение # 11
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (G@NIB@L)
Бред facepalm

Не бред, сам попробуй, установи переменную на готового юнита, а затем убей и возроди, всё будет отлично работать.
Quote (kaisar)
Лишнии мороки, лучше обойтись более продвинутым путём :D

Верно, но те, кто видят редактор 2 неделю, с тобой не согласятся.


 
kaisarДата: Суббота, 28.08.2010, 20:58 | Сообщение # 12
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
Я уверен, что те кто в редакторе 2 неделю, не станут даже в азы jass'a не станут лезть. А когда уже начнут осваивать они сами допрут до более рационального способа.
 
[san9]Дата: Суббота, 28.08.2010, 21:31 | Сообщение # 13
Вождь Орды
Группа: Модераторы
Сообщений: 49
Статус: Отсутсвует
омг напали. Статья норм и всё тут правильно. Не 1 норм скилл если он не у 1го героя на карте не обойдётся без локальных переменных.
И локальные переменные можно юзать не только для юнита.
 
NormДата: Понедельник, 30.08.2010, 11:44 | Сообщение # 14
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (|san9|)
омг напали. Статья норм и всё тут правильно. Не 1 норм скилл если он не у 1го героя на карте не обойдётся без локальных переменных.
И локальные переменные можно юзать не только для юнита.

Это к чему было?


 
[san9]Дата: Понедельник, 30.08.2010, 15:08 | Сообщение # 15
Вождь Орды
Группа: Модераторы
Сообщений: 49
Статус: Отсутсвует
Quote (GetPrise)
Это к чему было?

Это ко всему что вы тут написали <_<
 
EdiTTORRДата: Вторник, 31.08.2010, 12:51 | Сообщение # 16
Юзер
Группа: Проверенные
Сообщений: 21
Статус: Отсутсвует
Quote (kaisar)
защищенны от утечек информации.

Эмм утечки памяти
Quote (kaisar)
Уязвимые переменные
(сам придумал?)
Widget - указатель на handle. handle - указатель на ячейку памяти
К Widget относятся только юниты,разрушаемые объекты и предметы(unit,destructable,item)


"Всё, что человеческое сознание способно вообразить, оно способно и получить"
•©У.Клемент Стоун(1902-2002)

А чо это сначет?
 
kaisarДата: Вторник, 31.08.2010, 20:15 | Сообщение # 17
Новичок
Группа: Проверенные
Сообщений: 11
Статус: Отсутсвует
Quote (EdiTTORR)
Эмм утечки памяти

сам понял что сказал? утечки памяти сопровождаются с лагами, а это утечки информации.
Quote (EdiTTORR)
(сам придумал?)

Я их так называю.
 
EdiTTORRДата: Понедельник, 15.11.2010, 20:29 | Сообщение # 18
Юзер
Группа: Проверенные
Сообщений: 21
Статус: Отсутсвует
Quote (kaisar)

сам понял что сказал? утечки памяти сопровождаются с лагами, а это утечки информации.

facepalm (то что не обнуляется остаётся(утекает) в оперативную память компьютера)
Кароче читай вики Утечки памяти(Wikipedia®)
Quote (kaisar)
Уязвимые переменные

Quote (kaisar)
Я их так называю.

Переменные которые можно ударить... оу я забыл переменные же не живые и соответственно не могут быть уязвимыми >:)

Ищу ошибки дальше...

Quote (kaisar)
При завершении всех действий триггера, локальные переменные удаляются. Кроме переменной типа unit

:o неа! Есть ещё то что нужно разрушать и обнулять.


"Всё, что человеческое сознание способно вообразить, оно способно и получить"
•©У.Клемент Стоун(1902-2002)

А чо это сначет?


Сообщение отредактировал EdiTTORR - Понедельник, 15.11.2010, 20:32
 
  • Страница 1 из 1
  • 1
Поиск: