Читал стать по оптимизации, работаю до сих пор на ГУИ, да такой вот ленивый не перехожу на Джаз, но утечки замучали с вытекающими последствиями. Планирую немного подчистить код, если я правильно я понял то каждое обращение к юниту, например в в цикле " пока не....", запоминается, будет ли эффект чистки памяти, если после выбора юнита, я за ним закрепляю переменную и потом её обнуляю, или само по себе обращение уже проблема?
Или же триггер определяющий при определенных условиях атакующего, если атакующего перед действиями забить в переменную, а потом обнулить, будет ли это фиксом утечки? Или же подобными методами я лишь добавлю переменные, которые просто будут сами себя компенсировать, не влияя на начальные обращения к юнитам?

Alexander69, xgm.guru/p/wc3/optimisations
внимательно прочти то что там написано
особенно про переменные
если коротко то объект не может быть удалён из памяти пока используется (хранится в переменных/хэше/кэше)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
20
Alexander69, уточни, может не надо атакующих юнитов оптимизировать, не все функции утечны.
12
Yury13, насколько я понял из статей, любое обращение к юниту - утечка...
13
Alexander69, нет, если ты просто обратился к GetTriggerUnit() - утекать ничего не будет. Но если ты обратился к переменной, которая объявлена, как var = GetTriggerUnit(), то и не обнулил ее в итоге - получаешь утечку.
12
NekoriDes, и это даже в гуи? Если использую "атакованный", "входящий" и подобное, а потом с этим делаю действия?
13
Alexander69, конвертируй в текст то, что делаешь на гуи и смотри, чтобы понять. Разницы там нет, гуи - это интерфейс и не более.
Проще говоря, если у тебя Перменная = Входящий юнит и ты ее не обнулил - это утечка. Если ты просто использовал Входящего юнита, без переменной - утечки не будет.
12
NekoriDes, а считается ли такой переменной например область, к которой обращаешься? Например юнит входит в такую-то область, когда я использовал библтиотеку на оптимизацию ряд триггеров забаглся, особенно те которые были через области, отряды
13
Alexander69, там нет утечки, потому твои области уже были созданы в редакторе.
12
NekoriDes, тогда чего стоит действительно опасаться? Вот карта, в чем её проблема, в чем причина фаталлов через 1-1,5 игры? Ккак с эти бороться?
Загруженные файлы
15
Тебе будет проще подсказывать по конкретным вопросам. Ты говоришь, что тебе что-то там неясно. Неясность - это всегда вопрос. Так вот формулируй их, и снова иди на Q/A и тебе разжуют!!!!!!!!!!!
Тебе рассказать что такое переменная? Или что она хранит в себе?
На примере того же GetTriggerUnit()- нативная фукнция, написанная близзардами, функция, которая вернет ссылку(область памяти) в которой располагается сей объект (объект). Помни, это существующий объект. Он уже занимает место в памяти (пусть будет это ячейка 1000). Этот объект-юнит не утекает, ни притекает, не вытекает, вообще не течет) Что мы делаем дальше?! А мы определяем переменную типа unit T и инициализируем ее. Тебе компилятор выделит память под эту переменную (пусть будет это ячейка 1100) .К слову, почему компилятор не разрешает исползовать одинаковые имена переменных? Потому что имя переменной- это ее идентификатор. Компилятор не распознает твои закорючки- имя переменной компилятор использует как ее адрес. А по этому адресу распологается ссылка.
Что мы имеет в сухом остатке? Юнит-объект, лежащий по адресу 1000. Переменная T типа unit, которая удобно устроилась в ячейке 1100. И получается когда мы пишем вот так:
unit T=GetTriggerUnit() мы кладем по адресу 1100 адрес 1000. И при обращение к переменной T мы будем получать адрес 1000- наш юнит!
Далее утечки!
Все ок. Мы ужасно криво отлично сделали все дейсвтия. Пришел конец нашей функции, в которой мы исполняли дейсвтия. А куда же девается наша переменная и наш юнит? А никуда. Юнит как висел в памяти, так и висит в ячейки 1000. Его никак функция не колышит. (Ну если ты его не удалишь в действиях. Тогда ячейка 1000 освобождается и ее займет другой счастливый объект.) А ты скажешь. Хм а переменная? Ну стоит разделять локальные и глобальные. О глобальных я умолчу, ибо их обнулять не обязательно. А вот что касается локальных? Локальная переменная- та переменная, которая действует внутри функции, в которой она была определена и удаляется, когда функция подходит к концу. Но компилятор тебе зарезервировал слот 1100, помнишь?! Компилятор удаляет идентификатор. Ты скажешь: и в чем тут проблема. Удалил- это же хорошо?
Не-а. Не хорошо. Эта ячейка была зарезервирована. И несмотря на то, что ты кончил функцию, память остается висеть. Как 1100 была зарезервирована. Как в ней лежала ссылка на объект по андресу 1000- так и лежит. Как этого избежать? Обнули. Положи туда null.
28
Alexander69, xgm.guru/p/wc3/optimisations
внимательно прочти то что там написано
особенно про переменные
если коротко то объект не может быть удалён из памяти пока используется (хранится в переменных/хэше/кэше)
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.