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

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

Ответ
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Нагрузка системы
Как сильно будет этот код нагружать систему? Если есть варианты, предложите вариант оптимизации.
Поясняю, этот код что-то вроде ульты вивера из доты, считает положение героя, максимальное время возврата = интеллекту / 65.
function TimeLapseCond takes nothing returns boolean
    return udg_B == true
endfunction

function TimeLapseStart takes nothing returns nothing
    int i = 0
    real time
    real ti = 0.01
    int id
    loop
        exitwhen i > 11
        if Hero[i] != null then
            id = GetHandleId(Hero[i])
            time = LoadReal(h, id, StringHash(sh3))
            if time < GetHeroInt(Hero[i], true) / 65 then
                SaveReal(h, id, StringHash(sh3), time + 0.01)
            endif
            SaveReal(h, id, StringHash(sh1 + R2S(time)), GetUnitX(Hero[i]))
            SaveReal(h, id, StringHash(sh2 + R2S(time)), GetUnitY(Hero[i]))
            loop
                exitwhen ti > time
                SaveReal(h, id, StringHash(sh1 + R2S(ti)), LoadReal(h, id, StringHash(sh1 + R2S(ti + 0.01))))
                SaveReal(h, id, StringHash(sh2 + R2S(ti)), LoadReal(h, id, StringHash(sh2 + R2S(ti + 0.01))))
                ti = ti + 0.01
            endloop
            ti = 0.01
        endif
        i + + 
    endloop
endfunction

//===========================================================================
function InitTrig_TimeLapse takes nothing returns nothing
    set gg_trg_TimeLapse = CreateTrigger()
    call TriggerRegisterTimerEvent(gg_trg_TimeLapse, 0.01, true)
    call TriggerAddCondition( gg_trg_TimeLapse, Condition( function TimeLapseCond ) )
    call TriggerAddAction( gg_trg_TimeLapse, function TimeLapseStart )
endfunction

Отредактировано Vadik29, 04.02.2014 в 16:20.
Старый 04.02.2014, 16:15
ScorpioT1000
Работаем
offline
Опыт: отключен
TriggerRegisterTimerEvent(gg_trg_TimeLapse, 0.01, true)
да, будет, ещё как. даже с 0.1
Старый 04.02.2014, 16:26
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
ScorpioT1000, а как вариант заменить хэш на глобалки?
Старый 04.02.2014, 16:28
ScorpioT1000
Работаем
offline
Опыт: отключен
какая разница, у тебя там двойной цикл)
ну поставь период 0.04, попробуй заносить всех присутствующих юнитов в массив целочисленных и пробегаться не от 0 до 11, а от timelapseUnits[0] до timelapseUnitsCount
например, будет 2,3,4,6 - это всего 4 прохода
кроме того, можно будет убирать из этого списка тех, кто не подвержен этому эффекту - например, мертвых, на базе итп, убирая временно их из массива
Старый 04.02.2014, 16:37
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
ScorpioT1000, на базе все одновременно, на это проверку я уже сделал.
function TimeLapseCond takes nothing returns boolean
    return udg_B == true
endfunction
Старый 04.02.2014, 16:49
ScorpioT1000
Работаем
offline
Опыт: отключен
суть оптимизации в обработке конкретно тех, кто должен быть обработан, без лишних пробегов
а у тебя решение "рубить с плеча" ))
Старый 04.02.2014, 17:38
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Вот, сейчас выглядит так:
function TimeLapseCond takes nothing returns boolean
    return udg_B == true
endfunction

function TimeLapseStart takes nothing returns nothing
    int i = 0
    real time
    real ti = 0.06
    int id
    loop
        if UnitIsAlive(Hero[i]) then
            id = GetHandleId(Hero[i])
            time = LoadReal(h, id, StringHash(sh3))
            if time < GetHeroInt(Hero[i], true) / 65 then
                SaveReal(h, id, StringHash(sh3), time + 0.06)
            endif
            SaveReal(h, id, StringHash(sh1 + R2S(time)), GetUnitX(Hero[i]))
            SaveReal(h, id, StringHash(sh2 + R2S(time)), GetUnitY(Hero[i]))
            loop
                exitwhen ti > time
                SaveReal(h, id, StringHash(sh1 + R2S(ti)), LoadReal(h, id, StringHash(sh1 + R2S(ti + 0.06))))
                SaveReal(h, id, StringHash(sh2 + R2S(ti)), LoadReal(h, id, StringHash(sh2 + R2S(ti + 0.06))))
                ti = ti + 0.06
            endloop
            ti = 0.06
        endif
        i++ 
        exitwhen idpl[i] == maxplayers
    endloop
endfunction

//===========================================================================
function InitTrig_TimeLapse takes nothing returns nothing
    set gg_trg_TimeLapse = CreateTrigger()
    call TriggerRegisterTimerEvent(gg_trg_TimeLapse, 0.06, true)
    call TriggerAddCondition( gg_trg_TimeLapse, Condition( function TimeLapseCond ) )
    call TriggerAddAction( gg_trg_TimeLapse, function TimeLapseStart )
endfunction
Старый 04.02.2014, 18:09
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
у меня вопрос, ну кто в 2014 еще делает так ?
return udg_B == true
почему бы не not (b != true and b == false) ?
Старый 04.02.2014, 18:52
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,171
Активность:
    int i = GetRandomInt(0, 0)
    if not(i == 1){
        if ((b != true and b == false) or (b != true and b == false)/*эту цепочку можно продолжать*/){
            //наши действия
        }
    }
Старый 04.02.2014, 19:34
ScorpioT1000
Работаем
offline
Опыт: отключен
exitwhen idpl[i] == maxplayers
ничего не изменилось, если половина вышла нагрузка будет всё та же
ты немного не понял
надо создать отдельно массив "живых" и следить за ним отдельно
а здесь вместо maxplayers будет от 0 до максимума массива живых
Старый 04.02.2014, 21:11
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
ScorpioT1000, 0 плеер всегда есть, там считают только тех кто есть в сети. maxplayers - кол-во играющих.
Старый 04.02.2014, 22:55
MegaBlax

offline
Опыт: 2,352
Активность:
((код jass
function TimeLapseCond takes nothing returns boolean
return udg_B == true
endfunction
))
Для красоты? Или там патом что-то будет?
Старый 05.02.2014, 11:42
ScorpioT1000
Работаем
offline
Опыт: отключен
Vadik29, если игру начал только 1 и 12 игрок? =) а так ведь нередко делают, не все сидят ровненько рядком сверху
Старый 05.02.2014, 12:06
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
Vadik29 добавил:
MegaBlax, вполне возможно.
Старый 05.02.2014, 15:38
DioD

offline
Опыт: 45,184
Активность:
ктото слишком тупой чтобы добавить отладочные сообщения и посмотреть как писанина выполняется по факту, но достаточно умный чтобы спросить на форуме...
Старый 05.02.2014, 16:18
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
DioD, ты отладку в каждой теме писать будешь? Я спросил, как можно оптимизировать, а ты мне отладить предлагаешь, ты здоров?
Старый 05.02.2014, 19:01
ScorpioT1000
Работаем
offline
Опыт: отключен
ну тут на одной машине не поотлаживаешь, хотя какой процент времени системы берется этой функицей вполне реально узнать...
есть еще ifdebug где тоже можно повыводить таймстампы
Старый 05.02.2014, 19:12
DioD

offline
Опыт: 45,184
Активность:
DioD, ты отладку в каждой теме писать будешь? Я спросил, как можно оптимизировать, а ты мне отладить предлагаешь, ты здоров?
третья запись в списке игнорирования, тут медицина увы бессильна.
Очень и очень печально видеть, когда написанием кода занимаются агрессивные слабоумные, мало того что они не хотят отлаживать код сами (как сказано выше узнать время вызова процедуры можно (вочдог и прочее) но еще и начинают огрызаться когда им про это говорят)
Старый 06.02.2014, 05:23
Ответ

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

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

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

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



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