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

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

Ответ
 
TiM
Старичок
offline
Опыт: 8,594
Активность:
Полезные команды.
Решил доделать карту и вот думаю начать с её оптимизации и уничтожению утечек.
В карте используется достаточно много функций "Pick every units", так вот, что и где нужно писать, чтобы при этом не происходило утечек.
И еще-я был бы рад, если бы мне(авось и не только мне) здесь написали несколько полезных моментов в оптимизации. Например-что каждый спецэффект так или иначе нужно уничтожать и любым локальным переменным в конце функции присваивать значение 0.

TiM добавил:
Пожалуйста ответьте.
Старый 17.03.2006, 23:26
Медведь
ФффыррфррфффФФфф!
offline
Опыт: 21,702
Активность:
Насчёт групп - в инициализации карты пропиши set bj_wantDestroyGroup = true
Дальше, обязательно ремувь точки (locations)
Старый 18.03.2006, 07:26
TiM
Старичок
offline
Опыт: 8,594
Активность:
как эти точки называются? И когда они создаются?
Старый 19.03.2006, 01:30
Медведь
ФффыррфррфффФФфф!
offline
Опыт: 21,702
Активность:
При триггерных действиях типа:
Создать юнита там-то
Передвинуть то-то туда-то
Polar Projection
Point with offset
Center of Region
и тому подобное автоматически создаются точки. Поскольку у них хэндл-тип, они тормозят игру. Их надо сначала загонять в переменные, а после использования ремувить и обнулять. Пример:
Код:
set TargetLoc = GetUnitLoc(TargetUnit)
//какие нить действия
call RemoveLocation(TargetLoc)
set TargetLoc=null
Старый 19.03.2006, 02:28
TiM
Старичок
offline
Опыт: 8,594
Активность:
Thanks.
Старый 19.03.2006, 04:38
KyLARaN

offline
Опыт: 1,082
Активность:
А что будет если не обнулять эту локацию???
Старый 18.05.2006, 19:54
Celebrate

offline
Опыт: 849
Активность:
Цитата:
Насчёт групп - в инициализации карты пропиши set bj_wantDestroyGroup = true

НЕ ТАК!!!
Custom Script: set bj_wantDestroyGroup = true надо ставить перед КАЖДЫМ пиком.
Смотрим blizzard.j:
Код:
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction


KyLARaN будет утечка. Вар будет "думать", что по адрессу этой переменной что-то хранится, и не будет туда ничего писать. Я проверял по РБ ссылкам.
Старый 18.05.2006, 21:20
KyLARaN

offline
Опыт: 1,082
Активность:
А такая ошмбка может вызвать сервер сплит, когда много таких переменных не обнуляется???
Старый 19.05.2006, 08:40
felix_ff

offline
Опыт: 757
Активность:
По идеи много накопившихся не обнуленных/уничтоженный объектов приведут к сильному торможению игры. насчет вылета я не уверен но это легко проверить попробуй в переодическом тригере циклом от 1 до 10 пикать какие либо группы юнитов и напрявлять в разные регионы...
через несколько секунд игра привратицца в ацтой. :)
Старый 19.05.2006, 11:23
Celebrate

offline
Опыт: 849
Активность:
KyLARaN по-идеи такая же утечка, как и другие.
Если юзаешь кеш (SCV), то память будет бешено засоряться стрингами.
Старый 19.05.2006, 20:23
Dead Jay
Братег Дракончег
offline
Опыт: 8,425
Активность:
А вот у меня возник вопрос:
Такой триггер будет удалять юнитов?
A unit умирает
Wait 40.00 sec
Remove (DyingUnit)

Dead Jay добавил:
А Order игру засоряет?

Dead Jay добавил:
А Create отрядами?
Старый 20.05.2006, 01:21
DioD

offline
Опыт: 45,134
Активность:
Цитата:
Сообщение от Celebrate
KyLARaN по-идеи такая же утечка, как и другие.
Если юзаешь кеш (SCV), то память будет бешено засоряться стрингами.



Ничего подобного, 99% джаза построена на РБ и засорения не происходит.

Кривые руки засоряют память и потеря ссылок на переменные, когда ретурн нулл удалить точку уже не получится.
Старый 20.05.2006, 05:54
Celebrate

offline
Опыт: 849
Активность:
DioD ты не понял.
Я имел ввиду, что если необнулять переменные и юзать кеш одновременно - т.е. тогда будут создаваться много новых строк.
Старый 20.05.2006, 10:07
DioD

offline
Опыт: 45,134
Активность:
Вот ты мне объясни, юнит х строка y значение z откуда тут будут новые строки, или каждый раз писать новую строку?
Старый 20.05.2006, 13:40
felix_ff

offline
Опыт: 757
Активность:
Цитата:
Сообщение от Dead Jay
А вот у меня возник вопрос:
Такой триггер будет удалять юнитов?
A unit умирает
Wait 40.00 sec
Remove (DyingUnit)

Dead Jay добавил:
А Order игру засоряет?

Dead Jay добавил:
А Create отрядами?



он будет удалять только последнего умершего юнита... для такого случая необходимо юзать локальные пеерменные типа
local unit u = GetDyingUnit()
Wait(40.00)
call RemoveUnit(u)
set u = null

ордер стринги это константные значения... имхо не могут.

CreateUnit ? или что? не совсем понял вопроса.
Старый 20.05.2006, 14:33
Celebrate

offline
Опыт: 849
Активность:
DioD простой пример:
Код:
function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing
   local timer t = CreateTimer()
   call DisplayTextToForce( GetPlayersAll(), I2S(H2I(t)) )
endfunction
Каждый раз при её запуске на экран будет выводится новая строка.
Если мы будем записывать в этой функции таймер в кеш, то мы каждый раз будем писать новую строку. А эта новая строка из памяти уже никуда не денется.

Код:
function taction takes nothing returns nothing
   local timer t = GetExpiredTimer()
   local integer i = H2I(t)
   call DisplayTextToForce( GetPlayersAll(), I2S(i) )
   call DestroyTimer(t)
   set t = null
endfunction

function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing
   local timer t = CreateTimer()
   call TimerStart(t, 3, false, function taction)
   call DisplayTextToForce( GetPlayersAll(), I2S(H2I(t)) )
   set t = null
endfunction

Если бы мы обнуляли t (как в этой функции, так и в той, которая уничтожит таймер), то строка была бы одна и таже! (естественно, не при перезапуске функции, а уже после того как таймер будет уничтожен - другой функцией)
Тоесть засорение стрингами было бы совсем незначительным.
Старый 20.05.2006, 16:20
NETRAT

offline
Опыт: 83,712
Активность:
Код:
local unit u = GetDyingUnit()
Wait(40.00)
call RemoveUnit(u)
set u = null
Нельзя так делать, ибо если в игре используюьтся спеллы типа Воскрешения или абилки типа Подбор Трупов Труповозки, то это будет полная лажа. И потом, не Wait а TriggerSleepAction и вообще это подвешенный поток, который будет стоять в очереди
Старый 21.05.2006, 00:34
felix_ff

offline
Опыт: 757
Активность:
NETRAT я хотел сначала написать для ГУИ... но потом решил на джассе и уж просто не усмотрел про вейт... :)

ну а про код... там например перед воскрешением можно сделать проверку : если юнит u мертв то ремувить .. иначе ничего не делать :p
Старый 21.05.2006, 01:20
NETRAT

offline
Опыт: 83,712
Активность:
Ага, а если он в труповозке? =0 не так все просто
Старый 21.05.2006, 01:49
DioD

offline
Опыт: 45,134
Активность:
Делать проверку перед воскрешением и если юнит попадает в транспорт.
Старый 21.05.2006, 10:20
Ответ

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

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

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

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



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