Сейчас 20:51:51 Четверг, 28 марта, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Bru  
Форум о Warcraft 3 » Раздел для картостроителей » Школа картостроения » [Триггеринг] Урок 1. Утечки
[Триггеринг] Урок 1. Утечки
Ramazan(off)Дата: Понедельник, 25 Марта 2013, 20:33:24 | Сообщение # 1
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 765
Блокировки:
Здравствуйте. Сегодня я расскажу вам что такое утечки, и как их избежать.

В: Ну так что такое утечки?
О: Утечки памяти - это проблема, которая возникает в результате не обнуления/не удалениях переменных.
Для того чтобы было проще понять, объясню на примере спецэффектов.
Допустим Вы создали спецэффект Огненного столба в центре карты.

Примерно триггер:
1. Create FlameStrike Effect position of Playable Map area.
Ну ладно, столб рассеялся, вы довольны. Но есть одно "но". Эффект огненного столба исправился, но сам эффект остался в памяти варика. Оставшийся в памяти эффект будет по чуть чуть кушать память варика, пока её не останется совсем. Что в будущем приведет к сильным лагам.

Удалять эффект можно сразу, без боязни того, что он исчезнет. Допустим тот же триггер:

1. Create FlameStrike Effect position of Playable Map area. /эффект
2. Remove LastCreatedSpecialEffect. /тут же удаляем из памяти, внешне эффект проиграется до конца и не удалится.

Задание: Попробовать сделать скрипт, который в верху.

Потенциально опасные действия, которые могут повлечь за собой утечки:
1. Создание эффектов
2. Работа с точками
3. Работа с группами
4. Каждый lastCreated Unit/effect и т.п. вызывает 1 утечку. (Пруф не могу предоставить, и как бороться не знаю. Читал про это давно и не помню у кого)

В принципе не страшны даже 500 утечек, тем более что некоторых - не избежать. 10000утечек вызовут небольшие лаги. И так по нарастающей.

Как же избавляться от засоряющих память утечек?
1. Эффекты - удалять мгновенно из памяти.
Q: А если надо чтобы эфект висел например 5 секунд?
Тогда создаем переменную Effect.
И пишем скрипт:
Create Effect Огненный столб PlayableMapArea. //создали
Set Effect = lastCreatedEffect //занесли в переменную
wait 5 sec //ждем 5 секунд или сколько вам надо
Remove Effect. //удаляем. Приведенный пример несколько абстрагирован, в следующих уроках буду разбирать как именно удалять.

2. Точки - удалять из памяти.
Точками может быть и PositionOfUnit и CenterOfPlayableMapArea и полярные координаты.

3. Группы - очищать.
Действие для очищения группы: ClearGroup.

Удаление точек
В: Как удалять точки?
О: Пример, вам нужно отловить точку каста огненного столба и создать там пехотинца.
Скрипт:

1. Мы отловили точку каста огненного столба и занесли её в переменную castPoint.
2. Далее в точке castPoint мы создали 1 пехотинца.
3. Самое сложное. Надо выбрать функцию CustomScript и написать следующее:
Call RemoveLocation(udg_название вашей переменной с соблюдением регистра)
мой текст: call RemoveLocation(udg_castPoint).

Всё предельно просто.
Доп. материал ОБЯЗАТЕЛЬНЫЙ К ПРОЧТЕНИЮ:
1. Топан
2. Статья, написанная даже лучше чем урок :D by DUOS aka DUOSORA
Д/з. Сделать простой спелл, вызывающий эффекты и удаляющий их из памяти. Если эффекты будут на определенных точках, которые будут удалены. Автоматом - 5. [/color]


Сообщение отредактировал Ramazan(off) - Понедельник, 25 Марта 2013, 20:35:38
 

DaroДата: Понедельник, 25 Марта 2013, 21:30:24 | Сообщение # 2
6 уровень
Группа: Проверенные
Сообщений: 217
Награды: 0
Репутация: 105
Блокировки:
А ты не сильно перегибаешь палку начиная сразу с утечек?И у меня вопросс:для удаления точек ,можно ли юзать на все 1переменую или нужен масив или надо создавать новую переменую на каждый случай(как делаю я)?Обьясни,а то сам толком не разобрался.

 

Ramazan(off)Дата: Понедельник, 25 Марта 2013, 21:46:24 | Сообщение # 3
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 765
Блокировки:
Ну зачем же мусорить карту кучей переменных типа Эффект?
Вполе подойдет массив, который ты будешь держать в голове.
Например:

Для первый абилки ты используешь Эффект[1], если абилка MPI то Эффект[С 1 по 12].
И так по нарастающей.

Например если абилка не MPI, то юзаешь для нее Эффект [1],
для другой абилки Эффект[2]. Но! Нельзя путаться, потому что перезаписанная переменная - это утечка.
Перезаписанная переменная это примерно так:

Правильней бы было так:
Create Огненный столб на голове у юнита
Set Effect[1] = Last Created Effect
Create Молния на голове у юнита
Set Effect[2] = LastCreated Effect.
У юнита на голове будут проиграны 2 спецэффекта.
И ты их влегкую сможешь удалить.


Сообщение отредактировал Ramazan(off) - Понедельник, 25 Марта 2013, 21:51:07
 

Ty3uKДата: Понедельник, 25 Марта 2013, 21:48:44 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Цитата (Ramazan(off))
если абилка МУИ то Эффект[С 1 по 12].

Это MPI


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Ramazan(off)Дата: Понедельник, 25 Марта 2013, 21:50:06 | Сообщение # 5
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 765
Блокировки:
Добавлю:
Если тебе надо чтобы эффект проигрался 1 раз и тут же удалился то можно ВООБЩЕ НЕ СОЗДАВАТЬ ПЕРЕМЕННЫХ.

Например:
События:
Условия:
Действия:
Create effect WARSTOMP at origin of Unit1. (Создать эффект топалки на юните). Создастся 1 раз.
Destroy(Last Created EffecT)

Всё просто, если не усложнять.

Добавлено (25 Марта 2013, 21:50:06)
---------------------------------------------

Цитата (Ty3uK)
MPI

Ок, исправил
 

NaturekidДата: Понедельник, 25 Марта 2013, 22:10:34 | Сообщение # 6
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
Цитата (Borodach)
Перед созданием отряда надо прописать set bj_wantDestroyGroup = true

Ty3uK, где-то мне говорил что это плацебо.
Когда я пожаловался на багованность этой функции.
А позже вроде бы заметил что всё равно как то коряво она выгружает группу, лучше заносить в переменную, имхо по всем статьям лучше и удобнее. Подумаешь на 1 строчку больше написал.


 

Ramazan(off)Дата: Понедельник, 25 Марта 2013, 22:24:39 | Сообщение # 7
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 765
Блокировки:
Цитата (Naturekid)
лучше заносить в переменную

и пользоваться clear group :D
 

NaturekidДата: Понедельник, 25 Марта 2013, 22:36:24 | Сообщение # 8
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
Цитата (Ramazan(off))
clear group

эмм DestroyGroup
Clear group это же очистка переменной группы от переменных юнитов, содержащихся в ней вроде.

Добавлено (25 Марта 2013, 22:36:24)
---------------------------------------------
(т.е. НЕ уничтожение утечки самой группы.)


 

Ty3uKДата: Понедельник, 25 Марта 2013, 22:40:19 | Сообщение # 9
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Цитата (Borodach)
Перед созданием отряда надо прописать set bj_wantDestroyGroup = true

Плацебо, причем полное.


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

BorodachДата: Вторник, 26 Марта 2013, 07:16:20 | Сообщение # 10
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Ty3uK, не плацебо, это дестроит локальную групу, только вот ее не обнуляет. из 2 утечек можем 1 убрать
Цитата (Naturekid)
А позже вроде бы заметил что всё равно как то коряво она выгружает группу, лучше заносить в переменную

Но чтоб занести в переменную ты создаешь действие, и в таких случаях уже надо писать set bj_wantDestroyGroup = true

Отряд - Pick every unit In With Range X
Добавить Пикет юнита в Group

так уже 1 локальная группа утекает. Ну если поле этого ты проходишь список по глобальной группе, то не нужно ничего писать.
Отряд - Pick every unit In Group


Karamba


Сообщение отредактировал Borodach - Вторник, 26 Марта 2013, 07:19:25
 

Ty3uKДата: Вторник, 26 Марта 2013, 10:35:02 | Сообщение # 11
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Если я что-то правильно помню, в обычном пике это не помогает. С Ником это проверяли.

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

NaturekidДата: Вторник, 26 Марта 2013, 10:42:54 | Сообщение # 12
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
Цитата (Borodach)
Но чтоб занести в переменную ты создаешь действие

да, сет вариейбл
Цитата (Borodach)
и в таких случаях уже надо писать set bj_wantDestroyGroup = true

не надо
Цитата (Borodach)
Отряд - Pick every unit In With Range X Добавить Пикет юнита в Group так уже 1 локальная группа утекает. Ну если поле этого ты проходишь список по глобальной группе, то не нужно ничего писать. Отряд - Pick every unit In Group

чё?
юнит ин рендж - то что мы в сет вариейбл заносим, что у нас там ещё утечёт?

Добавлено (26 Марта 2013, 10:40:43)
---------------------------------------------
я помню что при нескольких действиях обращение то ли к юниту из группы то ли к самой группе не работает, словно я к нулю обращаюсь, и на это жаловался в теме. А после обсуждения понял, что на эту функцию лучше забить.

Добавлено (26 Марта 2013, 10:42:54)
---------------------------------------------
а догнал.
Только вот я

Цитата (Borodach)
Отряд - Pick every unit In With Range X Добавить Пикет юнита в Group

никогда в жизни не делал.
Я делал g=юниты в радиусе ...
Если надо ещё куда их - добавить юниты из g в g1


 

BorodachДата: Вторник, 26 Марта 2013, 17:59:22 | Сообщение # 13
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Решил перепроверить.... это действие безполезное :o

Karamba
 

DEMON_CHETS_V2Дата: Вторник, 26 Марта 2013, 20:24:45 | Сообщение # 14
Тайга-сперма
Группа: Проверенные
Сообщений: 913
Награды: 0
Репутация: 316
Блокировки:
http://rghost.ru/44794431
Надеюсь, я сделал то, что надо.
 

Gr0mДата: Вторник, 26 Марта 2013, 21:12:51 | Сообщение # 15
8 уровень
Группа: Проверенные
Сообщений: 729
Награды: 0
Репутация: 249
Блокировки:
Дз 1
 

Ramazan(off)Дата: Четверг, 28 Марта 2013, 12:56:08 | Сообщение # 16
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 765
Блокировки:
Цитата (DEMON_CHETS_V2)
то, что надо.

Камера View? Что-то не то.

Цитата (Gr0m)
Дз 1

Умница. 5.
 

DEMON_CHETS_V2Дата: Четверг, 28 Марта 2013, 13:21:44 | Сообщение # 17
Тайга-сперма
Группа: Проверенные
Сообщений: 913
Награды: 0
Репутация: 316
Блокировки:
Цитата (Ramazan(off))
Камера View

?

Добавлено (28 Марта 2013, 13:21:44)
---------------------------------------------
ты имел в виду на фиксированной точке?

 

Ramazan(off)Дата: Четверг, 28 Марта 2013, 13:29:12 | Сообщение # 18
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 765
Блокировки:
Цитата (DEMON_CHETS_V2)
фиксированной точке

Если применяешь спелл, то будь добр сделать эффект на том месте, куда игрок применил способность.
 

urazoveДата: Понедельник, 22 Апреля 2013, 19:33:47 | Сообщение # 19
1 уровень
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Блокировки:
как скрипт написать?

Добавлено (22 Апреля 2013, 19:33:47)
---------------------------------------------
Я ничего не понял


СОЖГУ ДО ТЛА!!!
 

NetДата: Воскресенье, 05 Мая 2013, 16:58:57 | Сообщение # 20
2 уровень
Группа: Пользователи
Сообщений: 30
Награды: 0
Репутация: 11
Блокировки:
У меня есть база форума за 25.12.2010. По базе:
" варкрафт" встречается 3614 раз; " варик" - 3623 раз; всего за варик: 7237;
" говн" - 2390 раз;" гавн" - 1851 раз; всего за говно: 4241;
" картостро" - 2445 раз.
 

BruДата: Понедельник, 06 Мая 2013, 11:52:39 | Сообщение # 21
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1950
Блокировки:
 

NetДата: Вторник, 07 Мая 2013, 18:57:39 | Сообщение # 22
2 уровень
Группа: Пользователи
Сообщений: 30
Награды: 0
Репутация: 11
Блокировки:
Цитата
Сообщения # 19 1/2, 20

Удаляя, удаляй.
 

laysikДата: Воскресенье, 01 Сентября 2013, 22:18:15 | Сообщение # 23
7 уровень
Группа: Проверенные
Сообщений: 292
Награды: 0
Репутация: 20
Блокировки:
1. Эффекты - удалять мгновенно из памяти.
Q: А если надо чтобы эфект висел например 5 секунд?
Тогда создаем переменную Effect.
И пишем скрипт:
Create Effect Огненный столб PlayableMapArea. //создали
Set Effect = lastCreatedEffect //занесли в переменную
wait 5 sec //ждем 5 секунд или сколько вам надо
Remove Effect. //удаляем. Приведенный пример несколько абстрагирован, в следующих уроках буду разбирать как именно удалять.

а просто Set Effect = CreateEffect Огненный столб PlaybleMapArea(). никак не? так же короче и удобней


А почему бы и нет?
 

[SeKtOR]Дата: Понедельник, 02 Сентября 2013, 10:56:38 | Сообщение # 24
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Цитата (laysik)
а просто Set Effect = CreateEffect Огненный столб PlaybleMapArea(). никак не? так же короче и удобней

Проблема в том, что в гуи так нельзя.


 

Форум о Warcraft 3 » Раздел для картостроителей » Школа картостроения » [Триггеринг] Урок 1. Утечки
  • Страница 1 из 1
  • 1
Поиск:

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