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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
KillUnit vs RemoveUnit
Собственно нужен ли RemoveUnit после KillUnit? Помню годик назад был разговор на эту темку и кажется пришли к выводу что ненужен, но т.к. я могу и ошибаться, то решил спросить вашего мнения.
P.S.: я лично проверил - сидел килял юнитов, не ремувя их минут 20-ть - лагов не было..но все же))

Отредактировано Vampirrr, 10.02.2010 в 03:54.
Старый 10.02.2010, 03:21
BLOOD ELF

offline
Опыт: 8,662
Активность:
Vampirrr,
Попробуй посмотреть так:
сначала киляй без ремува и посмотри в диспетчере задач сколько процесс игры ест оперативной памяти, потом попробуй эту процедуру с ремувом.
Старый 10.02.2010, 04:13
Virysru

offline
Опыт: 7,692
Активность:
Килять и ремувить вроде бы одно и тоже, с разницей что труп при убийстве постепенно исчезает.
Лаги не из-за этого бывают, а из-за неудаления спецэффектов, точек и пр.
Старый 10.02.2010, 04:15
Skino

offline
Опыт: 4,683
Активность:
Он автоматом ремувиться после смерти, если с нем не связано переменных(на счёт этого неуверен)
Старый 10.02.2010, 04:48
DioD

offline
Опыт: 45,134
Активность:
юнит ремувиться даже если на нём есть переменные, а вот хендл высвобождается только если переменных нет.
Старый 10.02.2010, 04:52
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Т.е. я могу положить на саму переменную, в которую забит юнит и главное хэндл зачищать не забывать?
Старый 10.02.2010, 07:08
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
попробуй такой тест. Каждые н секунд
Код:
local unit u = CreateUnit(params)
call DisplayTimedTextToPlayer(GetLocalPlayer(),0.,0.,0.,"unit handle: "+I2S(GetHandleId(u)))
call KillUnit(u)
set u = null // (!)
потом так
Код:
local unit u = CreateUnit(params)
call DisplayTimedTextToPlayer(GetLocalPlayer(),0.,0.,0.,"unit handle: "+I2S(GetHandleId(u)))
call KillUnit(u)
// без обнуления
потом то же самое, только с RemoveUnit() после KillUnit(). Что называется, ощутишь разницу.

Тест проводить на пустой карте где не создаётся никаких объектов и вообще желательно чтоб там ничего кроме этого теста не происходило.

FellGuard добавил:
Вообще рекомендуется даже всяких даммиков убивать (и прятать, при необходимости), игра доделает остальное. Ремув использовать не стоит... Надо так же обнулять все переменные типа unit, чтобы в памяти не было висячих ссылок и хэндл юнита становился снова свободным. Отдельно надо смотреть чтобы не было висячих ссылок в системах с кэшем/хеш-таблицами так как это чревато глюками и вообще неприятно (игра не отлавливает записанный в хэш-таблицу хендл объекта и не считает это повисшей ссылкой, так что если не удалять их оттуда вручную то может сложиться ситуация что по записанной ссылке в таблице будет получен уже не тот юнит (или не будет получен вообще) - если нужного юнита убили и игра его успешно ремувнула, а по освободившемуся хендлу, например, записало вообще какого-то левого свежесозданного юнита)
Старый 10.02.2010, 07:52
adic3x

offline
Опыт: 108,439
Активность:
Ремув использовать не стоит...
с каких это пор?
юнит ремувиться даже если на нём есть переменные, а вот хендл высвобождается только если переменных нет.
все правильно. если вы хотите узнать, сущетсвует ли юнит, на которого ссылается переменная (априори она не null) - GetUnitTypeID(u)==0x00
Собственно нужен ли RemoveUnit после KillUnit?
ненужен в том случае, если юнита убили естественным путем. он через некоторе время сам разложиться и исчезнет.
Старый 10.02.2010, 13:46
DioD

offline
Опыт: 45,134
Активность:
если так хочется мгновенно освободить ценные 4 килобайта памяти (или сколько там юнит стоит) ставьте ему тип смерти "не разлагается и без трупа"
Старый 10.02.2010, 17:07
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
А нечего в тдшках стандартные 88 время разложения костей в константах оставлять.
зига! - прим. адик

Отредактировано ADOLF, 10.02.2010 в 22:15.
Старый 10.02.2010, 17:22
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Спасибо всем большое, ситуация разъяснена, можно закрывать)
Старый 10.02.2010, 19:53
DioD

offline
Опыт: 45,134
Активность:
время разложения по нулям и юнит будет мгновенно удаляться после смерти.
Старый 10.02.2010, 20:00
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
угу, мне это как раз подходит)
Старый 11.02.2010, 02:55
Ответ

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

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

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

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



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