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

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

Ответ
 
KO3bMA

offline
Опыт: 45,024
Активность:
Вопросы про утечки и вообще...
имеем простую функцию, там нет цикла , но к ней периодически во время игры обращаются:
function Trig_HunterPlant1_Actions takes nothing returns nothing
    local location Offset 
    set Offset= ( PolarProjectionBJ(GetUnitLoc(udg_hero), 70.00, GetUnitFacing(udg_hero)) )
    call SetUnitPositionLoc( gg_unit_nfgt_0059, Offset )
    call SelectUnitForPlayerSingle( udg_hero, Player(0) )
    call TriggerSleepAction( 60.00 )
    call SetUnitPositionLoc( gg_unit_nfgt_0059, udg_MagicFlover )
    call RemoveLocation (Offset)
endfunction
вопрос 1 созданная точка имеет кроме координат еще какие то параметры в памяти, которые нужно уничтожать(polar)?
вопрос 2 в связи с вышесказанным уничтожается ли эта точка в памяти полностью с помощью call RemoveLocation (Offset)?
вопрос 3 нужно ли при этом обнулять offset?, если точка удалена из памяти
вопрос 4 , теоритический, чем лучше в плане утечек-тормозов, если я создаю юнита (Гг) и потом использую его, перед тем, что юнит с самого начала присутствует на карте, ведь он будет всю игру и с его смертью игра закончится?
Пожелания: напишите плз статью, более расширенную, но с конкретными примерами, про утечки, причем примеры как можно проще, даже с простыми триггерами, и вставками на джасс для оптимизации, пока такой статьи нет (прочитал статью Сергея, все ясно и понятно), потом Адольфа, и все сразу непонятно)))

Отредактировано ShadoW DaemoN, 08.08.2009 в 10:42.
Старый 05.08.2009, 17:09
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Я сейчас заплачу, какие ужасы =((
Если ты пишешь на Jass'e, то используй Real X,Y, а PolarProjection раскрывай на две Real'ки.
Ну и про TSA молчу.
Таймеру нужны.
Старый 05.08.2009, 17:13
KO3bMA

offline
Опыт: 45,024
Активность:
Ranger21, не надо плакать, надо ответить на вопрос , кстати, я не пишу на джасс
KO3bMA добавил:
то используй Real X,Y, а PolarProjection раскрывай на две Real'ки.
, а как заменить ето GetUnitFacing(udg_hero)?, это же все равно полярные координаты?
Старый 05.08.2009, 17:33
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
KO3bMA, GetUnitFacing(udg_hero) возвращает не location, а real.
Старый 05.08.2009, 17:41
KO3bMA

offline
Опыт: 45,024
Активность:
FREEZE_ball, я как бы вопросы задал, чтобы понять, имеет ли смысл делать что- то еще, кроме удаления утечек памяти, если к функции за игру обратятся не больше десятка раз, так просто, перегнал в джасс и добавил локалку, а иначе-огород городить и при етом джасс усиленно учить)
Старый 05.08.2009, 17:51
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Цитата:
имеет ли смысл делать что- то еще, кроме удаления утечек памяти, если к функции за игру обратятся не больше десятка раз

Нет не имеет. Хотя это только для данного случая. Хотя я бы советовал использовать вместо локаций координаты.
Код:
set x = GetUnitX(udg_hero) + 70 * Cos(GetUnitFacing(udg_hero) * 0,01745)
set y = GetUnitY(udg_hero) + 70 * Sin(GetUnitFacing(udg_hero) * 0,01745)

И двигать б/е соответственно.
Код:
call SetUnitX(gg_unit_nfgt_0059, x)
call SetUnitY(gg_unit_nfgt_0059, y)
call SetUnitX(gg_unit_nfgt_0059, udg_MagicFlover)
call SetUnitY(gg_unit_nfgt_0059, udg_MagicFlover)

Отредактировано Линкольн, 05.08.2009 в 18:49.
Старый 05.08.2009, 18:43
KO3bMA

offline
Опыт: 45,024
Активность:
Линкольн, спасибо)
ЗЫ, тему прошу не закрывать пока, вдруг еще глупые вопросы появятся)
Старый 05.08.2009, 18:48
CHAOSITO

offline
Опыт: 35
Активность:
Почитал про утечки и про функцию полярки, что мол она создает утечки, для проверки замутил 2 триггера на ГУИ:
----------------------------------------------Триггер 1ый вызывающий-----------------------------------------
CallMB
События
Игрок - Игрок 1 (Красный) types a chat message containing mb as Точное совпадение
Условия
Действия
For each (Integer A) from 1 to 100, do (Actions)
Цикл - Действия
Триггер - Run MagicBones <gen> (ignoring conditions)
----------------------------------------------Триггер 2ой исполняющий----------------------------------------
MagicBones
События
Условия
Действия
For each (Integer A) from 1 to 360, do (Actions)
Цикл - Действия
Спецэффект - Create a special effect at ((Position of Чародей крови 0000 <gen>) offset by 1000.00 towards (Real((Integer A))) degrees) using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
Set MagicBone[(Integer A)] = (Last created special effect)
For each (Integer A) from 1 to 360, do (Actions)
Цикл - Действия
Спецэффект - Destroy MagicBone[(Integer A)]
----------------------------------------------------------------------------------------------------​---------------
Итак, писал "mb" раз 30, итого триггер Magic Bones запустился 30*100=3000 раз, а функция полярки запустилась 360*3000=1080000 раз, и после завершения небыло никаких тормозов:
Вопросы & Выводы:
  1. Либо я что-то непонял, либо в функции утечки нет и небыло, либо ее уже исправили (Верс 1.23)
  2. Так ее можно все таки юзать или нет?
  3. Я только начинаю учить jass поэтому хотелось бы знать про полярки, оч полезная функция по идее...
Старый 06.08.2009, 21:14
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
CHAOSITO, создай периодический триггер с периодом в 0.01 и юзай полярки, думаю минут через 5-10 (зависит от конфигурации компьютера =)) комп залагает.
Полярки можно юзать, но не саму функцию, их надо юзать ввиде координат, то есть:
    local unit myUnit=CreateUnit(Player(0),'hfoo',0,0,0)
    local real dist=100.00
    local real angle=GetUnitAngle(myUnit)
    call SetUnitX(myUnit,GetUnitX(myUnit)+dist*Cos(angle*bj_DEGTORAD)
    call SetUnitY(myUnit,GetUnitY(myUnit)+dist*Sin(angle*bj_DEGTORAD)
  1. Создаем пехотинца в точке 0;0, под углом 0.
  2. Устанавливаем дистанцию на которую мы должны его сдвинуть в 100.00
  3. Устанавливаем угол, под которым будем двигать пехотинца (в данном случае 0)
  4. Двигаем юнита по оси X из его положения (GetUnitX(...)) на дистанцию*косинус угла в радианах
  1. Двигаем юнита по оси Y из его положения (GetUnitY(...)) на дистанцию*синус угла в радианах
ты плахой... не удаляй мои мессаги =О

Отредактировано Toadcop, 07.08.2009 в 00:28.
Старый 06.08.2009, 22:57
CHAOSITO

offline
Опыт: 35
Активность:
либо ее уже исправили (Верс 1.23)
Как я теперь понимаю исправить утечку при использования BJ полярок невозможно, т.к. создается локация которая неуничтожается. а исправить не получиться не близзардам т.к. они не знают когда, где и в каком месте нам нужно уничтожить локацию, не нам (картостроителям) т.к. мы не имеем ее указателя....
Я правильно понимаю?
Ну вот решил протестить как ты и сказал, содержимое триггеры было таким:
----------------------------------------------------------------------------------------------------​-------------------
EveryTrigger
События
Время- Every 0.01 seconds of game time
Условия
Действия
For each (Integer A) from 1 to 4, do (Actions)
Цикл - Действия
Боевая единица - Create 1 Пехотинец for Игрок 1 (Красный) at ((Position of Смотрящая в Ночь 0000 <gen>) offset by 256.00 towards (90.00 x (Real((Integer A)))) degrees) facing (Position of Смотрящая в Ночь 0000 <gen>)
Set uuu[(Integer A)] = (Last created unit)
For each (Integer A) from 1 to 4, do (Actions)
Цикл - Действия
Боевая единица - Remove uuu[(Integer A)] from the game
----------------------------------------------------------------------------------------------------​-------------------
Игра совершенно не тормозила....
Но оставил я игру не на 5 минут, и не на 10, а точнее свалил на улицу... По приходу естественно вар был полностью мертв, а при сворачивании меня ждало сообщение от вара с ошибкой
"Недостаточно памяти для обработки команды" и сообщение от винды с предупреждением "Недостаточно виртуальной памяти". Виртуальной как и физической памяти у меня по гектару, итого 1024+1024=2 Гб, и эти 2 Гб забила функция с поляркой???
Hellfilm, спасибо за ответ на предыдущий пост....)

Отредактировано CHAOSITO, 07.08.2009 в 19:45.
Старый 07.08.2009, 17:33
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Цитата:
Сообщение от CHAOSITO
Как я теперь понимаю исправить утечку при использования BJ полярок невозможно, т.к. создается локация которая неуничтожается. а исправить не получиться не близзардам т.к. они не знают когда, где и в каком месте нам нужно уничтожить локацию, не нам (картостроителям) т.к. мы не имеем ее указателя....
Я правильно понимаю?

Можно подредактировать файлик с BJ функциями. Но это в стопицот раз сложнее, чем написать новую функцию.
Старый 08.08.2009, 05:47
Nekit1234007

offline
Опыт: 11,916
Активность:
FREEZE_ball:
Можно подредактировать файлик с BJ функциями. Но это в стопицот раз сложнее, чем написать новую функцию.
Но зато будет легче в будущем без утечек :)
Старый 08.08.2009, 13:27
Ответ

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

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

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

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



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