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

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

Ответ
 
zibada

offline
Опыт: отключен
Цитата:
1. Любые функции, которые возвращают в качестве результата тип Location по сути создают регион, который кушает память - верно?
2. Аналогично и для ret type Group - создается группа(причем глобальная) и пока не удалим, память будет кушать - верно?
3. При этом ret type Point таким образом память не кушает - верно?

1.да
2.да
3. такого типа не существует.
3.5. ... returns real - не должна ничего кушать.
Старый 15.01.2006, 23:58
Markiz

offline
Опыт: 11,432
Активность:
Цитата:
1. Любые функции, которые возвращают в качестве результата тип Location по сути создают регион, который кушает память - верно?

Какой еще регион?

Заметил интересную весчь.
Допустим есть у нас некий кастер.
Делаем следующее -
Код:
local location p1=GetUnitLoc(caster)
local location p2=p1
[...]
 call RemoveLocation(p1)
 call CreateUnitAtLoc(Player(0),'ANYU',p2,0)
[...]

В общем, угадайте, где создастся юнит.

Ответ: в центре карты.
Старый 17.01.2006, 18:14
zibada

offline
Опыт: отключен
точнее, в (0, 0)?
было бы странно, если бы он создался где-то еще..
если надо скопировать точку, надо написать какой-то шыт вида
local location p2=Location(GetLocationX(p1), GetLocationY(p1))
и не забыть ее потом удалить отдельно =)
ну а так очевидно, что p1 и p2 указывают на один объект..
Старый 18.01.2006, 15:26
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
скажите какая из функций пожирает меньше памяти:

1
Код:
function GPS_GetUnitFromRect takes rect r returns unit
local rect rc = RectFromCenterSizeBJ(GetRectCenter(r), 280, 280)
local group gp = GetUnitsInRectAll(rc)
local group gu = GetRandomSubGroup(1, gp)
local unit u = GroupPickRandomUnit(gu)
call RemoveRect(rc)
call DestroyGroup(gp)
call DestroyGroup(gu)
return u
endfunction


2
Код:
function GPS_GetUnitFromRect takes rect r returns unit
return GroupPickRandomUnit(GetRandomSubGroup(1, GetUnitsInRectAll(RectFromCenterSizeBJ(GetRectCenter(r), 280, 280))))
endfunction
Старый 25.01.2006, 00:26
NETRAT

offline
Опыт: 83,712
Активность:
На первый взгляд это две одинаковых реализации, только во второй ты нифига не удалил созданные обьекты - мусор не подчищаешь

NETRAT добавил:
Мне кажется что группы вообще проще всего реализовывать засовывая все манипуляции с ними в фильтр, ибо GroupEnum - лишний перебор в этом случае. Ну да это так, о высших материях...

NETRAT добавил:
Скажи лучше каких тебе юнитов нужно выбрать, может смогу помочь...

NETRAT добавил:
Кстати, вполне возможно вместо подгруппы брать нативный FirstOfGroup(group g) который возвращает первого юнита в группе. Возможно, этого юнита можно брать как рандомного :? да и вообще, я бы в фильтр все запихнул и навыходе бы у меня получалась группа, содержащяя один юнит.
Старый 25.01.2006, 00:55
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
короче у мя выбирается рандомальный юнит из данного ректа
мнебы вобще хотельсо какбы назначить приоритет на типы войск с помощью SCV и у кого приоритет (тобишь целое число) будет больше тот и попадет в переменную.
функция ForGroup это гемор, т.к. нужна отдельная функция

bugmaker добавил:
но боюсь если это у мя делается окала 224 раз за раз ') с периодом в пол-секунды то лаги будут немалыми

bugmaker добавил:
Цитата:
который возвращает первого юнита в группе.

еще вопрос: каким образом юниты разбрасываются по группе? Т.е. как определяется какой юнит там первый будет? по дате регистрации =) или по каким то приоритетам
Старый 25.01.2006, 01:00
NETRAT

offline
Опыт: 83,712
Активность:
Ну гляди
Код:
set g=CreateGroup()
call GroupEnumUnitsInRect(g,rc,Filter(function UnitFilter))
call DestroyGroup(g)

А в функции UnitFilter пишем все наши проверки, приоритеты, рандом и т.п, вообще говоря можешь везде возвращать false, а из перечисляемых юнитов одного занести в кеш и потом выщемить. Думаю, это самый оптимальный вариант

NETRAT добавил:
Абсолютно не в курсе как они распределяются =( предполагаю что в порядке возрастания их идентификаторов...

NETRAT добавил:
И не забудь rc удалить...
Старый 25.01.2006, 01:06
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
отлично, щас попробую использовать...
спасибо НТ
Старый 25.01.2006, 01:09
Iron
Листовой
offline
Опыт: 24,427
Активность:
Да заделай ты это методом пузырька через цикл:
1)Берем рандомного юнита из группы.
2)Проверяем больше или менше его приоритет, чем у юнита в переменной (переменная в которой будет хранится самыйприоритетный юнит).
3)Если приоритет больше, то заносим юнита в ту переменную, если менше, то ничего не делаем.
4)Удаляем из группы взятого юнита.
И ставим число циклов, равным кол-ву юнитов в группе.
Старый 25.01.2006, 01:13
NETRAT

offline
Опыт: 83,712
Активность:
Так если тебе нужно получить юнита с наибольшим приоритетом - так это еще проще
Код:
function UnitFilter takes nothing returns boolean
    local integer prio=GetStoredInteger(udg_cache,"prio",I2S(GetUnitTypeId(GetFilterUnit())))
    local integer maxprio=0
    if HaveStoredInteger(udg_cache,"prio","maxprio") then
         maxprio=GetStoredInteger(udg_cache,"prio","maxprio")
    endif
    if prio>maxprio then
         StoreInteger(udg_cache,"prio","maxprio",prio)
         StoreInteger(udg_cache,"prio","bestunit",GetFilterUnit())
    endif
    return false
endfunction

Твоя функция:
Код:
StoreInteger(udg_cache,"prio","maxprio",0) // нулим предыдущий приоритет
set g=CreateGroup()
call GroupEnumUnitsInRect(g,rc,Filter(function UnitFilter))
call DestroyGroup(g)
return I2U(GetStoredInteger(udg_cache,"prio","bestunit")))

Ну вот, вроде бы все верно и оптимально...
Старый 25.01.2006, 01:15
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
звеняюс за нупный вопрос, но я не пробовал работать с типом filterfunc, могбы ты расписать что берет UnitFilter и возвращает, ...сенкс
Старый 25.01.2006, 01:16
NETRAT

offline
Опыт: 83,712
Активность:
Iron дружище, это бред ибо у тебя число операций не менее N*N (+ нереальная загрузка рандомайзера) а у меня N

bugmaker уже написал код =)
Старый 25.01.2006, 01:17
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
у мя просто нэт тормозит...

Отредактировано bugmaker, 25.01.2006 в 01:30.
Старый 25.01.2006, 01:22
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
А на сколько важно переписывание условий в главную функцию? У меня щас небольшой тригггер с нескольким условиями - стоит ли с этим вообще заморачиваться?

Mefist добавил:
и еще такой вопрос, если точки засоряют память, то как быть с другими указателями?
Старый 31.01.2006, 19:08
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
А какая разница? Все хэндлы гадят память...
Старый 31.01.2006, 21:21
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
понятно, а что на счет первого вопроса?
Старый 31.01.2006, 22:34
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Не понял вопрос... как понять "переписывание условий в главную функцию"? Смортя какие условия... если можем сразу отсеять 90 процентов не нужных случаев, то зачем их тащить в главную функцию... поясни на примере.
Старый 01.02.2006, 10:30
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
Гм, ну вот такой пример. Есть ли в таких случаях принципиальная разница? Конечно, когда условий не два как на примере а много

Код:
function Trig_test_Copy_Func001Func002001001002 takes nothing returns boolean
    return ( GetUnitLevel(GetFilterUnit()) == 3 )
endfunction

function Trig_test_Copy_Func001C takes nothing returns boolean
    if ( not ( IsQuestEnabled(GetLastCreatedQuestBJ()) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_test_Copy_Actions takes nothing returns nothing
    if ( Trig_test_Copy_Func001C() ) then
        call KillUnit( GroupPickRandomUnit(GetUnitsInRectMatching(GetPlayableMapRect(), Condition(function Trig_test_Copy_Func001Func002001001002))) )
    else
    endif
endfunction

//===========================================================================
function InitTrig_test_Copy takes nothing returns nothing
    set gg_trg_test_Copy = CreateTrigger(  )
    call TriggerAddAction( gg_trg_test_Copy, function Trig_test_Copy_Actions )
endfunction


Код:
function Trig_test_Actions takes nothing returns nothing
    if ( IsQuestEnabled(GetLastCreatedQuestBJ()) == true ) then
        call KillUnit( GroupPickRandomUnit(GetUnitsInRectMatching(GetPlayableMapRect(), Condition(GetUnitLevel(GetFilterUnit()) == 3))) )
    else
    endif
endfunction

//===========================================================================
function InitTrig_test takes nothing returns nothing
    set gg_trg_test = CreateTrigger(  )
    call TriggerAddAction( gg_trg_test, function Trig_test_Actions )
endfunction
Старый 01.02.2006, 19:54
vlad_C0M
Босс DarkSkyTeam
offline
Опыт: 10,459
Активность:
Цитата:
Сообщение от Sergey
Units within 10000.00 of (Position of (Picked unit)) - создаст сорный объект типа группа
Position of (Picked unit) - создаст сорный объект типа точка
Как лечится:
на GUI пишешь
set p = Position of (Picked unit)
set gr = Units within 10000.00 of <p>
Pick every unit in gr...
...
Когда группа и точка станут ненужными
CustomScript: call DestroyGroup(udg_gr)
CustomScript: call RemoveLocation(udg_p)

-
Супер! *(есть это в статье)?
Старый 02.02.2006, 12:35
Ответ

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

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

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

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



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