![]()
Preveder
StarCraft II® Inside
![]() offline
Опыт:
1,927Активность: |
Лагает спелл, нужна помощь
Написал намедни триггерный близнец стандартного близзарда, чтобы колбасить юнитов не в конкретных значениях, а в процентах к текущему хп каждого юнита и персонально вешать замедление 70% на 6 сек.
Протестировал с помощью многократных одновременных вызовов по мобам, и значение фпс за считанные секунды падало с 65 до 18 за 5-10 применений. Видимо, есть утечки. Нужна помощь, копал немало, но обычно добавление удаления точки сразу после создания или ещё где-либо, кроме как в конце, ломало спелл, т.е. заклинание переставало действовать вообще. Судя по всему, подвисал поток. Заюзал кэш впервые, в джассе новичок. Видимо, совсем индийский код получился. Может быть, траббл в том, что цикл для EnumUnit() не удаляет даммиков-слоуверов? Если ставить ремувюнит без слипэкшн, то никакого слоу не наложится. Если проблема действительно в удалении, то стоит ли добавить Expiration Timer каждому даммику? Нужен совет разбирающихся в джассе людей. ЗЫ: Спеллкаст вызывается другим динамическим триггером, который отслеживает способ запуска спелла (есть активный скилл - с обычными параметрами и пассивный скилл - более мощный, но с малым шансом, естественно, параметры передаются в запускающую функцию). Код:
Preveder добавил: Тему можно закрыть, уже разобрался сам в этом ужасном потоке кода :) |
![]() |
#1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Hellfim
Новичок
![]() ![]() offline
Опыт:
79,707Активность: |
Preveder, лагает из-за кеша. Я бы посоветовал тебе использовать таймеры, а не триггеры. И аттачить через кэш нельзя, при малых периодах. Например создай по массиву для всех твоих аттачей (Waves,NumTimes...) и для таймера. Потом просто находишь индекс истекшего таймера и достаешь соответствующие ему значение из остальных массивов.
|
![]() |
#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. |
|
![]() |
#3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Артте
Open up your eyes
![]() ![]() offline
Опыт:
23,423Активность: |
Сразу виден прогресс, молодец, раз разобрался |
![]() |
#4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Sunn
To feel joy, not be blue
![]() ![]() offline
Опыт:
4,975Активность: |
Код:
Убейте меня ап стену, если после обнуления указателя при его помощи можно удалять обьект, на который он указывал |
![]() |
#5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Артте
Open up your eyes
![]() ![]() offline
Опыт:
23,423Активность: |
Xenosapien
я скажу почему на это никто не указал..никто не читал код, ибо он слишком громоздкий |
![]() |
#6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Preveder
StarCraft II® Inside
![]() offline
Опыт:
1,927Активность: |
Цитата:
Если ставить ремувы выше обнуления, спелл перестаёт работать. 1 раз польёт дождичком и всё. Вообще, если эти ремувы поставить где-либо, кроме как в самом конце, работать он не будет. |
|
![]() |
#7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
MF
Что-то вокруг не так
![]() ![]() offline
Опыт:
26,594Активность: |
Preveder а если так то утечек у тебя до фига. Если не работает, значит что-то в корне не правильно
|
![]() |
#8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
agentex
![]() offline
Опыт:
34,834Активность: |
Цитата:
извини, но производить операции с обьектом после обнуления его хендла - полный бред) возможно машина слабая, но врядли лаги изза кеша |
|
![]() |
#9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Preveder
StarCraft II® Inside
![]() offline
Опыт:
1,927Активность: |
А если убрать гордость подальше и засунуть следующее:
Код:
Больше 10 секунд у меня ни один близзард не кастится. ЗЫ: Лаги почти совсем пропали, остался вопрос изящности кода... Спокойно держит 15 одновременных (0.10 задержка перед каждым применением, приказ триггером 15-ти футманам) применений, фпс просаживаются на 5-6 ед. и быстро восстанавливаются обратно. Отредактировано Preveder, 18.04.2009 в 21:11. |
![]() |
#10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
adic3x
![]() offline
Опыт:
108,439Активность: |
Цитата:
вообще то это нельзя использовать в спелах) т.е. его лучше вообще не использовать ADOLF добавил: локалки скалярных типов обнулять не нужно ADOLF добавил: SCV потенциально багаопасен, кешь можно впринципе юзать нормально, но можно его и не юзать) |
|
![]() |
#11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Preveder
StarCraft II® Inside
![]() offline
Опыт:
1,927Активность: |
Прочитав инфу про точки, переделал спелл под координаты ху и отпала нужда ремувить и обнулять.
Интересует принцип удаления локаций. Если мы вызываем функцию, которая создаёт эффект где-либо, а в качестве аргумента укажем следующее: Код:
Будет ли протекать GetUnitLoc(u) в таком случае? Как я понимаю, одной функцией передаётся ссылка на определённую точку, и она же (эта самая точка с ссылкой) в другой функции удаляется. Локального хендла нет, обнулять не нужно. Так? Из статьи-дополнения к основной статье по джассу не до конца ясно, утверждается что GetUnitLoc(u) гадит. Отредактировано Preveder, 20.04.2009 в 10:13. |
![]() |
#12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
adic3x
![]() offline
Опыт:
108,439Активность: |
удалять надо обьекты, обнулять локалки но не аргументы |
![]() |
#13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
agentex
![]() offline
Опыт:
34,834Активность: |
GetUnitLoc создает точку, изза этого утечка. Но если написать так:
Код:
утечки не будет, так как мы заносим созданную точку в локалку и в конце уничтожаем ее. Одно но- точки бред, чем тебе GetUnitX/Y не нравятся? |
![]() |
#14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
adic3x
![]() offline
Опыт:
108,439Активность: |
в примере из поста №12 утечек нет к слову |
![]() |
#15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Preveder
StarCraft II® Inside
![]() offline
Опыт:
1,927Активность: |
В общем да, задница с точками, однако. Спасибо, буду юзать только координаты. |
![]() |
#16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|