[Урок 4] Подробнее про утечки
|
|
[DUОS] | Дата: Суббота, 11 Декабря 2010, 14:17:06 | Сообщение # 1 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Перед тем, как разъяснять вам, что такое утечки и как их убирать, полагаю, нужно ответить на вопрос "А зачем вообще их убирать?". Ответить на данный вопрос не составит труда - ознакомьтесь с этой статьёй и вам всё станет ясно. Читая статью, вы наверняка заметили такие строки: Custom script: call RemoveLocation (udg_*Temp variable name here*) Custom script: call DestroyGroup (udg_*Temp variable name here*) Custom script: call DestroyForce (udg_*Temp variable name here*) Custom script: call DestroyEffect (udg_*Temp variable name here*) Custom script: call DestroyLightning (udg_*Temp variable name here*) Custom script: call DestroyTextTag (udg_*Temp variable name here*) Custom script: call DestroyTimer (udg_*Temp variable name here*) Вот эти строки и станут предметом нашего обучения на этом уроке. call RemoveLocation(loc) удаляет точку, занесённую в переменную loc. Точки - очень утечный вид переменных, точнее, ими засорить память намного легче, чем другими типами переменных. Крайне не советую пользоваться типом location. Исключение составляет случай с вычислением высоты точки, у которого я не видел аналога на координатах. Давайте научимся обходиться без точек и рассмотрим особый случай с получением высоты. Допустим, ваш триггер выглядит так: Code function Trig_NewTrigger_Actions takes nothing returns nothing call IssuePointOrderLoc(GetTriggerUnit(),"move",GetUnitLoc(GetSpellTargetUnit())) endfunction
//====================================================================== function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_NewTrigger,EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddAction(gg_trg_NewTrigger,function Trig_NewTrigger_Actions) endfunction Конечно же, этот триггер будет заставлять применившего любую способность юнита двигаться в точку, где находился во время применения способности целевой юнит. Этот триггер утечен. Можно использовать локальную переменную-точку и RemoveLocation, а можно заменить на координаты. Второе будет лучше. Смотрим, как я это сделал: Code function Trig_NewTrigger_Actions takes nothing returns nothing call IssuePointOrder(GetTriggerUnit(),"move",GetSpellTargetX(),GetSpellTargetY()) endfunction
//====================================================================== function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_NewTrigger,EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddAction(gg_trg_NewTrigger,function Trig_NewTrigger_Actions) endfunction Они стали доступны только с патча 1.24, но очень удобны. Исключение - получение высоты точки. Рассмотрим это. Code function Trig_NewTrigger_Actions takes nothing returns nothing local location loc = GetUnitLoc(GetTriggerUnit()) local real z = GetLocationZ(loc) //...Действия... call RemoveLocation(loc) set loc = null endfunction
//====================================================================== function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_NewTrigger,EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddAction(gg_trg_NewTrigger,function Trig_NewTrigger_Actions) endfunction call DestroyGroup(g) удаляет группу, занесённую в переменную g. Обычно используется после всех действий с группой. Пример правильного использования:Code function Trig_NewTrigger_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local group g = CreateGroup() call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),500.,null) call ForGroup(g,function groupAct) ...Deistvia call DestroyGroup(g) set g = null set u = null endfunction
//====================================================================== function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_NewTrigger,EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddAction(gg_trg_NewTrigger,function Trig_NewTrigger_Actions) endfunction Остальное очищается по аналогии. Домашнее задание. 1. Ответьте на вопросы:- Что является главным утечным типом переменных?
- Назовите исключения, типы переменных, не вызывающих утечек.
- Можно ли обойтись без точки, если нужно получить высоту боевой единицы? Аргументируйте ответ.
- На что влияют утечки?
2. Приведите примеры очистки прочих типов, не описанных здесь. Сохраните всё в текстовый документ и перешлите мне в ЛС. На следующей лекции будет контрольное задание.
|
|
|
|
H_A_PK | Дата: Суббота, 11 Декабря 2010, 14:34:15 | Сообщение # 2 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (|DUОS|) call DestroyGroup(g) удаляет группу, занесённую в переменную g. Обычно используется после всех действий с группой. Пример правильного использования: А как же ?
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
ARTEMON | Дата: Суббота, 11 Декабря 2010, 19:54:24 | Сообщение # 3 |
6 уровень
Группа: Заблокированные
Сообщений: 182
Награды: 0
Репутация: 53
Блокировки:
| GroupClear всего лишь удаляет из группы всех юнитов, оставляя ее пустой, "учитель". Заметь что в таком же состоянии группа находится сразу после local group g = CreateGroup()
На мне пятикратный взлом админсотава этова сайта. Ты возражаешь? Я тебя не замечаю.|
|
|
|
|
H_A_PK | Дата: Суббота, 11 Декабря 2010, 19:59:13 | Сообщение # 4 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| ARTEMON, ну это очевидно но перед тем как ремувить группу лучше оставить её пустой, ага
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
BinGO | Дата: Воскресенье, 12 Декабря 2010, 04:20:05 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
| Quote (H_A_PK) но перед тем как ремувить группу лучше оставить её пустой, ага А разве есть разница?
|
|
|
|
H_A_PK | Дата: Воскресенье, 12 Декабря 2010, 10:45:14 | Сообщение # 6 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (B1nGO) А разве есть разница? да, группа ведь объект, а там как с триггерами при удалении в памяти весят параметры
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
RoBoT1 | Дата: Воскресенье, 12 Декабря 2010, 11:25:42 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1454
Награды: 2
Репутация: 240
Блокировки:
| Я это всё узнал недавно! Спс H_A_PK'у, что объяснил до этого урока!
|
|
|
|
pirat9629 | Дата: Понедельник, 11 Апреля 2011, 19:32:43 | Сообщение # 8 |
7 уровень
Группа: Проверенные
Сообщений: 422
Награды: 0
Репутация: 102
Блокировки:
| это наш 4 урок или ?
сделаю минекрафт сервер на заказ. платно
|
|
|
|
Blood_Elf | Дата: Понедельник, 11 Апреля 2011, 19:40:22 | Сообщение # 9 |
7 уровень
Группа: Проверенные
Сообщений: 415
Награды: 0
Репутация: 92
Блокировки:
| нет
|
|
|
|
[DUОS] | Дата: Вторник, 12 Апреля 2011, 08:29:18 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Давайте сделаем это нашим 4-м уроком =]
|
|
|
|
Syzaky | Дата: Вторник, 12 Апреля 2011, 10:37:58 | Сообщение # 11 |
5 уровень
Группа: Проверенные
Сообщений: 104
Награды: 0
Репутация: 12
Блокировки:
| Quote (|DUОS|) Домашнее задание. 1. Ответьте на вопросы: * Что является главным утечным типом переменных? * Назовите исключения, типы переменных, не вызывающих утечек. * Можно ли обойтись без точки, если нужно получить высоту боевой единицы? Аргументируйте ответ. * На что влияют утечки? 2. Приведите примеры очистки прочих типов, не описанных здесь. Сохраните всё в текстовый документ и перешлите мне в ЛС. это делать? Добавлено (12-04-2011, 10:37) --------------------------------------------- if ( Trig_Fire_archer_2_Func001Func002Func001Func002Func001Func003Func001C() ) then else local location u call CreateNUnitsAtLoc( 1, 'n004', Player(PLAYER_NEUTRAL_AGGRESSIVE), GetUnitLoc(GetEnumUnit()), bj_UNIT_FACING ) local location u = GetUnitLoc(GetLastCreatedUnit()) call RemoveLocation (u) call UnitApplyTimedLifeBJ( 3.00, 'BTLF', GetLastCreatedUnit() ) call IssueTargetOrderBJ( GetLastCreatedUnit(), "attack", GetEnumUnit() ) endif я что-то тут неправильно делаю? Если WE ругаеться на локальные переменные, пишет что нет endif или отсутсвует название
|
|
|
|
SSrunX | Дата: Вторник, 12 Апреля 2011, 16:51:32 | Сообщение # 12 |
Пуэрывыи уровэн вуася
Группа: Ветераны
Сообщений: 1604
Награды: 3
Репутация: 1281
Блокировки:
| [DUОS], мы толькр жасс будем учить же?
https://vk.com/musicforubaby Просто подрочи - само решится © BinGO С феклой играй - себя не уважай © Рандом Безвозмездности не существует, все люди эгоисты. © BARMAGLOT Вот краны :gays: © Privitalik Я бы помесил глину на твоем заднем дворе. © MrHate
|
|
|
|
lawson | Дата: Вторник, 12 Апреля 2011, 17:40:50 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| ВОт как надо в твоем варианте. Про утечки ни чего говорить не буду. Скажу только то что объявление локальных перменных типа local unit u делаеться всегда в самом верху функции до любого действия. Code local location u if ( Trig_Fire_archer_2_Func001Func002Func001Func002Func001Func003Func001C() ) then call CreateNUnitsAtLoc( 1, 'n004', Player(PLAYER_NEUTRAL_AGGRESSIVE), GetUnitLoc(GetEnumUnit()), bj_UNIT_FACING ) set u = GetUnitLoc(GetLastCreatedUnit()) call RemoveLocation (u) call UnitApplyTimedLifeBJ( 3.00, 'BTLF', GetLastCreatedUnit() ) call IssueTargetOrderBJ( GetLastCreatedUnit(), "attack", GetEnumUnit() ) endif
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 12 Апреля 2011, 17:47:25 |
|
|
|
Dreii | Дата: Вторник, 12 Апреля 2011, 18:36:46 | Сообщение # 14 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Syzaky, YНеиспользуй точки воооооообще
|
|
|
|
[DUОS] | Дата: Вторник, 12 Апреля 2011, 19:42:15 | Сообщение # 15 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Syzaky) if ( Trig_Fire_archer_2_Func001Func002Func001Func002Func001Func003Func001C() ) then else local location u call CreateNUnitsAtLoc( 1, 'n004', Player(PLAYER_NEUTRAL_AGGRESSIVE), GetUnitLoc(GetEnumUnit()), bj_UNIT_FACING ) local location u = GetUnitLoc(GetLastCreatedUnit()) call RemoveLocation (u) call UnitApplyTimedLifeBJ( 3.00, 'BTLF', GetLastCreatedUnit() ) call IssueTargetOrderBJ( GetLastCreatedUnit(), "attack", GetEnumUnit() ) endif Ещё б не выругался. Локальные переменные объявляют перед всем прочим в функции.
|
|
|
|
lawson | Дата: Вторник, 12 Апреля 2011, 20:13:37 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| [DUОS], Да у меня вопрос про утечки. PolarProjection() - он ведь не вызывает утечек да?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Dreii | Дата: Вторник, 12 Апреля 2011, 21:15:42 | Сообщение # 17 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| lawson, вызывает
|
|
|
|
lawson | Дата: Вторник, 12 Апреля 2011, 21:21:39 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| ТЕперь объесняй как она вызывает что? Если она location возвращает.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 12 Апреля 2011, 21:55:53 |
|
|
|
[DUОS] | Дата: Вторник, 12 Апреля 2011, 21:24:47 | Сообщение # 19 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| lawson, Двойная точка. И не обнулить.
|
|
|
|
lawson | Дата: Вторник, 12 Апреля 2011, 21:57:12 | Сообщение # 20 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| [DUОS], так что 4 урок будет или это он?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
[DUОS] | Дата: Вторник, 12 Апреля 2011, 22:54:10 | Сообщение # 21 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| lawson, Это он о__О
|
|
|
|
skvaer09 | Дата: Четверг, 14 Апреля 2011, 16:50:35 | Сообщение # 22 |
8 уровень
Группа: Проверенные
Сообщений: 602
Награды: 0
Репутация: -117
Блокировки:
| [DUОS], он наверно хоетл написать оно
|
|
|
|
AU | Дата: Понедельник, 18 Апреля 2011, 21:12:33 | Сообщение # 23 |
7 уровень
Группа: Проверенные
Сообщений: 471
Награды: 0
Репутация: 70
Блокировки:
| а я ваще точки не юзю Добавлено (18-04-2011, 21:06) ---------------------------------------------
Добавлено (18-04-2011, 21:07) ---------------------------------------------
Quote (Dreii) Syzaky, YНеиспользуй точки воооооообще +1 Добавлено (18-04-2011, 21:10) --------------------------------------------- аааа! вот, [DUОS], обьясни: я создаю переменную типа отряд потом 2 переменную отряд назначаю 1-ую 2-ой и после етого... Добавлено (18-04-2011, 21:12) --------------------------------------------- я так понял, это происходит после назначения одной переменной группы другой
|
|
|
|
Praid | Дата: Пятница, 14 Октября 2011, 20:54:59 | Сообщение # 24 |
6 уровень
Группа: Проверенные
Сообщений: 203
Награды: 0
Репутация: 302
Блокировки:
| Вот я и дошел до 4 урока) Учим..
|
|
|
|