Здрасте
	globals
		unit dummy
		real angle
		...
	endglobals
	

		
	function
		local unit u = dummy
		local real x = angle
		...
		//bla-bla-bla
		...
	endfunction
	
	function First takes nothing returns nothing
		local unit u
		local real x
		...
		call SetUnitX(u) //Example
		call ...
		...//50-60 строк, кол-во обращений к этим локалкам 10+ раз
		set dummy = u
		set angle = x
		call TimerStart(CreateTimer(),  0.03, true, function Second)  
	endfunction
Теперь вопрос, использование таких переходов и присваивание другим локальным более производительнее чем использование глобалок во всем триггере или нет?
Второй вопрос, это если таймер уже тикает, делать проверку на то запущен он или нет перед повторным запускрм таймера или не нужно?(Проблемок никаких не будет, если запускать уже запущенный таймер?)

	set u[i*3] = ... set u[i*3 + 1] = ... set u[i*3 + 2] = ...
	unit u[][]
	u[i][3] = ...

Любители поизголяться.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
silence_AZ,
Вот вам пример, идите разбирайте его и читайте все статьи, что есть.
function UnitAddEffect takes unit u, real x, real y returns nothing
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl", x, y))
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetUnitX(u), GetUnitY(u)))
endfunction

function Action takes nothing returns nothing
    local unit u = GetOrderedUnit()
    local real x = GetOrderPointX()
    local real y = GetOrderPointY()
    call UnitAddEffect(u, x, y)
endfunction

function InitTrig_Effect takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
        set i = i + 1
        exitwhen i == 16
    endloop
    call TriggerAddAction( t, function Action )
endfunction
Создайте триггер "Effect", конвертируйте в текст, удалите все что там есть, копирните и вставьте мое, запускайте карту и побегайте юнитами.
То что я написал можно и нужно оптимизировать, но так как вам нужен пример создания пользовательский функций, то я сделал именно так.
Вот на всякий случай оптимизированный вариант.
cJass
    define{
        func = function
        void = nothing
        GetX(u) = GetUnitX(u)
        GetY(u) = GetUnitY(u)
        //Constants
        Effect_OnUnit = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
        Effect_OnXY = "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl"
    }

    void Action(){
        unit u = GetOrderedUnit();
        DestroyEffect(AddSpecialEffect(Effect_OnXY, GetOrderPointX(), GetOrderPointY()));
        DestroyEffect(AddSpecialEffect(Effect_OnUnit, GetX(u), GetY(u)));
    }

    void InitTrig_Effect(){
        trigger t = CreateTrigger()
        integer i = 0
        loop{
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null);
            i++;
            exitwhen i == 16;
        }
        TriggerAddAction( t, func Action );
    }
этот вариант будет оптимальнее в туче кода, хоть такая фигня и не нужна никому, но тем не менее..
ответ
SetUnitPosition довольно тяжелая операци, юзайте SetUnitX\Y в конце полета юзай SetUnitPosition для того чтобы юнит не залетел в непроходимое место.
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction
UnitDamageTargetEx - красиво но нафиг ненужно обводить в отдельную функцию с тучей аргументов + жутко неудобно, 100500 аргументов у функции и фиг знает за что какой от вечает, прямо так UnitDamageTarget, без отдельной функции.
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
ответ
Стоп, я думал ты именно это и проверял...
Ещё есть вариант - тревога это реакция нейтральных монстров на то, что недалеко от них появилось здание (когда начинаешь строить здание, и тут из леса прибегают нейтралы, ломают, и убегают обратно).
первая проверка - мб эта функция делает так что данный нейтрал игнорирует то что рядом с ним появится здание, и он в итоге не побежит его атаковать
вторая проверка - возможно функция делает само здание игнорируемым для этих нейтралов, т.е. конкретно на него не будут сбегаться ближайшие нейтралы
Но я больше склоняюсь к первому

20
локалки быстрее для конкретного потока, глобалки нужны скорее для передачи данных между ними, если я не путаю
при запуске работающего таймера он просто начнет отсчет времени по новой
16
локалки и глобалки одинаковы - они ложатся в общую базу всех переменных и ищутся там перебором. но ты тратишь такты на объявление и обнуление локалок.
можно запускать таймер сколько угодно, ниче ему не будет
15
Теперь вопрос, использование таких переходов и присваивание другим локальным более производительнее чем использование глобалок во всем триггере или нет?
Озвучу 3-е мнение и скажу, что этот вопрос тебя волновать не должен. И DracoL1ch, и ssbbssc оба правы, но это не окажет на игровой процесс и оптимизацию в карте никакого влияния. Механика слишком низкоуровневая.
Проблемок никаких не будет, если запускать уже запущенный таймер?
Проверка не нужна. Проблемок не будет.
Автору спасибо за взятие кода в теги и человеческое оформление.
20
локалки и глобалки одинаковы - они ложатся в общую базу всех переменных и ищутся там перебором.
Относительно недавно некий чел утверждал что разница в скорости их использования все-таки есть
16
в количестве операций максимум, ибо в приоритете ищется хеш по локалкам, затем - глобалкам. но, в любом случае, это последнее, о чем следует думать разработчику.
20
DracoL1ch:
в количестве операций максимум, ибо в приоритете ищется хеш по локалкам, затем - глобалкам. но, в любом случае, это последнее, о чем следует думать разработчику.
Почему, в таком случае, скорость записи так сильно различается? (относительно разницы в скорости чтения)
32
Diaboliko, если учитывать что движок ищет переменные методом перебора с конца, то последняя добавленная переменная будет найдена быстрее первой.
20
quq_CCCP, только это не объясняет упомянутой разницы.
Само по себе*
Доц, конечно, рассказывал офигенные истории про различные коллбеки в оффтопке, но в рамках разницы глобалок и локалок это навряд ли имеет место быть
14
По итогу пришли к тому, что большинство против лишнего объявления локалки, но по процессорному такту это получается невыгодно, т.к. нагружается сильнее. Нужно последнее слово.Также еще один вопрос,
globals 
	unit array u
endglobals

function
	local integer i

	loop 
	exitwhen i == 15
		set u[i*3] = ...
		set u[i*3 + 1] = ...
		set u[i*3 + 2] = ...
		call GetUnitState(u[i*3+1)
		...
		set i = i + 1
	endloop
endfunction
Вот так я хочу сделать во всех спеллах, т.е. в таймерах будут подобные циклы, и индекс массивной переменной каждый раз практически будет высчитываться, воот. Рационально ли это?Или лучше изначально создать три глобалки типа юнит и не работать с подобными манипуляциями?
29
Это у вас такие методы прокрастинации? Поиски мифической оптимизации вместо написания кода? Или уже тормозит и все остальное оптимизировали?
16
вы ракету строите или очередную карту для 100 человек? ЭТО НЕ ТЕ ВОПРОСЫ. даже если всё лагает, ЭТО НЕ ТО МЕСТО, где надо оптимизировать. вот эта погоня за тактами ничего не даст. ею следует заниматься, когда уже всё сделано, когда нехер делать, когда хочется похвастать ЗАЦЕНИ КАК Я МОГУ. в 2017 никто не заценит. пиши как удобно - остальное приложится
14
"Когда задаешь вопрос, а вместо ответа слышишь вскукареки в виде ускользания на другие темы"
Чота в голосяндру, Я спрашиваю заранее наилучший вариант написания кода, чтобы потом не возвращаться и не переписывать все подобные ошибки.
>в 2017 никто не заценит.
Щас бы в 2017-м не ценить оптимизацию, оч вкусно. Прекращайте вбрасывать подобные вбросы, плез. Отвечайте по факту.
ЕДинственное что мне осталось, это прелоад и вроде как я смогу приступать все делать без дальнейшей перезаписи.
26
Теперь вопрос, использование таких переходов и присваивание другим локальным более производительнее чем использование глобалок во всем триггере или нет?
не настолько что бы кто либо заметил, это не рациональный подход к оптимизации. оптимизировать в первую очередь нужно узкие места, и использование глобалок вместо локалок и наоборот вам совершенно не сделает никакой погоды
Этот комментарий удален
14
не настолько что бы кто либо заметил, это не рациональный подход к оптимизации. оптимизировать в первую очередь нужно узкие места, и использование глобалок вместо локалок и наоборот вам совершенно не сделает никакой погоды
Локалки же априори выгоднее глобалок, я думаю необходимо засотрять внимание на этом.
2 пункта от Uber: 2.1 (оскорбление)
32
LainMikoroso, эмм не настолько чтобы отказываться от глобалок, да и создание 100500 локалок не есть хорошо.
Темболее не нужно заниматься такой фигней лучше сосредоточится на более важных вещях.
14
эмм не настолько чтобы отказываться от глобалок, да и создание 100500 локалок не есть хорошо.
Темболее не нужно заниматься такой фигней лучше сосредоточится на более важных вещях.
ВО втором вопросе я не использую локалки, я заменяю кол-во глобалок на работу с индексом переменной с помощью арифметических действий
10
LainMikoroso:
Да что там нагружается, фпс не скачет, значит все норм, не парься
21
Делай так чтоб через пол-года смог разобрать что ты там написал. Излишняя загруженность такта, в пол-процента - недостаточный повод заниматься подобной дуристикой. Если ты обновлял железо за последние 15 лет.
21
DracoL1ch, при всем к тебе уважении, надеюсь, что твоя дота лагать не будет. Ничто так не бесит в кайфе от игры, как лаги. Я лучше в 8битную игру без лагов поиграю, чем в XBox с лагами!
16
ClotPh:
DracoL1ch, при всем к тебе уважении, надеюсь, что твоя дота лагать не будет. Ничто так не бесит в кайфе от игры, как лаги. Я лучше в 8битную игру без лагов поиграю, чем в XBox с лагами!
я упрощаю код, а не микрооптимизациями занимаюсь. хотя и не без этого, но чисто потому, что все узкие места давным давно исправлены. грубо говоря, я уже вылизал до такой степени, что можно заниматься таким байтодрочерством. в большинстве других карт такого не скажешь
20
DracoL1ch:
то-то у тини на аганиме появляются все ауры всех персов :D~DracoL1ch:
уже вылизал до такой степени
а в тему треда - вскукареки, как вы выражаетесь, были и будут, потому что этот вопрос не критичен для вашего проекта
вы потратите неделю на написание идеального кода, а в приросте будет 0,5-0,9%
неделя времени того не стоит
достаточно закрывать утечки и просто упрощать код там, где это возможно
29
Вдохновляйтесь примером сжасса. Написан на асме крутым программером. Работает нереально быстро. После этого: саппортить этот код никто не может, включая автора. Месяцы на отладку багов. Баги до сих пор есть и совершенно непредсказуемые. Адик лично отлаживал на моем ноутбуке через тимвьювер. Старые баги фиксились, приносились новые. Зато работает быстрее хд
16
ssbbssc:
DracoL1ch:
то-то у тини на аганиме появляются все ауры всех персов :D~DracoL1ch:
то лод, проект сам по себе очень концептуальный и со множеством непростых мест
Чтобы оставить комментарий, пожалуйста, войдите на сайт.