Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
оптимизация
Прочитал статью сергея про полярные координаты, и возник такой вопрос. Будет ли данный триггер засорять память?
Код:
Конкретно меня интересует действие (Number of units in (Units within 10000.00 of (Position of (Picked unit)) matching ((Unit-type of (Matching unit)) Equal to Ancient Protector))) Greater then 0 Если да - то как от этого вылечить? |
14.01.2006, 22:55 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Медведь
ФффыррфррфффФФфф!
offline
Опыт:
21,702Активность: |
Цитата:
Да, будет. А как лечить было в статье сергея про оптимизацию :D Пишем перед этим условием: Set bj_wantDestroyGroup = true |
|
14.01.2006, 23:22 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
Про способ сергея читал, но как его применить в данном случае - ума не приложу =\
bj_wantDestroyGroup прописал при старте карты Кстати, нашел такой баг. Как вы поняли, триггер должен понижать\повышать уровень заклинание (аура барабанов )при удалении\приблиижении юнита к другому. При повышении уровня все идет нормально, а при понижении, эффект ауры на какое-то время пропадает. Может кто знает, почему и можно ли это исправить? |
14.01.2006, 23:49 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Медведь
ФффыррфррфффФФфф!
offline
Опыт:
21,702Активность: |
Нее, насчёт этого не знаю.. надо у "отцов" спросить. |
15.01.2006, 00:02 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
zibada
offline
Опыт: отключен
|
Pick every.... - это вообще зло, тем более в таких количествах.
для действенной оптимизации (можно от всех "Pick every" вообще избавиться =)) там надо на джассе все переписывать...
идея такая - где-то храним список всех юнитов нужного типа на карте, раз в 0.5 секунды для каждого юнита из этого списка проверяем, сколько юнитов из этого же списка находятся на нужном расстоянии, в зависимости от этого что-то делаем.
список юнитов обновляем при событиях типа "юнит создан"/"юнит помер", ну и инициализируем один раз - при запуске карты (один Pick every... все-таки тут понадобится) наверное, это можно даже на обычных триггерах сделать.. |
15.01.2006, 01:59 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
ок, а с точками что делать? |
15.01.2006, 12:57 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
43,563Активность: |
Units within 10000.00 of (Position of (Picked unit)) - создаст сорный объект типа группа Position of (Picked unit) - создаст сорный объект типа точка Как лечится: на GUI пишешь set p = Position of (Picked unit) set gr = Units within 10000.00 of <p> Pick every unit in gr... ... Когда группа и точка станут ненужными CustomScript: call DestroyGroup(udg_gr) CustomScript: call RemoveLocation(udg_p) |
15.01.2006, 13:34 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
zibada
offline
Опыт: отключен
|
если делать не через группы, а как я предложил, точки вообще нафиг не нужны, т.к. можно считать расстояние по формуле: SquareRoot((GetUnitX(u1) - GetUnitX(u2))*(GetUnitX(u1) - GetUnitX(u2)) + (GetUnitY(u1) - GetUnitY(u2))*(GetUnitY(u1) - GetUnitY(u2)) чистая арифметика, никаких левых объектов не создается. |
15.01.2006, 13:58 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
Гм, вопросы по теме
|
15.01.2006, 15:02 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
53,013Активность: |
DimonT группы лутче чем аррай !
|
15.01.2006, 15:21 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exploder
iOS zealot
offline
Опыт:
19,394Активность: |
Функции объявленные как native, и возврашающие handle, тоже жрут память? Или это зло только чисто jass функций?
Цитата:
Причем тут регион, если существует тип location? |
|
15.01.2006, 15:32 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
Господи, как я близзов за всю эту фигню ненавижу =\ |
15.01.2006, 15:49 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
exploder я не имел ввиду ничего конкретного, создает точку, не в этом суть
NETRAT добавил: тип Location - два Real'a, тип Region - четыре Real'a |
15.01.2006, 16:00 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exploder
iOS zealot
offline
Опыт:
19,394Активность: |
NETRAT
А понял что ты имел в виду... Как насчет native функций? |
15.01.2006, 16:06 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
DimonT ты точно формулу правильно написал? что-ты числа больно астрономические получаются
|
15.01.2006, 17:13 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
Точно - Sqrt((X1-X2)^2+(Y1-Y2)^2) |
15.01.2006, 17:27 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
да, правильно. я в другом месте ступил
Mefist добавил: вот что получилось, в млем случае вышло еще проще - у меня на карте может быть максимум 32 юнита обоих типов и 10 уровней абилки. надо еще что-то делать? (кроме переписывания условий) Код:
|
15.01.2006, 18:09 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
zibada
offline
Опыт: отключен
|
Цитата:
фиг там, это полновесные игровые объекты, которые надо создавать/удалять, которые кушают отдельный хэндл и т п.. имхо, в мало-мальски продвинутых скриптах лучше такие левые типы юзать по минимуму, а хранить пары чисел в явном виде. например, чтобы в периодическом цикле перемещать точку равномерно, что проще: set x = x + dx set y = y + dy или извращения типа MoveLocation(loc, GetLocationX(loc) + dx, GetLocationY(loc) + dy)? но это уже малость оффтоп.. |
|
15.01.2006, 18:34 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
43,563Активность: |
2NETRAT, location - в jass это точка, а не регион. В осальном - все верно. Когда вы вместо конкретной точке или группы указываете ФУНКЦИЮ (такую как "позиция такого-то юнита") всегда происходит создание объекта. И поскольку никакая переменная на него не ссылается, его невозможно удалить из памяти.
Что касается методов работы с группами... Кажется я когда-то тестировал, влияет ли какой-то способ на быстродействие - и особой разницы не было. Во всяком случае это точно несущественно для триггеров, если только они не на малых периодах. Поэтому и заморачиваться особо не надо. Если есть возможность все упростить и свести к GUI - так и надо сделать. Хотя Димон прав - в jass есть команда для заполнения группы вообще без участия точки - при помощи координат. |
15.01.2006, 21:47 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
DimonT глянь три вопроса которые я задавал - все ли верно. Мда, мне не очень понятно зачем структуру переделывать в обьект...
NETRAT добавил: Sergey да, я поправился, не в этом дело - разница незначительная весьма фигово что в варкрафте такие заморочки с глобальными обьектами, по видимому это было сделано для более удобной работы с триггерами, однако, в основном это как-то не по-людски |
15.01.2006, 21:58 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|