Читал стать по оптимизации, работаю до сих пор на ГУИ, да такой вот ленивый не перехожу на Джаз, но утечки замучали с вытекающими последствиями. Планирую немного подчистить код, если я правильно я понял то каждое обращение к юниту, например в в цикле " пока не....", запоминается, будет ли эффект чистки памяти, если после выбора юнита, я за ним закрепляю переменную и потом её обнуляю, или само по себе обращение уже проблема?
Или же триггер определяющий при определенных условиях атакующего, если атакующего перед действиями забить в переменную, а потом обнулить, будет ли это фиксом утечки? Или же подобными методами я лишь добавлю переменные, которые просто будут сами себя компенсировать, не влияя на начальные обращения к юнитам?
Или же триггер определяющий при определенных условиях атакующего, если атакующего перед действиями забить в переменную, а потом обнулить, будет ли это фиксом утечки? Или же подобными методами я лишь добавлю переменные, которые просто будут сами себя компенсировать, не влияя на начальные обращения к юнитам?
Принятый ответ
Alexander69, xgm.guru/p/wc3/optimisations
внимательно прочти то что там написано
особенно про переменные
если коротко то объект не может быть удалён из памяти пока используется (хранится в переменных/хэше/кэше)
внимательно прочти то что там написано
особенно про переменные
если коротко то объект не может быть удалён из памяти пока используется (хранится в переменных/хэше/кэше)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. EnergyFrost
К слову джаз- музыкальное направление. джасс- ЯП
переменная=атакующий юнит
переменная =0
EnergyFrost, пробовал, значительная часть тригеров перестала работать, касается особенно обращений к областям, например юнит выходит из области и вернуть его.
Ред. NekoriDes
Ред. EnergyFrost
Что мы имеет в сухом остатке? Юнит-объект, лежащий по адресу 1000. Переменная T типа unit, которая удобно устроилась в ячейке 1100. И получается когда мы пишем вот так:
unit T=GetTriggerUnit() мы кладем по адресу 1100 адрес 1000. И при обращение к переменной T мы будем получать адрес 1000- наш юнит!
Все ок. Мы
ужасно кривоотлично сделали все дейсвтия. Пришел конец нашей функции, в которой мы исполняли дейсвтия. А куда же девается наша переменная и наш юнит? А никуда. Юнит как висел в памяти, так и висит в ячейки 1000. Его никак функция не колышит. (Ну если ты его не удалишь в действиях. Тогда ячейка 1000 освобождается и ее займет другой счастливый объект.) А ты скажешь. Хм а переменная? Ну стоит разделять локальные и глобальные. О глобальных я умолчу, ибо их обнулять не обязательно. А вот что касается локальных? Локальная переменная- та переменная, которая действует внутри функции, в которой она была определена и удаляется, когда функция подходит к концу. Но компилятор тебе зарезервировал слот 1100, помнишь?! Компилятор удаляет идентификатор. Ты скажешь: и в чем тут проблема. Удалил- это же хорошо?Не-а. Не хорошо. Эта ячейка была зарезервирована. И несмотря на то, что ты кончил функцию, память остается висеть. Как 1100 была зарезервирована. Как в ней лежала ссылка на объект по андресу 1000- так и лежит. Как этого избежать? Обнули. Положи туда null.
внимательно прочти то что там написано
особенно про переменные
если коротко то объект не может быть удалён из памяти пока используется (хранится в переменных/хэше/кэше)