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

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

Закрытая тема
 
newzoom
Kicked by ScorpioT1002
offline
Опыт: 207
Активность:
Jass: Что быстрее?
Изучая статьи по Jass'у, захотелось уточнить некоторые моменты.
- Глобальные переменные быстрее чем вызов функции, но медленнее чем локальные переменные?
- Почему некоторые люди пренебрегают функцией TriggerAddAction()? Делать все необходимые дела в условиях - правильнее? И обязательно ли возвращать false?
Старый 17.07.2010, 06:43
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
newzoom:
  • Почему некоторые люди пренебрегают функцией TriggerAddAction()? Делать все необходимые дела в условиях - правильнее?
Ты где такое видел? О_о люди вообще-то могут принебречь условием и проверить его в самом действии, но никак не наоборот..
newzoom:
  • Глобальные переменные быстрее чем вызов функции, но медленнее чем локальные переменные?
Вроде как да, но блин, какая связь между вызовом функции и переменной? О_о
Старый 17.07.2010, 07:04
newzoom
Kicked by ScorpioT1002
offline
Опыт: 207
Активность:
Цитата:
Сообщение от Vampirrr
Ты где такое видел? О_о люди вообще-то могут принебречь условием и проверить его в самом действии, но никак не наоборот..
много раз такое видел:
Код:
function SomeFunc takes nothing returns boolean
    if GetSpellAbilityId( ) == 'A000' then
        // some actions
    endif
    
    return false
endfunction

function Init takes nothing returns nothing
    local trigger t = CreateTrigger( )
    
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( t, Condition( function SomeFunc ) )
    
    set t = null
endfunction


-----

Цитата:
Сообщение от Vampirrr
Вроде как да, но блин, какая связь между вызовом функции и переменной? О_о
Например там, где надо указать функцию-фильтр. Если интервал вызова слишком маленький (у меня везде 0.025), то как я слышал, нужно записывать фильтр в переменную, чтобы потом не тратить время на вызов функции. На словах всегда плохо получается объяснить. Вот смотри:

Есть периодичный таймер, который вызывает функцию. В этой функции проводятся какие-то действия над юнитами в области, каждый раз они заносятся в группу (или где-то я слышал можно делать все сразу в функции-фильтре, но не суть). Так вот
Код:
function OnTimer takes nothing returns nothing
    // ...
    
    call GroupEnumUnitsInRange( someGroup, someX, someY, someRadius, Condition( function SomeFilter ) )
    
    // ...
endfunction

Или лучше так?:
Код:
globals
    boolexpr FilterFunction = Condition( function SomeFilter )
endglobals

function OnTimer takes nothing returns nothing
    // ...
    
    call GroupEnumUnitsInRange( someGroup, someX, someY, someRadius, FilterFunction )
    
    // ...
endfunction
Старый 17.07.2010, 07:43
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
newzoom, по поводу boolexpr, это да, второй пример быстрее будет чем первый, ибо переменные быстрее, чем фильтр. Ну а на счет Action и Condition, я откровенно говоря хз..Как по мне, то
function SomeFunc takes nothing returns nothing
    if GetSpellAbilityId( ) == 'A000' then
        // some actions
    endif
    
endfunction

function Init takes nothing returns nothing
    local trigger t = CreateTrigger( )
    
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( t, function SomeFunc  )
    
    set t = null
endfunction
ничем отличаться не будет..Но посмотрим, что скажут старички)
Старый 17.07.2010, 07:52
ScorpioT1000
Работаем
online
Опыт: отключен
условие иногда заменяет действие, чтобы избежать лишнего вызова проверки) но это надо у адика/тодди спрашивать. вобще я всегда Action использовал
Старый 17.07.2010, 09:19
newzoom
Kicked by ScorpioT1002
offline
Опыт: 207
Активность:
Спасибо за помощь.
Старый 17.07.2010, 10:17
SRes
1110101000
offline
Опыт: 9,997
Активность:
Это маразм, ты же не пишешь на ассемблере, а на дворе не 90е ? Пытаться выиграть каплю скорости на интерпретируемом языке - это бред.
Старый 17.07.2010, 10:22
newzoom
Kicked by ScorpioT1002
offline
Опыт: 207
Активность:
Для кого-то это важно, для меня например.
Хочется добиться максимальной оптимизации.
Старый 17.07.2010, 10:30
Anufis

offline
Опыт: 6,290
Активность:
Цитата:
Сообщение от SRes
Это маразм, ты же не пишешь на ассемблере, а на дворе не 90е ? Пытаться выиграть каплю скорости на интерпретируемом языке - это бред.

Если периодический таймер кажыде 0.03 секунды обрабатывает до сотни юнитов(а после сотни начинает лагать), то такие оптимизации могут увеличить количество обрабатываемых юнитов без лагов для карты.
Старый 17.07.2010, 10:37
SRes
1110101000
offline
Опыт: 9,997
Активность:
Нешарите, то что лагает с оптимизированным кодом, то будет лагать и с фанатически вылизанным кодом.
Старый 17.07.2010, 10:56
ScorpioT1000
Работаем
online
Опыт: отключен
если нагружать кондишен, будут проблемы с лимитопами и вейтами при неверном применении
Старый 17.07.2010, 23:51
agentex

offline
Опыт: 34,834
Активность:
при каком таком применении?) просто в кондишен не надо пихать большие циклы и прочие подобные вещи. а так то тригеревалуате+кондишн - очень быстро (если сравнивать с экзекутом.)
Старый 18.07.2010, 01:23
ScorpioT1000
Работаем
online
Опыт: отключен
agentex, при применении без размноживания на потоки)
ScorpioT1002 добавил:
ну тоесть в целом кондишен не умеет "долго ждать", будь то слип или просто большая нагрузка на интерпретатор
Старый 18.07.2010, 05:27
newzoom
Kicked by ScorpioT1002
offline
Опыт: 207
Активность:
ScorpioT1002, а если будет вот такой код, проблем не будет?
Код:
function OnCast takes unit caster, location target returns nothing
    local real x = GetLocationX( t )
    local real y = GetLocationY( t )
    
    call RemoveLocation( t )
    call DestroyEffect( AddSpecialEffect( SomeEffect, x, y ) )
endfunction

function SomeFunc takes nothing returns boolean
    if GetSpellAbilityId( ) == 'A000' then
        call OnCast( GetTriggerUnit( ), GetSpellTargetLoc( ) )
    endif
    
    return false
endfunction

function Init takes nothing returns nothing
    local trigger t = CreateTrigger( )
    
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( t, Condition( function SomeFunc ) )
    
    set t = null
endfunction
Старый 18.07.2010, 07:17
ScorpioT1000
Работаем
online
Опыт: отключен
не будет)
Старый 18.07.2010, 07:24
newzoom
Kicked by ScorpioT1002
offline
Опыт: 207
Активность:
Спасибо за помощь :)
Старый 18.07.2010, 19:36
Закрытая тема

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

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

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

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



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