[СТАТЬЯ]Теория скриптописания на языке Jass.
|
|
SirNikolas | Дата: Вторник, 31 Января 2012, 13:57:51 | Сообщение # 26 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Нет, так просто все не получится. Чтобы точно узнать, утечна ли функция, нужно отключить ВСЕ триггеры на карте и запускать только ее. Есть ведь вполне нормальные триггеры, которые, например, создают крипов на линии, или дамми для заклинаний.
|
|
|
|
Ajaccio | Дата: Вторник, 31 Января 2012, 13:58:45 | Сообщение # 27 |
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
| Вот в простейшем виде. Разница с начальной цифрой - количество созданных, но не уничтоженных объектов. Это не обязательно утечка, если на карте 200 юнитов, то и число будет примерно 200, главное чтобы оно не росло. Ну или росло только на время, а потом возвращалось к обычному значению.
XOR EAX, EAX MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
|
|
|
|
Позитроныч | Дата: Понедельник, 06 Февраля 2012, 19:19:58 | Сообщение # 28 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| А если это число становится отрицательным? Получается,что удаляется больше, чем создаётся...)
|
|
|
|
Ajaccio | Дата: Понедельник, 06 Февраля 2012, 19:45:25 | Сообщение # 29 |
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
| Это объяснимо, просто таблица хэндлов изначально имеет примерно такой вид:
|..(разные объекты на карте)..|мой таймер, хэндл которого я взял за 0|..(новые объекты)..|
Если какой-либо из изначальных объектов будет уничтожен (умрет юнит, например), то игра освободит эту ячейку:
|..(разные объекты на карте)..|пустота|..(разные объекты на карте)..|мой таймер, хэндл которого я взял за 0|..(новые объекты)..|
Поэтому локация, которую я использую для определения числа созданных хэндлов, может быть определена в это место:
|..(разные объекты на карте)..|моя локация|..(разные объекты на карте)..|мой таймер, хэндл которого я взял за 0|..(новые объекты)..|
Разница индексов хэндлов таймера и локации действительно даст отрицательный результат. Именно поэтому рекомендуют проводить испытания на пустой карте и только с нужным триггером (и это не гарантия решения проблемы). Можно просто выводить максимальный хэндл, что решит проблему, но будет неудобно смотреть на число вида 10095084.
XOR EAX, EAX MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
|
|
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 18:58:25 | Сообщение # 30 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| Получается, само по себе появление отрицательного числа не свидетельствует о наличии утечных объектов? Добавлено (07 Февраль 2012, 18:58:25) --------------------------------------------- " Code local boolexpr f = Condition(function MyFunc) call GroupEnumUnitsInRange(group, x, y, r, f)
Здесь мы просто собираем юнитов в группу, но согласно условию MyFunc. Иначе говоря, Warcraft перебирает всех юнитов на расстоянии r от точки (x; y), для каждого запускает функцию f и, если она вернёт true, то группа увеличивается на одного юнита. Также можно писать так:
Code call GroupEnumUnitsInRange(group, x, y, r, Condition(function MyFunc)) " А можно вместо функции написать какое-нибудь условие,например, call GroupEnumUnitsInRange(group, x, y, r, Condition(1==1)) ?
|
|
|
|
SirNikolas | Дата: Вторник, 07 Февраля 2012, 19:00:14 | Сообщение # 31 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Позитроныч) call GroupEnumUnitsInRange(group, x, y, r, Condition(function MyFunc)) conditionfunc лучше удалять через DestroyBoolexpr(...).Quote (Позитроныч) call GroupEnumUnitsInRange(group, x, y, r, Condition(1==1)) Нельзя.
|
|
|
|