Сейчас 09:56:56 Пятница, 29 марта, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Помощь в оптимизации jass
Помощь в оптимизации jass
peinДата: Воскресенье, 21 Ноября 2010, 22:02:24 | Сообщение # 1
9 уровень
Группа: Проверенные
Сообщений: 1114
Награды: 1
Репутация: 272
Блокировки:
У верен много начинающих джасеров не могут до конца оптимизировать свой код.Вот и я один из таких.
Решил создать тему в которой опытные джасеры будут оптимизировать, или помогать,учить оптимизировать.
Прощу составлять ваши вопросы\ответы в следующей форме.

  • Вопрос
  • Код спела который нужно оптимизировать
    Или
  • Ответ
  • Код спела который оптимизирован


    Начну пожалуй первый по тому что проблема оч интересует
  • Вопрос Как это оптимизировать, верней я знаю как тока не знаю что там есть r
  • Код не оптимизирован
    Quote
    call TriggerRegisterEnterRectSimple( gg_trg_M_6, gg_rct_M_6 )

  • Код оптимизирован токо я не знаю что тут r. и на ретурн ошыбку выбивает
    Quote
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
  •  

    FkoFFДата: Воскресенье, 21 Ноября 2010, 23:20:58 | Сообщение # 2
    Группа: Заблокированные
    Сообщений: 4356
    Награды: 1
    Репутация: 1413
    Блокировки:
    r - rect, Задаваемый при вызове.

     

    DarkVaderДата: Понедельник, 22 Ноября 2010, 06:32:14 | Сообщение # 3
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    pein, твой триггер локальный? и часто создается? зачем такого рода оптимизация вообще?

    Code

    function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
         local region rectRegion = CreateRegion()
         call RegionAddRect(rectRegion, r)
         return TriggerRegisterEnterRegion(trig, rectRegion, null)
    endfunction

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

    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, gg_rct_M_6 )
    сall TriggerRegisterEnterRegion( gg_trg_M_6, rectRegion, null)
    set rectRegion = null

     

    peinДата: Понедельник, 22 Ноября 2010, 17:53:16 | Сообщение # 4
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    Quote (DarkVader)
    и часто создается

    нет ето вопше событие отряд вошол в облась

    Добавлено (22-11-2010, 17:49)
    ---------------------------------------------
    но я понял суть r это регион

    Добавлено (22-11-2010, 17:53)
    ---------------------------------------------
    а что не понял так это то что делать с

    Quote (pein)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)

    вместо него написать
    Quote
    сall
     

    DarkVaderДата: Понедельник, 22 Ноября 2010, 18:43:27 | Сообщение # 5
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    pein, return это оператор который возвращает значение функции может быть использован только в функциях которые что либо возвращают

    а у тебя это событие находится в функции инициализации триггера которая ничего не берет и ничего не возвращает, поэтому и ошибка получается так как ты пытаешься заставить функцию возвращать значение типа event, чего она соответственно не может сделать поэтому тут и выдается ошибка, вместо оператора return тебе нужно просто использовать оператор call

     

    peinДата: Понедельник, 22 Ноября 2010, 18:55:35 | Сообщение # 6
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    DarkVader, понятно спс
    ищё вопрос а если я все бж уберу ищё что то оптимизировать надо
     

    DarkVaderДата: Понедельник, 22 Ноября 2010, 19:21:37 | Сообщение # 7
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    Quote (pein)
    ищё вопрос а если я все бж уберу ищё что то оптимизировать надо

    ну это уже либо талант к программированию либо нет, в общем плане просто старайся писать чистый код, старайся искать более короткие пути решения с минимумом вызова функций, не стоит так же объявлять большое количество переменных , несомненно лучше работать с координатами чем с точками и т.д + каждое действие должно быть функционально и логичски выражено, старайся грамотно строить условия, ведь порой можно очень многое выразить в короткой записи.

     

    peinДата: Понедельник, 22 Ноября 2010, 19:24:37 | Сообщение # 8
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    ищё вопросик как оптимизировать ето
    Quote
    call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), GetRectCenter(udg_A_Region[0]), bj_UNIT_FACING )

    это создания бнита
     

    DarkVaderДата: Понедельник, 22 Ноября 2010, 19:32:33 | Сообщение # 9
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    я использую всегда эту функцию
    native CreateUnit takes player id, integer unitid, real x, real y, real face returns unit

    если нужно будет создать несколько юнитов то просто используй цикл, да и в цикле будет удобно с массивом работать=)
    это максимально оптимальный вариант

    Добавлено (22-11-2010, 19:32)
    ---------------------------------------------
    и вообще стронись функций с Loc в имени=)))) это точки, а точки всегда утечны=(((( + они медленнее кооррдинат в разы так как каждый раз создается новый объект типа точка

     

    peinДата: Понедельник, 22 Ноября 2010, 19:37:31 | Сообщение # 10
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    их надо заносить в переменые если без них не куда=) а потом онулять

    Добавлено (22-11-2010, 19:37)
    ---------------------------------------------

    Quote (DarkVader)
    real x, real y

    это координаты а как написать чтоб в области создавались скажем в udg_A_Region[0]
     

    DarkVaderДата: Понедельник, 22 Ноября 2010, 19:56:50 | Сообщение # 11
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    Quote (pein)
    их надо заносить в переменые если без них не куда=) а потом онулять

    их нужно заносить в переменные, потом удалять и обулять переменные, но это все равно может быть утечно

    Quote (pein)
    это координаты а как написать чтоб в области создавались скажем в udg_A_Region[0]

    native CreateUnitAtLoc takes player id, integer unitid, location whichLocation, real face returns unit
    тоже самое но через точку
    центральную точку можно получить функцией

    function GetRectCenter takes rect whichRect returns location
    return Location(GetRectCenterX(whichRect), GetRectCenterY(whichRect))
    endfunction

    отсюда видно что точки в любом случае создаются через координаты, и работая с точками ты создаешь ненужные действия и нагрузку

    получить координаты центра через функции

    native GetRectCenterX takes rect whichRect returns real
    native GetRectCenterY takes rect whichRect returns real

    в итоге получаем оптимальный вариант как например

    call CreateUnit( player, unit id, GetRectCenterX( udg_A_Region[0]), GetRectCenterY(udg_A_Region[0]), face)

    если ты создаешь несколько юнитов через цикл, можно его оптимизировать вот так

    local real x = GetRectCenterX( udg_A_Region[0])
    local real y = GetRectCenterY( udg_A_Region[0])
    local integer i = 1
    local unit array u
    loop
    exitwhen i > 10
    set u[i] = CreateUnit( player, unit id, x, y, face)
    set i = i + 1
    endloop

    то есть лучше объявить иногда лишнюю локалку чем в каждом новом действии цикла каждый раз заного определять координаты центра

     

    peinДата: Понедельник, 22 Ноября 2010, 20:35:34 | Сообщение # 12
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    DarkVader, спс :D

    Добавлено (22-11-2010, 20:35)
    ---------------------------------------------
    А в действие начто заменить return ?

     

    DarkVaderДата: Вторник, 23 Ноября 2010, 07:16:03 | Сообщение # 13
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    Quote (pein)
    А в действие начто заменить return ?

    смотря в каком, и смотря в какой функции это действие, мб ретурн и нужен будет, а вообще call

    Добавлено (23-11-2010, 07:16)
    ---------------------------------------------

    Quote (pein)
    их надо заносить в переменые если без них не куда=) а потом онулять

    хочу сделать заявление =) можно обойтись без точек в 100% случаев, точки необходимы для работы на GUI, если вы переходите на Jass необходимо все делать через координаты, что бы создать полярное смещение в декартовых координатах нужно использовань основы тригонометрии, а именно

    координаты точки с полярным смещение находятся так

    x = x0 + r*Cos(a)
    y = y0 + r*Sin(a)

    r - расстояние смешения
    x0,y0 - координаты точки относительно которой происходит смещение
    a - угол в радианах
    a = a0 * bj_DEGTORAD
    а0 - угол в градусах
    bj_DEGTORAD - константа перехода ( в коде ее следует писать именно так)

    получить часто требуемы координаты можно найти по следующим функциям

    координаты позиции юнита
    GetUnitX( unit )
    GetUnitY( unit )

    координаты центра области
    GetRectCenterX( rect )
    GetRectCenterY( rect )

    координаты указанной точки приказа способности
    GetSpellTargetX()
    GetSpellTargetY()

    координаты точки приказа
    GetOrderPointX()
    GetOrderPointY()

     

    FkoFFДата: Вторник, 23 Ноября 2010, 07:41:30 | Сообщение # 14
    Группа: Заблокированные
    Сообщений: 4356
    Награды: 1
    Репутация: 1413
    Блокировки:
    DarkVader,

    проще использовать небольшую библиотечку для работы с математическими значениями, просто удобнее. Написать функции работающие с координатами.
    Грубо говоря GetAngle(x1,y1,x2,y2), GetDist(x1,y1,x2,y2), PolarX(x, dist,angle), PolarY(y, dist,angle) . значительно упростит читебельность кода. Отличие от стандартных AngleBetween \ DistanceBetween - во первых, работа на прямую с координатами, во вторых, что куда как не маловажно - легкость написания.


     

    DarkVaderДата: Вторник, 23 Ноября 2010, 16:46:50 | Сообщение # 15
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    Quote (FkoFF)
    проще использовать небольшую библиотечку для работы с математическими значениями

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

    CreateUnit( player, unitid, x0 + ( r * Cos(a)), y0 + ( r * Sin(a)), face)

    через библиотеку это будет так

    function PolarX takes real x, real dist, real angle returns real
    return x + dist * Cos(angle * bj_DEGTORAD)
    endfunction

    function PolarY takes real y, real dist, real angle returns real
    return y + dist * Sin(angle * bj_DEGTORAD)
    endfunction

    CreateUnit( player, unitid, PolarX( x0, dist, angle), PolarY( y0, dist, angle), face)

    зачем этот вызов функции=) это тема по оптимизации а не по красоте написания кода

    к тому же Atan2 находит угол в радианах, почему бы не использовать его сразу без переходов что удаляет две операции умножения=)
    такая библиотека не оправдывает себя порой

    P.S ты бы хоть пример привел=))) я то понял о чем ты, а другие?=)

     

    FkoFFДата: Вторник, 23 Ноября 2010, 17:25:43 | Сообщение # 16
    Группа: Заблокированные
    Сообщений: 4356
    Награды: 1
    Репутация: 1413
    Блокировки:
    DarkVader, дело в том что да, оптимальнее писать сразу код, однако вызов функции облегчает написание и продуктивность работы кодера а не самого кода. Ну и к тому же по сути это практически одно и то же - математическое уравнение вынесенное в отдельную функцию.

    Не забывай к тому же что читаемость кода - куда как важный параметр в кодинге.

    и CreateUnit( player, unitid, x0 + r * Cos(a), y0 + r * Sin(a), face) захламляет строку в отличии от аккуратной
    CreateUnit( player, unitid, PolarX( x0, r, a), PolarY( y0, r, a), face)

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

    CreateUnit(player,unitid,x0+r*Cos(a),y0+r*Sin(a),face) без пробелов. И скобки в уравнении не нужны. Умножение и деление - первые действия в уравнении.

    Добавлено (23-11-2010, 17:25)
    ---------------------------------------------
    именно по этому лучше сразу вынести в переменные все подобные запросы и писать в последствии
    CreateUnit(p,u,x,y,a)
    где до этого объявляются
    local player p = GetOwningPlayer(GetTriggerUnit())
    local integer u = 'идюнита'
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    local real a = GetAngle(x,y,GetLocationX(GetSpellTargetLoc()),GetLocationY(GetSpellTargetLoc()))

    set x = PolarX(x, 10, a)
    set y = PolarY(y, 10, a)

    call CreateUnit(p,u,x,y,a)

    //actions

    set p = null

    конечно, когда речь идет о всего лишь создании юнита в оффсете - не стоит так делать, но когда речь идет о функции на движение юнита с эффектами и прочим - лучше повысить читабильность кода слегка занизив продуктивность, чем повышать продуктивность методами прямого умножения.
    К тому же я сомневаюсь что уравнение при вызове функции продуктивнее чем предварительное умножение и последующее использование при вызове.




    Сообщение отредактировал FkoFF - Вторник, 23 Ноября 2010, 17:26:15
     

    peinДата: Вторник, 23 Ноября 2010, 17:27:40 | Сообщение # 17
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    а нет ни кокого кода шоб пишеш и тебе выводит скоко утечек?
     

    FkoFFДата: Вторник, 23 Ноября 2010, 17:34:09 | Сообщение # 18
    Группа: Заблокированные
    Сообщений: 4356
    Награды: 1
    Репутация: 1413
    Блокировки:
    pein,

    создай триггер "check" и запусти карту.

    Изначальное количество ~миллион с хвостиком.

    Нормальный рост в течении игры ~+300 за минуту (в момент геймплея а не простого простоя)
    Терпимый рост в течении игры ~+700 за минуту (в момент геймплея а не простоя)
    Критический рост в течении игры ~+1000 за минуту (в момент геймплея а не простоя)

    Если число растет когда ничего не происходит - карта требует оптимизации.

    Code


    function Trig_check_Actions takes nothing returns nothing
         local timer Timer = CreateTimer()
         call DisplayTextToForce(GetForceOfPlayer(Player(0)), I2S(GetHandleId(Timer)))
         call DestroyTimer(Timer)
         set Timer = null
    endfunction

    function InitTrig_check takes nothing returns nothing
         local trigger trig = CreateTrigger()
         call TriggerRegisterTimerEventPeriodic(trig, 0.5)
         call TriggerAddAction(trig, function Trig_check_Actions)
         set trig = null
    endfunction



     

    peinДата: Вторник, 23 Ноября 2010, 19:33:05 | Сообщение # 19
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    FkoFF, как я понял код

    надо поместить в триг check
     

    FkoFFДата: Вторник, 23 Ноября 2010, 19:38:01 | Сообщение # 20
    Группа: Заблокированные
    Сообщений: 4356
    Награды: 1
    Репутация: 1413
    Блокировки:
    pein, да, целиком заменив все что есть внутри

     

    peinДата: Вторник, 23 Ноября 2010, 19:46:14 | Сообщение # 21
    9 уровень
    Группа: Проверенные
    Сообщений: 1114
    Награды: 1
    Репутация: 272
    Блокировки:
    FkoFF, спс,)
     

    EdiTTORRДата: Среда, 24 Ноября 2010, 18:51:39 | Сообщение # 22
    8 уровень
    Группа: Проверенные
    Сообщений: 585
    Награды: 0
    Репутация: 147
    Блокировки:
    Quote (DarkVader)
    100%

    Немного меньше :) Есть некоторые функции(их довольно мало) которые возвращают точки и не имеют аналогов на координатах.
    Пример: constant native GetSpellTargetLoc takes nothing returns location


    Местами здесь.
     

    FkoFFДата: Среда, 24 Ноября 2010, 18:59:23 | Сообщение # 23
    Группа: Заблокированные
    Сообщений: 4356
    Награды: 1
    Репутация: 1413
    Блокировки:
    EdiTTORR, Можно вытащить координаты:

    GetLocationX(GetSpellTargetLoc())
    GetLocationY(GetSpellTargetLoc())

    Слив.


     

    DarkVaderДата: Среда, 24 Ноября 2010, 19:50:12 | Сообщение # 24
    7 уровень
    Группа: Проверенные
    Сообщений: 357
    Награды: 0
    Репутация: 95
    Блокировки:
    Quote (EdiTTORR)
    Немного меньше Есть некоторые функции(их довольно мало) которые возвращают точки и не имеют аналогов на координатах. Пример: constant native GetSpellTargetLoc takes nothing returns location

    для особо слепых повторю

    координаты точки приказа способности

    Quote (DarkVader)
    GetSpellTargetX()
    GetSpellTargetY()
     

    EdiTTORRДата: Среда, 24 Ноября 2010, 21:14:33 | Сообщение # 25
    8 уровень
    Группа: Проверенные
    Сообщений: 585
    Награды: 0
    Репутация: 147
    Блокировки:
    Quote (DarkVader)
    координаты точки приказа способности

    онли 1.24b


    Местами здесь.
     

    Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Помощь в оптимизации jass
    • Страница 1 из 2
    • 1
    • 2
    • »
    Поиск:

    Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
    Хостинг от uCoz