Если коротко: в рамках реализации кастомного импелейла(Impale, пронзание - первый скилл героя-жука нежити) лучше реализовывать изменение высоты каждые 0.02 сек с третьим параметром для SetUnitFlyHeight равным нулю(мгновенное перемещение) или же реализовывать изменение высоты c динамической скоростью каждые 0.1 сек?
С одной стороны - в 5 раз более редкое вычисление переменных высоты, скорости и т.д. и т.п.
С другой - используется внутренний механизм изменения высоты, период которого наверняка выше, пусть и нативный.
Если правда неизвестна наверняка, но есть реализованый на низком периоде импэйл - могу проделать сравнение с реализованным 0.1 сек аналогом(планирую реализовать мелкопериодный импэйл сам, но, потратив пару дней на кастомный импэйл с периодом 0.1 - не горю желанием делать это в ближайшие несколько дней).

Принятый ответ

Если движок делает 200 вычислений когда я делаю 10, то 50 моих + 50 от движка выглядят симпотичнее.
Работа движка производится на машинном языке. Код же на Jass интерпретируется виртуальной машиной со множеством проверок. 10 твоих вычислений, в действительности, могут интерпретироваться в более 200 машинных команд движка.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
7 лет назад
0
Похожие вопросы:

ответ
nvc123:
Bornikkeny, сделал специально чтобы доказать тебе что ты несёшь бред
даже 2 скрина приложил
думаю закинуть библиотеки сможешь сам (в папку *твой jngp*\AdicHelper\lib)
Хорошо группы реализуешь как альтернативу unit[array]. Я тоже самое получил.
nvc123, и всё же твой хук не тот что мне нужен.
Я решил проблему, спасибо что дал идею обрабатывать движение внутри структуры, а не в стеке.
кот
library Hook initializer Init_Hook uses LibMath

globals
    mhook   ahook[100]
    integer ihook = -1
endglobals
    
struct mhook
        unit       host = null
        unit       target = null
        real       face = 0
        real       speed = 0
        real       dis = 0
        real       dismax = 0
        integer    chaini = 0
        unit       chain[50]
        real       scale = 0
        integer    move = 1
        integer    i = 0
		
		
        static method Create takes unit host, real tx, real ty, real scale returns mhook
        local mhook h = mhook.create()
        local integer i = GetPlayerId(GetOwningPlayer(host))
        local real x = GetUnitX(host)
        local real y = GetUnitY(host)
        local real f = GetAngleXY(x,y,tx,ty)
            set h.host = host
            set h.face = f
            set h.speed = 600
            set h.dismax = 1400
            set h.scale = scale
            set h.chain[0] = CreateUnit(Player(i),'h007',GetPolarX(GetUnitX(host),f,h.scale/2),GetPolarY(GetUnitY(host),f,h.scale/2),f)
            set h.i = i
            call UnitAddAbility(h.chain[0],'Amrf')
            call UnitAddAbility(h.chain[0],'Amrf')
            call SetUnitFlyHeight(h.chain[0],50,0)
            call SetUnitPathing(h.chain[0],false)
            return h
        endmethod
        
        method Start takes nothing returns boolean
            if ihook < 1000 then  
                set ihook = ihook + 1
                set ahook[ihook] = this
                return true
            else
                return false
            endif
        endmethod
        
        method Destroy takes nothing returns nothing
        local integer i = 0
            loop
            exitwhen i > ihook
                if ahook[i] == this then
                    set ahook[i] = ahook[ihook]
                    set ahook[ihook] = 0
                    set ihook = ihook - 1
                    set i = ihook // выход из цикла
                endif
            set i = i + 1
            endloop
            set this.target = null
            set this.host = null
            call this.destroy()
        endmethod
        
        method Move takes nothing returns nothing
        local integer i1 = 0
        local integer l = 0
        local real x
        local real y
        local real xh
        local real yh
        local real f
            if move == 1
                set dis = dis + speed*0.025
                loop
                 exitwhen i1 > .chaini
                    set x = GetUnitX(.chain[i1])
                    set y = GetUnitY(.chain[i1])
                    if i1 > 0 then
                        set f = GetAngleXY(x,y,GetUnitX(.chain[i1-1]),GetUnitY(.chain[i1-1]))
                        call SetUnitX(.chain[i1],GetPolarX(x,f,.speed*0.025))
                        call SetUnitY(.chain[i1],GetPolarY(y,f,.speed*0.025))
                    else    
                        set f = face
                        call SetUnitX(chain[i1],GetPolarX(x,f,.speed*0.025))
                        call SetUnitY(chain[i1],GetPolarY(y,f,.speed*0.025))
                    endif
                    call SetUnitFacing(chain[i1],f)
                 set i1 = i1 + 1
                endloop
                set x = GetUnitX(chain[chaini])
                set y = GetUnitY(chain[chaini])
                set f = GetAngleXY(GetUnitX(.host),GetUnitY(.host),x,y)
                set xh = GetPolarX(GetUnitX(.host),f,.scale/2)
                set yh = GetPolarY(GetUnitY(.host),f,.scale/2)
                //Create==================
                
                if GetDisXY(xh,yh,x,y) >= .scale/2 then
                    set chaini = chaini + 1
                    set chain[chaini] = CreateUnit(Player(.i),'h007',xh,yh,f)
                    call UnitAddAbility(.chain[.chaini],'Amrf')
                    call UnitAddAbility(.chain[.chaini],'Amrf')
                    call SetUnitFlyHeight(.chain[.chaini],50,0)
                endif
                if dis > dismax then
                    set move = 0
                endif
            else
                //REVERSE=============
                set xh = GetUnitX(host)
                set yh = GetUnitY(host)
                set chain[chaini+1] = host
                loop
                exitwhen l > chaini
                        set x = GetUnitX(chain[l])
                        set y = GetUnitY(chain[l])
                        //if chain[chaini] == null then
                        //    set f = GetAngleXY()
                        //endif
                        set f = GetAngleXY(x,y,GetUnitX(chain[l+1]),GetUnitY(chain[l+1]))
                        call SetUnitX(chain[l],GetPolarX(x,f,speed*0.025))
                        call SetUnitY(chain[l],GetPolarY(y,f,speed*0.025))
                        call SetUnitFacing(chain[l],f-180)
                set l = l + 1
                endloop
                //Destroy==================
                set x = GetUnitX(chain[chaini])
                set y = GetUnitY(chain[chaini])
                set xh = GetUnitX(host)
                set yh = GetUnitY(host)
                if GetDisXY(GetUnitX(chain[chaini]),GetUnitY(chain[chaini]),GetUnitX(host),GetUnitY(host)) < 100 then
                    call RemoveUnit(chain[chaini])
                    set chain[chaini] = null
                    set chaini = chaini - 1
                    if chaini == -1 then
                        call .Destroy()
                    endif
                endif
            endif
        endmethod
        
endstruct

private function Engine takes nothing returns nothing
local integer i = 0
local mhook h
local group g
local unit t 
    loop
    exitwhen i > ihook
        if ahook[i] != 0 then
            set h = ahook[i]
            //--run--//
            call h.Move()
        else
            set ahook[i] = ahook[ihook]
            set ahook[ihook] = 0
            set ihook = ihook - 1
            set i = i - 1 
        endif
    set i = i + 1
    endloop
    //call DestroyGroup(g)
    set g = null
    set t = null
endfunction

function Trig_HookC_Bool takes nothing returns boolean
    if GetSpellAbilityId() == 'A01D' then //Способность Мясной хук
        return true
    else
        return false
    endif
endfunction

function Trig_HookC_Actions takes nothing returns nothing
local mhook h
    set h = mhook.Create(GetSpellAbilityUnit(),GetSpellTargetX(),GetSpellTargetY(),110)
    call h.Start()
endfunction

function Init_Hook takes nothing returns nothing
local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( t, function Trig_HookC_Actions )
    call TriggerAddCondition(t,function Trig_HookC_Bool)
    call TimerStart(CreateTimer(),0.025,true,function Engine)
endfunction

endlibrary
ответ
Вариант по индексу не хотелось бы, ввиду использования для разных моделей.
Придётся. Walk не играется триггерно при нормальных условиях.
Впрочем можно заставить проигрывать walk поставив юниту скорость движения 0 в редакторе объектов.

0
32
7 лет назад
0
хз даже, где не смотрел все перемещают сами юнита по высоте, не юзая стандарт, даже в доте фрога где довольно мудреная система заменитель пронзающих шипов юнита поднимают таймером в 50 фпс (0.02, хотя у фрога все таймеры с таким периодом), так же там триггер который следит за юнитом, ибо пока юнит в воздухе он паузится (щяс есть мемхак можно бы и заменить паузу).
Смотри сам, получится ли сделать нужную плавность, ах да высота броска высчитывается исходя из маштаба юнитов, громадные юниты подлетают выше чем мелкие.
0
20
7 лет назад
0
все перемещают сами юнита по высоте, не юзая стандарт
Стандарт? Речь о SetUnitFlyHeight функции. Просто при 50 фпс явно юзают третий параметр равный нулю(скорость изменения высоты), а при 10 фпс я юзал динамическую скорость падения, которая высчитывается при каждом звонке.
паузится
Ну мне в помощь использование рун.
quq_CCCP:
получится ли сделать нужную плавность
Все плавно. Интересует тупо вопрос производительности. Нужно ли это? Вероятно как и сам вц3 - нет. Но перфекционизм можно считать моим вторым хобби. Тем более я впервые полез в дебри изменения высоты юнита.
ах да высота броска высчитывается исходя из маштаба юнитов, громадные юниты подлетают выше чем мелкие
При кастомном изменении высоты все ок.
0
32
7 лет назад
0
Кстати насчет производительности, было же подбрасывание вовсе без кода, помню была тема...
Эх щяс бы найти её..
0
20
7 лет назад
Отредактирован Diaboliko
0
quq_CCCP:
Кстати насчет производительности, было же подбрасывание вовсе без кода, помню была тема...
Эх щяс бы найти её..
Ну там, наверняка, какие-то навороты с анимацией и взаимодействием с моделькой. А тут у меня полная свобода действия. Замутил подбрасывание, потом добавил в любой момент скорости заклинанием телекинеза - в зависимости от момента каста меняется итоговая скорость падения и, как следствие, урон. Имхо - это фан.
2
32
7 лет назад
2
Diaboliko:
quq_CCCP:
Кстати насчет производительности, было же подбрасывание вовсе без кода, помню была тема...
Эх щяс бы найти её..
Ну там, наверняка, какие-то навороты с анимацией и взаимодействием с моделькой. А тут у меня полная свобода действия. Замутил подбрасывание, потом добавил в любой момент скорости заклинанием телекинеза - в зависимосте от момента каста меняется итоговая скорость падения и, как следствие, урон. Имхо - это фан.
Ну скорее всего с анимацией, про шипы незнаю но точно знаю что ветра не подбрасывают юнита на самом деле, они его просто стунят, обесцвечивают и делают неуязвимым, а крутится в воздухе модель героя приаттаченая к модели смерча... Но динамически определить модель юнита не так уж и просто.
2
17
7 лет назад
2
Интересует тупо вопрос производительности.
Ответ на этот вопрос всегда один:
  • Функция нативная - производительность выше
  • Функция пользовательская - производительность ниже
Для изменения высоты юнита с указанием скорости в SetUnitFlyHeight, ты используешь только эту функцию.
Рассчитывая высоту самостоятельно, ты используешь и функцию SetUnitFlyHeight, и пользовательский код Jass для расчетов.
Очевидно, во втором случае операций больше.
Нужно ли это? Вероятно как и сам вц3 - нет. Но перфекционизм можно считать моим вторым хобби.
С практической точки зрения вопрос оптимизации не актуален. В наши дни следует думать о качестве кода и простоте его поддержки.
0
20
7 лет назад
Отредактирован Diaboliko
0
С практической точки зрения вопрос оптимизации не актуален. В наши дни следует думать о качестве кода и простоте его поддержки.
А я хочу мясо, грабить корованы и делать карту (двадцать) джва года.
А касательно нативности - опять же встает вопрос о периодичности вычислений, производимых движком. Если движок делает 200 вычислений когда я делаю 10, то 50 моих + 50 от движка выглядят симпотичнее.
0
32
7 лет назад
0
Diaboliko:
С практической точки зрения вопрос оптимизации не актуален. В наши дни следует думать о качестве кода и простоте его поддержки.
А я хочу мясо, грабить корованы и делать карту (двадцать) джва года.
А касательно нативности - опять же встает вопрос о периодичности вычислений, производимых движком. Если движок делает 200 вычислений когда я делаю 10, то 50 моих + 50 от движка выглядят симпотичнее.
Действия в движке происходят быстрее чем в Jass машине, увы.
0
20
7 лет назад
0
Действия в движке происходят быстрее чем в Jass машине, увы.
Достаточно ли быстрее чтобы окупить их предположительно огромное количество?
2
17
7 лет назад
Отредактирован GetLocalPlayer
2
Если движок делает 200 вычислений когда я делаю 10, то 50 моих + 50 от движка выглядят симпотичнее.
Работа движка производится на машинном языке. Код же на Jass интерпретируется виртуальной машиной со множеством проверок. 10 твоих вычислений, в действительности, могут интерпретироваться в более 200 машинных команд движка.
Принятый ответ
2
32
7 лет назад
2
Diaboliko:
Действия в движке происходят быстрее чем в Jass машине, увы.
Достаточно ли быстрее чтобы окупить их предположительно огромное количество?
Хрен знает, близарды те еще редиски... Код писали разные люди в разное время, и что там и как там хз, стомпы лагают - ну криворукие программисты, и так 1000 И 1 пример того, что близзарды сделали не идеально. Хз даже какие там различия, некоторые нативные спеллы настолько убоги что от них лучше отказатся в сторону пользовательского кода.
0
16
7 лет назад
0
ЛЮБАЯ нативка быстрее ЛЮБОГО твоего велосипеда на жасс. без исключений
0
30
7 лет назад
0
щяс есть мемхак можно бы и заменить паузу
Нельзя бы, одним из важных моментов для фрога является независимость доты от патча.
0
32
7 лет назад
0
Clamp:
щяс есть мемхак можно бы и заменить паузу
Нельзя бы, одним из важных моментов для фрога является независимость доты от патча.
Да с фрогом понятно, ему вовсе пох, ему кастом шипы кто то писал, там код явно не детсадовский конверт гуи в jass фрога, я про тех кто делает карты сейчас и собрался тоже избавится от дефолтных шипов (уж больно это корявый спелл, не стак, делает неуязвимым юнита).
Чтобы оставить комментарий, пожалуйста, войдите на сайт.