Здравствуйте. Сегодня я расскажу вам что такое утечки, и как их избежать.
В: Ну так что такое утечки? О: Утечки памяти - это проблема, которая возникает в результате не обнуления/не удалениях переменных. Для того чтобы было проще понять, объясню на примере спецэффектов. Допустим Вы создали спецэффект Огненного столба в центре карты.
Примерно триггер: 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
А ты не сильно перегибаешь палку начиная сразу с утечек?И у меня вопросс:для удаления точек ,можно ли юзать на все 1переменую или нужен масив или надо создавать новую переменую на каждый случай(как делаю я)?Обьясни,а то сам толком не разобрался.
Ну зачем же мусорить карту кучей переменных типа Эффект? Вполе подойдет массив, который ты будешь держать в голове. Например:
MPI - это когда триггеры настраиваются так, что способность может применяться несколькими игроками одновременно без багов
Для первый абилки ты используешь Эффект[1], если абилка MPI то Эффект[С 1 по 12]. И так по нарастающей.
Например если абилка не MPI, то юзаешь для нее Эффект [1], для другой абилки Эффект[2]. Но! Нельзя путаться, потому что перезаписанная переменная - это утечка. Перезаписанная переменная это примерно так:
Create Огненный столб на голове у юнита Set Effect[1] = Last Created Effect Create Молния на голове у юнита Set Effect[1] = LastCreated Effect. В данном случае ты 2 раза записал в одну и ту же переменную эффект. В итоге ты допустил одну утечку.
Правильней бы было так: Create Огненный столб на голове у юнита Set Effect[1] = Last Created Effect Create Молния на голове у юнита Set Effect[2] = LastCreated Effect. У юнита на голове будут проиграны 2 спецэффекта. И ты их влегкую сможешь удалить.
Сообщение отредактировал Ramazan(off) - Понедельник, 25 Марта 2013, 21:51:07
Добавлю: Если тебе надо чтобы эффект проигрался 1 раз и тут же удалился то можно ВООБЩЕ НЕ СОЗДАВАТЬ ПЕРЕМЕННЫХ.
Например: События: Условия: Действия: Create effect WARSTOMP at origin of Unit1. (Создать эффект топалки на юните). Создастся 1 раз. Destroy(Last Created EffecT)
Всё просто, если не усложнять.
Добавлено (25 Марта 2013, 21:50:06) ---------------------------------------------
Перед созданием отряда надо прописать set bj_wantDestroyGroup = true
Ty3uK, где-то мне говорил что это плацебо. Когда я пожаловался на багованность этой функции. А позже вроде бы заметил что всё равно как то коряво она выгружает группу, лучше заносить в переменную, имхо по всем статьям лучше и удобнее. Подумаешь на 1 строчку больше написал.
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
и в таких случаях уже надо писать 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
У меня есть база форума за 25.12.2010. По базе: " варкрафт" встречается 3614 раз; " варик" - 3623 раз; всего за варик: 7237; " говн" - 2390 раз;" гавн" - 1851 раз; всего за говно: 4241; " картостро" - 2445 раз.
1. Эффекты - удалять мгновенно из памяти. Q: А если надо чтобы эфект висел например 5 секунд? Тогда создаем переменную Effect. И пишем скрипт: Create Effect Огненный столб PlayableMapArea. //создали Set Effect = lastCreatedEffect //занесли в переменную wait 5 sec //ждем 5 секунд или сколько вам надо Remove Effect. //удаляем. Приведенный пример несколько абстрагирован, в следующих уроках буду разбирать как именно удалять.
а просто Set Effect = CreateEffect Огненный столб PlaybleMapArea(). никак не? так же короче и удобней