JaBeN_Симфер
offline
Опыт:
20,050Активность: |
Юнит атакован - Юнит получает урон
Изменено
Данная статья подробно опишет способ избавления от утечек при использовании событий Юнит атакован и Юнит получает урон в связке.
Суть в том, что на ГУИ в данном случае при каждой атаке мы создаем новый триггер и новое действие, которые засоряют память, если их не удалять. Статья требует минимальные знания Jass, чтобы уметь применить этот способ в своей карте. 1. НачалоСоздаем новую карту, удаляем стандартный триггер и создаем новый триггер event damaged.
Добавляем в него событие юнит атакован и конвертируем в jass. Получаем:
Теперь мы создадим действие, которое будет выполняться при получении урона по атакованному юниту, и условие для выполнения этого действия, и поместим их выше нашего триггера:
Теперь мы создадим действия, которые будут создавать триггер с действиями в Add_Damage и условием Tr_Conditions после события атаки.
Данный код можно было выполнить и на ГУИ, с этим ни у кого проблем не возникнет, а проблемы начинаются дальше, когда мы замечаем, что количество утечек быстро растет.
Теперь перед нами возникает задача по удалению созданного триггера и действия после того, как он нам уже не нужен. 2. Сохранение и удалениеТ.к. у атакующего юнита в один момент может быть только одна цель, то мы можем привязать наши действия к его GetHandleId, чтобы потом их удалить.
Нам нужно создать глобальную переменную Hash (в jass udg_Hash) типа hashtable, создать триггер с событием инициализации, и вставить в Custom script эту строку, чтобы инициализировать таблицу:
Мы будем сохранять в Hash созданный триггер и действие:
Числа 1 и 2 в call SaveTriggerHandle(udg_Hash, h2i, 1, t) и SaveTriggerActionHandle(udg_Hash, h2i, 2, TriggerAddAction(t, function Add_Damage)) могут быть другими - это как пример. Мы просто используем ключ ячейки Хеш-таблицы.
Сейчас нам надо сделать удаление сохраненных действий после того, как выполнятся все действия при получении урона. Для этого создадим новую функцию и будем ее использовать в коде:
Теперь сделаем такое условие, чтобы не выполнялись действия, если:
Оптимизируем событие Юнит атакован, раскрыв BJ-функцию
У нас получился такой код:
3. МертвякиЧтобы не хранить сохраненные действия мертвых юнитов, мы создадим еще один триггер, который будет их отчищать.
Создаем триггер death, добавляем событие юнит умирает, а в действиях вставляем в Custom Script это:
4. УтечкиДля того, чтобы видеть, есть ли у нас утечки памяти или нет, существует такая конструкция, которая показывает увеличение количества объектов на карте.
Для этого создадим глобальную переменную i_test типа integer. В нее будет заноситься максимальное число объектов на карте. Создадим пустой триггер и назовем его check, конвертируем его в jass и вставляем в него этот код:
В игре будут выводиться цифры, если максимальное количество объектов увеличилось. Триггер будет запускаться каждые 0.1 секунду, этого вполне достаточно, чтобы точно определить наличие утечек. Отредактировано JaBeN_Симфер, 20.03.2010 в 22:47. |
16.03.2010, 21:01 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FEARSTARTER
desert eagle
offline
Опыт:
19,284Активность: |
Полезная статья, год назад она можетбыть спаслабы одну мою карту...
|
16.03.2010, 22:00 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Alonix
*null*
offline
Опыт:
26,861Активность: |
Хорошая статья для тех,кто задает вопросы:"как избавиться от утечек" и т.п.А также она может помочь обычным картостроителям.В общем,время потраченое на статью потрачено не зря! |
17.03.2010, 05:14 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
до 8191 Стоило бы ещё добавить что триггер полностью из памяти всё равно не удаляется, так что перегружать этот механизм не надо, дальше:
Обычно заменяется на
Надо сказать, что массивы udg_Trigger, udg_Condition, udg_Action вообще не нужны, т.к. есть GetTriggeringTrigger, GetEventDamageSource, GetTriggerUnit, этих ф-ий вполне достаточно чтобы приаттачить напрямую к объекту всё что нужно без использования ненадёжной (в данном случае, так как переполнение никак не фиксируется и не "рехешируется") системы массивов. Так что велосипед лучше не изобретать, структуры и/или хеш-таблицы для этого есть.
FellGuard добавил: Если автор заменит в статье кривые массивы на хеш-таблицы/структуры, статью можно в базу, так-то она хорошая. |
17.03.2010, 08:11 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Да Ну... У меня на группах без хеша/массивов и все работает. |
17.03.2010, 08:45 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
что у тебя на группах? аттач триггера unit takes damage куда и как? |
17.03.2010, 08:49 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Нет. Просто при добавлении события проверяется наличие в группе если нет, то добавляем в группу. Через нужное время тригер пересоздаем. |
17.03.2010, 09:04 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
XOR
offline
Опыт:
38,284Активность: |
Многабукф ниачем. Статья не нужна имхо, хороший жассер дойдет сам, а гуишники получят еще повод изучить жасс. |
17.03.2010, 09:19 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
zero index
Фантома же!
offline
Опыт:
886Активность: |
статья очень пригодилась но не по своему назначению, а как урок джасса) все что в статье постараюсь запомнить, автору спс... |
17.03.2010, 14:11 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
говно запостили, данный пример это то как НИ В КОЕМ СЛУЧАЕ нельзя делать.
мало того что куча совершенно ненужного, так еще и технология отстала на 5 лет, учитесь у буржуев.
ах да, это всё делается одним триггеров в джаз и двумя на гуи. |
17.03.2010, 15:34 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
JaBeN_Симфер
offline
Опыт:
20,050Активность: |
Это в JNGP? ну тогда сами исправьте, т.к. это не существенно, да и понадобился он тут только для объявления 2х глобалок.
FellGuard:
Буду рад, если ты поможешь, а точнее объяснишь принцип реализации.
Если бы кто-то в свое время написал эту статью для меня, я был бы очень благодарен, т.к. сам зная джасс долго не мог найти решение, и уверен, что найдутся те, кто еще не раз задаст вопрос о том, как тут избавиться от утечек. Хорошая статья или плохая - ваше мнение, в любом случае, она наталкивает на определенные мысли, а способ реализации - это дело каждого. Я же не сказал, что это единственный и идеальный способ, просто для меня он удобен по сей день.
DioD, ты напиши пример, и всех научи, как надо делать, а то мы тут все отстали на 5 лет, а другой статьи на эту тему пока нет.
Сейчас ввел в поиск "юнит атакован" и на первой же странице нашел более 10 близких вопросов, кроме этого можно найти еще множество конкретных вопросов по этой теме.
К тому же теперь есть конкретный пример, на который можно направить тех, кто задает вопрос: как узнать, если у меня утечки или нет?
Если доказательство того, что глобальные массивы быстрее, чем хеш - верно, то может возникнуть ситуация, когда быстродействие такой конструкции будет важнее красивого способа реализации. Отредактировано JaBeN_Симфер, 17.03.2010 в 17:22. |
17.03.2010, 16:53 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
sonicscream
offline
Опыт:
773Активность: |
Статья не только отличная, но ещё и уникальная. На этом сайте аналогов не видел... |
17.03.2010, 17:44 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
к буржуям на сайт сходи, и статья на системы не пишут, выкладывают систему, а в системе комменты и этого достаточно.
а то что вы страдаете говном всяким это ваши проблемы.
вот вам карта, ей три года (если не четыре) смотрите и учитесь как надо делать.
хотя сейчас технологии шагнули куда дальше, очень многое теперь делается проще и красивее благодаря хеш таблицам. |
17.03.2010, 21:05 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
JaBeN_Симфер
offline
Опыт:
20,050Активность: |
DioD, ты видимо у буржуев часто бываешь, а сам что-нибудь можешь? Вот возьми свой прикрепленный шлак и сделай из него систему, запости ее в барахолке, и пусть пылится. |
17.03.2010, 21:10 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
agentex
offline
Опыт:
34,534Активность: |
в этой связке никогда не было утечек, или я чегото пропустил О_О или вы юзаете динамик тригеры и потом удивляетесь что откудато появляются утечки? ололо одним словом. |
17.03.2010, 21:22 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
ты почитай кредиты у буржуев, внезапно обнаружишь мой ник в половине систем, то что ты запостил говно, а нубы хвалят не значит что ты сделал чтото хорошее.
да и еще, в барахолке пылятся гораздо более весёлые наработки, ты видимо просто не искал (руки кривоваты)
DioD добавил: эту тупейшую связку всегда юзают на гуи, а так как известно утечек нет и никогда не было. |
17.03.2010, 21:24 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
JaBeN_Симфер
offline
Опыт:
20,050Активность: |
DioD, в отличии от тебя, я не ставил перед собой задачу удивить всех, какие я умею делать наработки, а просто захотел помочь нескольким людям, и если мой труд кому-то помог, то значит он проделан не зря, а он помог. я не ищу, наработки для себя я делаю сам. agentex, тут речь и идет о динамик триггерах, т.к. не все знают, как бороться с возникшими утечками. |
17.03.2010, 21:30 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
ты даже не знаешь что триггеркондишины не создают утечек, как ты может помочь людям если толкаешь им ложные сведения, ты ведь даже не тестировал свой код. Отредактировано Кет, 19.03.2010 в 00:58. |
17.03.2010, 21:37 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
sonicscream
offline
Опыт:
773Активность: |
DioD,
я видел то, што ты выложил, это никак не поможет тем, кто кто плохо шарит в jass, а JaBeN_Симфер разжевал (если можно так сказать) решение актуальной задачи, возникающей перед мапмэйкером.
два: легче простого написать кг/ам, что ты и сделал + рекламнул свои системы три: нубов всегда больше, продвинутым джазерам вот [плохое слово] твои системы [+] 1 пункт от Кет: 1.1 (ненормативная лексика)
Отредактировано Кет, 19.03.2010 в 00:58. |
17.03.2010, 23:08 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
DioD, хамить изволите, аяяй.
Если при событии получения повреждений невозможно определить каким путём получено повреждение (атака, способность, предмет, аура ...) то всё построение держится на предположении, что снаряд долетит до цели раньше, чем атакующий сделает что либо ещё.
Использованием орб-эффекта можно обойти эту проблему. Без орба вроде никак. И ещё: наугад метить в ограниченный массив излишне самонадеянно. |
17.03.2010, 23:29 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|