XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
NCrashed

offline
Опыт: 13,553
Активность:
[сJass] Не пойму где утечка
Каждые 0.25 секунды выполняется эта функция (точнее метод), отвечающая за прорисовку пружины. Она создает эффекты на прямой между двумя объектами.
.b;.a - тела на концах пружины
.IsBTP() - функция проверяющая к точке или телу привязана пружина
Через 5 мин игра виснет безбожно. Проверял на 23 версии с помощью счетчика хендлов, их число стабильно. Пожалуйста помогите найти утечку, а то я уже голову сломал =).
    void Render(bool ReDrawAll) {
        if ReDrawAll {
            if not .IsBTP() {
                real spr = SquareRoot( (.b.x-.a.x)*(.b.x-.a.x)+(.b.y-.a.y)*(.b.y-.a.y)+(.b.z-.a.z)*(.b.z-.a.z) ) 
                real nx = (.b.x-.a.x)/spr
                real ny = (.b.y-.a.y)/spr
                real nz = (.b.z-.a.z)/spr
            }else {
                spr = SquareRoot( (.x-.a.x)*(.x-.a.x)+(.y-.a.y)*(.y-.a.y)+(.z-.a.z)*(.z-.a.z) ) 
                nx = (.x-.a.x)/spr
                ny = (.y-.a.y)/spr
                nz = (.z-.a.z)/spr
            }
            int j = 1
            whilenot(j>.EffI){
                if .Effects[j] != null {
                    DestroyEffect(.Effects[j])
                    .Effects[j] = null 
                }
            j++
            }
            .EffI = 0
            j=0
            real i = .EffStep
            destructable platform
            whilenot(i>spr){
                    j++
                     platform = CreateDestructableZ( 'OTis', .a.x + nx*i, .a.y + ny*i,.a.z + nz*i + GetZ(.a.x + nx*i,.a.y + ny*i),0,1.,0)
                    .Effects[j] = AddSpecialEffect( .EffStr, .a.x + nx*i, .a.y + ny*i)
                    RemoveDestructable(platform)
                    platform = null
            i+=.EffStep
            }
            .EffI = j
            platform = null
        }
    }
Старый 26.12.2009, 18:27
Artas Undead

offline
Опыт: 568
Активность:
.Effects[j] = AddSpecialEffect( .EffStr, .a.x + nx*i, .a.y + ny*i)
Эффект создается, а обнуления нет. О_о
И ещё. Может у меня глюки, но почему тут:
            if not .IsBTP() {
                real spr = SquareRoot( (.b.x-.a.x)*(.b.x-.a.x)+(.b.y-.a.y)*(.b.y-.a.y)+(.b.z-.a.z)*(.b.z-.a.z) ) 
                real nx = (.b.x-.a.x)/spr
                real ny = (.b.y-.a.y)/spr
                real nz = (.b.z-.a.z)/spr
Есть тип переменных, а тут:
            } else {
                spr = SquareRoot( (.x-.a.x)*(.x-.a.x)+(.y-.a.y)*(.y-.a.y)+(.z-.a.z)*(.z-.a.z) ) 
                nx = (.x-.a.x)/spr
                ny = (.y-.a.y)/spr
                nz = (.z-.a.z)/spr
Нету О_о
И зачем тут:
            whilenot(i>spr){
                    j++
                     platform = CreateDestructableZ( 'OTis', .a.x + nx*i, .a.y + ny*i,.a.z + nz*i + GetZ(.a.x + nx*i,.a.y + ny*i),0,1.,0)
                    .Effects[j] = AddSpecialEffect( .EffStr, .a.x + nx*i, .a.y + ny*i)
                    RemoveDestructable(platform)
                    platform = null
            i+=.EffStep
            }
            .EffI = j
            platform = null
Два обнуления "platform"?
Старый 26.12.2009, 19:08
NCrashed

offline
Опыт: 13,553
Активность:
  1. Про обнулени и уничтожение смотри
...
            int j = 1
            whilenot(j>.EffI){
                if .Effects[j] != null {
                    DestroyEffect(.Effects[j])
                    .Effects[j] = null 
                }
            j++
            }
            .EffI = 0
..
  1. с типом переменных все в порядке, оно парсится так что объявление переменной переносится наверх функции а в том месте остается инициализация.
  2. два обнуления было для дебага, забыл удалить
NCrashed добавил:
Смысл самой функции: оно удаляет старые эффекты из массива и создает зд прямую из эффектов снова, а потом при следующем вызове (это через 0.25 сек ) удаляет эти эффекты и тд
Старый 26.12.2009, 23:02
YellowStar
poon
offline
Опыт: 15,144
Активность:
Эффекты в пространстве делаи летающими юнитами, они жмут в памяти 0.004 кб, а дестракт - 0.012 кб , плюс он не очищается при удалении сразу (повесь на дудад эффект и удали дудад ранее посмотри на результат, тоже сделаи с юнитом и поимешь)
narayan добавил:
При создании эффекта ж плас перед эффектом, перед удалением после , 1 эффект теряется.
Старый 27.12.2009, 19:17
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 07:57.