Сейчас 21:57:17 Понедельник, 25 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Урок 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. Обычно используется после всех действий с группой. Пример правильного использования:

А как же
Code
call GroupClear(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
Блокировки:
Quote (Dreii)
вызывает

ТЕперь объесняй как она вызывает что? Если она 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 B)

Добавлено (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 урока)
Учим..


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz