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

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

Ответ
 
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
Сообщение от Jon
Код:
globals
    location GL = Location(0,0)
endglobals

function GetTerrainZ takes real X, real Y returns real
    call MoveLocation(GL, X, Y)
    return GetLocationZ(GL)
endfunction

function GetUnitZ takes unit u returns real
    call MoveLocation(GL, GetUnitX(u), GetUnitY(u))
    return GetUnitFlyHeight(u) + GetLocationZ(GL)
endfunction

function SetUnitZ takes unit u, real z returns nothing
    call MoveLocation(GL, GetUnitX(u), GetUnitY(u))
    call SetUnitFlyHeight(u, z-GetLocationZ(GL), 0)
endfunction


Jon, имхо данные функции дб инлайновыми, а также посоветую делать Гес/СетЮнитЗ не через вызовые ГетЮнитХ/У и через сами, коордитаны, т.к. я более чем уверен что в том же потоке вызываются аналог фции) ну ты меня понял и не начинал холивар тут) я это пишу больше для окружающих...

Цитата:
2*bj_PI


писал бы сразу значение... хм)

Отредактировано ShadoW DaemoN, 30.09.2008 в 14:24.
Старый 27.09.2008, 10:24
alexkill

offline
Опыт: 19,072
Активность:
Цитата:
данные функции дб инлайновыми


а насколько это реализуемо в Jass?
не могу же я просто написать

Код:
inline function foo...

Отредактировано ShadoW DaemoN, 30.09.2008 в 14:24.
Старый 29.09.2008, 16:02
adic3x

offline
Опыт: 107,539
Активность:
по идее вЖасс сам дб инлайнить но я хз, мона делать макросом... вобще векс порой меня вгоняет в ступор=/
Старый 30.09.2008, 11:52
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Собственно, перевел несколько строк из справки JassHelper'a:
Цитата:
Как сделать функцию инлайновой?..

• Функция должна быть однострочной.
// ну это ясно

• Если функция вызывается через call, то она должна начинаться с set, call, return.
// Примеры:
Код:
function rollback_dist takes integer level returns integer
  return 50 + (level * 20)
endfunction

function Damage_ConsiderArmor takes unit attacker, widget target, real damage returns nothing
  call UnitDamageTarget(attacker, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
endfunction


• Если функция является присваиванием, она не должна присваивать значение одному из ее аргументов. (вроде так перевел)
// Пример плохой функции:
Код:
function badass takes integer i, integer j returns nothing
  set i = i + (j * i) + j
endfunction


• Каждый аргумент функции должен присутствовать единожды и в том порядке, в каком они стоят в списке аргументов.
// Пример - см. выше функцию Damage_ConsiderArmor

• Если функция содержит вызовы других функций, то они должны быть обработаны после аргументов. Исключение составляют функции, не изменяющие состояние. На данный момент лишь несколько нативок и return bug функций считаются таковыми.
// честно говоря, не совсем понимаю, что это за "функции, не изменяющие состояние", constant мб?

Если что не так, поправьте.
Старый 30.09.2008, 15:05
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
• Функция должна быть однострочной.
// ну это ясно

ну это бре. как пример двустрочные фции тоже дб инлайн в некоторых случаях

Цитата:
• Если функция вызывается через call, то она должна начинаться с set, call, return.
// Примеры:

имеется ввиду отсутсвие локалок скорее...

Цитата:
• Если функция является присваиванием, она не должна присваивать значение одному из ее аргументов. (вроде так перевел)
// Пример плохой функции:

это тоже впринципе не совсем тру, ну если исходить из того что инлайн только однострочные фции - то да...

Цитата:
• Каждый аргумент функции должен присутствовать единожды и в том порядке, в каком они стоят в списке аргументов.
// Пример - см. выше функцию Damage_ConsiderArmor

фалсе фалсе фалсе... понятно что он не хочет терять время... но мне всегда кажется что это виднее кодеру а не машине...

Код:
func x takes a ret nothing
 set xxx=a+a+a+a+a+a+a
endfunc

// --->
 call x(GetStoredInteger(c, "qwer"+I2S(r+d+s), "asdf"))
// <---


вот отчего он хочет спастись
Старый 01.10.2008, 13:58
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Алгоритм инлайна от Вексоряна подлежит долгой доработке.
К примеру, если функция используется в программе 1 раз - то вне зависимости от её размера должен быть инлайн.
Насчет единственного использования аргумента - все правильно, имхо, потому как вызов 6 вышеуказанных функций чтения из кэша будет помедленней, чем 1 вызов + вызов функции х. Но если передаваемый аргумент записан в локалку, то конечно быстрее будет, если инлайнить:
Код:
function x takes integer a returns nothing
  set xxx = a + a + a + a + a + a + a
endfunction

function blah takes nothing returns nothing
  // . . .
  local integer omg = GetStoredInteger(c, "qwer"+I2S(r+d+s), "asdf")
  call x(omg)
endfunction

Так что... Либо тыкать в Векса этим, либо писать свою прогу, либо проводить ручной инлайн))
Старый 01.10.2008, 17:17
adic3x

offline
Опыт: 107,539
Активность:
вексу пытаться что то обьяснить бесмысленно, это проверенный факт)
Старый 01.10.2008, 22:39
J
expert
offline
Опыт: 48,747
Активность:
Цитата:
К примеру, если функция используется в программе 1 раз - то вне зависимости от её размера должен быть инлайн.
если она выполняется только один раз то я вообще не вижу смысла делать инлайн (а точнее выйграша от него)...

Цитата:
вот отчего он хочет спастись
ну оно и правельно, он хочет избежать этой проблемы потому что выигрывая чуть производительности на инлайне функции, он не хочет тутже терять ее на обьявление переходных локалок

Отредактировано Jon, 01.10.2008 в 23:14.
Старый 01.10.2008, 23:09
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
если она выполняется только один раз то я вообще не вижу смысла делать инлайн (а точнее выйграша от него)...

ты не щаришь... имелось ввиду не один реальный вызов, а к примеру у меня есть фция, которую вызывает таймер кажды .025 сек? в одном месте кода? т.е. вроде как надпись call ThisFunc() одна, реально же она зовется часто...

Цитата:
ну оно и правельно, он хочет избежать этой проблемы потому что выигрывая чуть производительности на инлайне функции, он не хочет тутже терять ее на обьявление переходных локалок


имхо такое уже должен решать кодер, делаю ту или иную фцию инлайновой...
Старый 02.10.2008, 11:55
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Цитата:
имхо такое уже должен решать кодер, делаю ту или иную фцию инлайновой...
чтобы удовлетворять всем личным потребностям, можно написать свой парсер (jasshelper поддерживает плагины, так что вперед!)
Старый 02.10.2008, 12:29
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
jasshelper поддерживает плагины, так что вперед

рили? никогда незрил, что же, надо подумать)))
Старый 02.10.2008, 13:49
Toadcop

offline
Опыт: 53,013
Активность:
Цитата:
рили? никогда незрил, что же, надо подумать)))
+1 =)
Старый 02.10.2008, 14:05
zer0ne

offline
Опыт: 11,119
Активность:
не знаю может немного не по теме

Код:
//У меня была такая функция
private function flt_destr takes nothing returns nothing
    local destructable d = GetEnumDestructable()
    local real x = GetDestructableX ( d )
    local real y = GetDestructableY ( d )
    call DestroyEffect(AddSpecialEffect(Death_Dest, x, y))
    call KillDestructable ( d )
    set d = null
endfunction
//Ее лучше записать как ниже?
private function flt_destr takes nothing returns nothing
    call DestroyEffect(AddSpecialEffect(Death_Dest,GetDestructableX(GetEnumDestructable()  ), GetDestructableY(GetEnumDestructable())))
    call KillDestructable ( GetEnumDestructable() )
endfunction


zer0ne добавил:
Отталкивался от этого:

Цитата:
Сообщение от ShadoW DaemoN
Замечу, что если значение локальной переменной используется менее трех раз, следует инлайнить ее (подставить значение вместо названия функции). Что-то вроде такого:
Код:

// было:
local real dx = GetUnitX(target)
call SetUnitX(target, dx + 123.456)
// стало:
call SetUnitX(target, GetUnitX(target) + 123.456)

Старый 05.11.2008, 12:16
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
да, лучше
Старый 05.11.2008, 12:36
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
Конечно второй вариант лучше. Ибо зачем выделять локалку, если значение используется всего оин раз?!
Старый 05.11.2008, 12:38
Ответ

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

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

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

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



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