Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Лагает спелл, нужна помощь
Написал намедни триггерный близнец стандартного близзарда, чтобы колбасить юнитов не в конкретных значениях, а в процентах к текущему хп каждого юнита и персонально вешать замедление 70% на 6 сек.
Протестировал с помощью многократных одновременных вызовов по мобам, и значение фпс за считанные секунды падало с 65 до 18 за 5-10 применений. Видимо, есть утечки. Нужна помощь, копал немало, но обычно добавление удаления точки сразу после создания или ещё где-либо, кроме как в конце, ломало спелл, т.е. заклинание переставало действовать вообще. Судя по всему, подвисал поток. Заюзал кэш впервые, в джассе новичок. Видимо, совсем индийский код получился. Может быть, траббл в том, что цикл для EnumUnit() не удаляет даммиков-слоуверов? Если ставить ремувюнит без слипэкшн, то никакого слоу не наложится. Если проблема действительно в удалении, то стоит ли добавить Expiration Timer каждому даммику? Нужен совет разбирающихся в джассе людей. ЗЫ: Спеллкаст вызывается другим динамическим триггером, который отслеживает способ запуска спелла (есть активный скилл - с обычными параметрами и пассивный скилл - более мощный, но с малым шансом, естественно, параметры передаются в запускающую функцию). Код:
Preveder добавил: Тему можно закрыть, уже разобрался сам в этом ужасном потоке кода :) |
18.04.2009, 00:21 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,880Активность: |
Preveder, лагает из-за кеша. Я бы посоветовал тебе использовать таймеры, а не триггеры. И аттачить через кэш нельзя, при малых периодах. Например создай по массиву для всех твоих аттачей (Waves,NumTimes...) и для таймера. Потом просто находишь индекс истекшего таймера и достаешь соответствующие ему значение из остальных массивов.
|
18.04.2009, 00:29 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Период вроде бы не совсем малый... 0.90 сек. Видел спеллы, где кэш использовали и на 0.05 (притягивания вские) и вроде бы не лагало. Мне помогли следующие преобразования: к даммикам подставил Код:
спецэффекты заменил более элегантной конструкцией Код:
Ну и убрал обнуление не-хендловых переменных по совету из статьи http://xgm.guru/forum/showthread.php?t=18742 Если проблема в кэше, то это танцы с бубном, конечно, но помогло, как ни странно! Теперь фпс падает только во время самого действа и ненамного (с 65 до 58 примерно) и восстанавливается полностью после окончания спелла. Проверял даже восьмикратным одновременным запуском. Причем суть, видимо, была в неудалявшихся даммиках и эффектах, т.к. проседал фпс только в том случае, если камера висела над местами, где происходил многократный запуск спелла. В итоге код запуска спелла получился такой: Код:
Отредактировано Preveder, 18.04.2009 в 11:24. |
|
18.04.2009, 11:14 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Артте
Open up your eyes
offline
Опыт:
24,373Активность: |
Сразу виден прогресс, молодец, раз разобрался |
18.04.2009, 11:33 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sunn
To feel joy, not be blue
offline
Опыт:
4,975Активность: |
Код:
Убейте меня ап стену, если после обнуления указателя при его помощи можно удалять обьект, на который он указывал |
18.04.2009, 13:54 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Артте
Open up your eyes
offline
Опыт:
24,373Активность: |
Xenosapien
я скажу почему на это никто не указал..никто не читал код, ибо он слишком громоздкий |
18.04.2009, 14:09 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Если ставить ремувы выше обнуления, спелл перестаёт работать. 1 раз польёт дождичком и всё. Вообще, если эти ремувы поставить где-либо, кроме как в самом конце, работать он не будет. |
|
18.04.2009, 18:22 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
Preveder а если так то утечек у тебя до фига. Если не работает, значит что-то в корне не правильно
|
18.04.2009, 18:30 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
agentex
offline
Опыт:
34,534Активность: |
Цитата:
извини, но производить операции с обьектом после обнуления его хендла - полный бред) возможно машина слабая, но врядли лаги изза кеша |
|
18.04.2009, 19:11 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
А если убрать гордость подальше и засунуть следующее:
Код:
Больше 10 секунд у меня ни один близзард не кастится. ЗЫ: Лаги почти совсем пропали, остался вопрос изящности кода... Спокойно держит 15 одновременных (0.10 задержка перед каждым применением, приказ триггером 15-ти футманам) применений, фпс просаживаются на 5-6 ед. и быстро восстанавливаются обратно. Отредактировано Preveder, 18.04.2009 в 21:11. |
18.04.2009, 20:59 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
107,539Активность: |
Цитата:
вообще то это нельзя использовать в спелах) т.е. его лучше вообще не использовать ADOLF добавил: локалки скалярных типов обнулять не нужно ADOLF добавил: SCV потенциально багаопасен, кешь можно впринципе юзать нормально, но можно его и не юзать) |
|
19.04.2009, 13:52 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Прочитав инфу про точки, переделал спелл под координаты ху и отпала нужда ремувить и обнулять.
Интересует принцип удаления локаций. Если мы вызываем функцию, которая создаёт эффект где-либо, а в качестве аргумента укажем следующее: Код:
Будет ли протекать GetUnitLoc(u) в таком случае? Как я понимаю, одной функцией передаётся ссылка на определённую точку, и она же (эта самая точка с ссылкой) в другой функции удаляется. Локального хендла нет, обнулять не нужно. Так? Из статьи-дополнения к основной статье по джассу не до конца ясно, утверждается что GetUnitLoc(u) гадит. Отредактировано Preveder, 20.04.2009 в 10:13. |
20.04.2009, 10:07 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
107,539Активность: |
удалять надо обьекты, обнулять локалки но не аргументы |
20.04.2009, 13:24 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
agentex
offline
Опыт:
34,534Активность: |
GetUnitLoc создает точку, изза этого утечка. Но если написать так:
Код:
утечки не будет, так как мы заносим созданную точку в локалку и в конце уничтожаем ее. Одно но- точки бред, чем тебе GetUnitX/Y не нравятся? |
20.04.2009, 13:30 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
107,539Активность: |
в примере из поста №12 утечек нет к слову |
20.04.2009, 13:33 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
В общем да, задница с точками, однако. Спасибо, буду юзать только координаты. |
20.04.2009, 14:38 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|