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

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

Ответ
 
hapr

offline
Опыт: 149
Активность:
Вопросы про опцимизацию кода
При создании кода у меня возникли некоторые вопросы:
Что будет более быстрым решением
Код:
1.a)if a > 1 and a <  5 then   или  b)if a > 1 then
.....                                  if a < 5 then
endif                                   ......
                                        endif
                                       endif

2.Если мне нужно использовать, допустим, 10 переменных integer имеет ли смысл заносить их в массив?
3.call IssueTargetOrderById(Paladin, 852092, unit) - функция, которая заставляет паладина использовать благодать на юните.
В принципе главным условием является, находиться ли юнит на расстоянии достаточном для действия заклинания, что легко проверяется с помощью IsUnitInRange(Paladin, unit, 750). Но ведь паладин может быть мертв или у его будет недостаточно манны. По этому у меня возник вопрос, что будет мении ресурсоемким проверять эти условия или же просто запускать функцию call IssueTargetOrderById(Paladin, 852092, unit)? Ах да может, кто нибудь знает можно ли в с помощью native функции проверять успело ли перезарядиться способность?
4.В чем отличие constant native от native и различаются ли они по быстродействию?
5.Что луче будет использовать локальные переменные или глобальные для быстродействия если функция запускается например в цикле каждые 2 секунды но больше не в каких других функциях не вызывается то есть можно использовать легко как глобальные так и локальные переменные.
6.
Код:
globals
 constant player Ai_player   = Player(GetAiPlayer())//Игрок компьютер   
 constant real Stx           = GetStartLocationX(GetPlayerStartLocation(Ai_player))//координаты стартовой позиции компьютера
 constant real Sty           = GetStartLocationY(GetPlayerStartLocation(Ai_player))//координаты стартовой позиции компьютера
 group  Grp                  = null
endglobals
function Rescue takes nothing returns nothing
    local group grp   = CreateGroup()
    local unit u   = null
    local real a   = 0
call GroupEnumUnitsOfPlayer(grp, Ai_player, null)
loop
 set u = FirstOfGroup(grp)
 exitwhen u == null
 call GroupRemoveUnit(grp, u) 
if GetUnitFoodUsed(u) > 1 then
 set a = GetUnitState(u, UNIT_STATE_LIFE)
 if IsUnitInGroup(u, Grp) then
  if a >= 105 then
   call RecycleGuardPosition(u)
    call IssueImmediateOrderById(u, 851972 )
   call GroupRemoveUnit(Grp, u) 
   elseif a <= 0 then
   call GroupRemoveUnit(Grp, u) 
  endif
 elseif a <= 100 and a > 0 then
  call RemoveGuardPosition(u)
  call IssuePointOrderById(u, 851986, Stx, Sty)
  call GroupAddUnit(Grp, u)
 endif
endif
endloop
call DestroyGroup(grp)
set grp = null
endfunction 
function main takes nothing returns nothing
    set Grp           = CreateGroup()
endfunction

Эта простая функция заставляет при здоровье юнита меньше 100 отправляться на базу.
По этой функции у меня возникает несколько вопросов:
Есть ли здесь утечки?
Если юнит умрет в моей группе "Grp" удалится ли он, потом сам или стоит как в моей функции удалять самому из группы?
Какие переменные работают быстрее constant или просто?
Стоит ли часто используемые числа в носить в constant для быстродействия как, например в coomon.ai "constant integer HARD = 3"?
В моей функции я добавлял юнитов для различия в другую группу будут ли эти две функции работать быстрее чем с группами?:
Код:
native GetUnitUserData              takes unit whichUnit returns integer
 native SetUnitUserData              takes unit whichUnit, integer data returns nothing
Хм,надеюсь вапросы неслишком уж тупые... ну и много же их насабиралось!

Отредактировано hapr, 11.01.2008 в 00:40.
Старый 10.01.2008, 01:10
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
1. Первое, имхо. Хотя особой разницы нет.
2. Если они однотипны, и будут использоваться все для какой-то одной цели, то лучше массив.
3. call IssueTargetOrderById(Paladin, 852092, unit) приведёт к тому, что Паладин подбежит к цели сам, если расстояния не хватит. Имхо, проверки тут излишни, только если есть какие-то определённые условия и требования. Нативки для проверки перезорядки нет.
4. Не знаю, может поиск что-н подскажет.
5. Ну, имхо, тут лучше глобалки. Не будет кеша и геморроя с ним. Главное - следить за самим глобалками.
6. Сорри, пока некогда в коде разбираться.
Если юнит умирает, он остаётся в группе.
7. Имхо, константы только для удобства в написании кода, если одно и тоже число встечается большое кол-во раз, лучше записать один раз в константу, а во всём коде использовать её. Чтоб если понабодится сменить значение числа, лучше сменить один раз в самой константе, чем искать потом это число по всему коду.
8. Смотря что ты подразумаеваешь под "функции работать быстрее чем с группами". Не понял вопроса.
Старый 10.01.2008, 07:00
adic3x

offline
Опыт: 108,439
Активность:
1) конечно анд, если так как у тебя, т.е. всего один вариант
2) если тебе нужен доступ к переменной по индексу то конечно массив, если нет то никакие массивы ненужны
3)
Код:
native IssueTargetOrderById         takes unit whichUnit, integer order, widget targetWidget returns boolean

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

зы с функцией main() поосторожней, в плане того, что она дб одна)
Старый 10.01.2008, 11:09
S

offline
Опыт: 43,833
Активность:
Просьба к автору - заноси jass в тег [ code ] (без пробелов)...
Старый 10.01.2008, 11:21
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
jass язык скриптовый там и так все выполняется довольно медленно, так что разница в выполнении двух конструкций может быть в разы меньше чем время выполнения самих конструкций так, что особо этим заморачиватся не надо (если только этот блок не выполняется например 10к раз подряд).
---
4. Наверняка не знает никто (кроме естественно близзов), но опытным путем было установлено, что константные функции выполняются быстрее.
Старый 10.01.2008, 12:46
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
что константные функции выполняются быстрее.
o rly ? пусть векс убьётьса головой ап стену ибо псто 2005 года инорм челы уже давно доказали обратное т.е. нету некакой разнице (на практике) в виде байткода... так что лутче не ссылатьса на материал 2-3 летней давности...
Старый 10.01.2008, 21:23
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Toadcop, линк дай плиз...
Старый 10.01.2008, 22:28
hapr

offline
Опыт: 149
Активность:
Цитата:
Сообщение от DFlyer
8. Смотря что ты подразумаеваешь под "функции работать быстрее чем с группами". Не понял вопроса.

Ответ я понял просто это мне надо для Ai,а ведь во время боя не очень будет кстати если паладин побежит куда-нибудь далеко, поэтому проверка расстояния между им и целью в моем случае и нужна.
Как я понимаю SetUnitUserData позволяет у юнита скажем так изменять число, а GetUnitUserData соответственно получает число юнита. Поэтому для различия юнитов можно просто добавлять в группу, а потом проверять находится ли он в этой группе, либо же с помощью SetUnitUserData изменять число, а потом проверять с помощью GetUnitUserData чему оно равно, а вот что быстрее …

Цитата:
Сообщение от ADOLF
6) вообще можно использовать две глобальные группы, что бы не создавать каждый раз. зы про код вроде так норм, только еще юнита бы обнулить сет а=нул

Не понял ведь разве в моем случае из цикла не происходит выход, когда u == null? а тогда зачем обнулять?
А вот в этом случае:
Код:
function Rescue takes nothing returns nothing
    local group grp   = CreateGroup()
    local unit u      = null
call GroupEnumUnitsOfPlayer(grp, Player(1), null)
loop
 set u = FirstOfGroup(grp)
 exitwhen u == null
 call GroupRemoveUnit(grp, u) 
if GetUnitTypeId(u) == 'hpea' then
 exitwhen u != null
 endif
endloop
call DestroyGroup(grp)
set grp = null
endfunction

Если эту бесполезную функцию вставить в вечный цикл кода AI(причем AI нечего наделает кроме сбора ресурсов) и воспользоваться способом, предложенным Jon для проверки на утечки в статье Оптимизация - модулем RB, то числа, появляющиеся на экране не изменяются. Эта значит, что не надо обнулять юнита? или я не так понимаю?

Цитата:
Сообщение от exploder
jass язык скриптовый там и так все выполняется довольно медленно, так что разница в выполнении двух конструкций может быть в разы меньше чем время выполнения самих конструкций так, что особо этим заморачиватся не надо (если только этот блок не выполняется например 10к раз подряд).

Имеется в виду 10000? А вызываться эта функция будет в вечном цикле с периодом не более 2 секунды до тех пор покуда не закончится игра.
Старый 11.01.2008, 00:53
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Не понял ведь разве в моем случае из цикла не происходит выход, когда u == null? а тогда зачем обнулять?

а, да, точно)

насчет юзер даты, думаю она как то уместнее... но опять же при некоторых условиях ты можешь все просто сделать массивом т.е. к примеру... ну тут вЖасс наверное нужен, по крайней мере его концепция, смысл в том что есть класс аи, он содержит непосредственно героя, и остальные свойсва, к примеру приказ, абилы, ну я еще не знаю что там... просто циклом проходится по всем аи и т.д. если что неясно спрашуй)
Старый 11.01.2008, 14:20
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
Toadcop, линк дай плиз...
на кампах PipeDream изучал байткод простых функций и константных... разници небыло никакой =)

ну короче вериш мне насрать =) это ваши проблемы "верить" или нет.
как не как PipeDream автор Grimoire. а Вексориан всего лиш препроццесора и то основаном на GoldParser'e (как я понял). да и вообще методы измерения предоставленые в линке на вц3джасс.сом убожественые даже TimeWatch native не юзалась... и то. самый важный аргумент это байткод т.к. он выполняетьса "вирутальной машиной"
Старый 12.01.2008, 01:03
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Причем тут код самой функции? Естествено компиляция константной и неконстантой функции в байт код будет одинаковая. В посте на джасскоме, рассматривается вариант, когда адреса вызова функций хранятся в разных таблицах, соотвественно у константных функций таблица меньше и поиск и вызов происходит быстрее. Так что умные слова вроде "байткод" и "виртуальная машина" мне ничего не говрят...
Под "выполняются быстрее" я имел ввиду, что вызов константных функций происходит быстрее, а не выполнение самого тела функции, двусмысленно сказал...
Старый 12.01.2008, 11:27
Toadcop

offline
Опыт: 54,313
Активность:
exploder я понимаю что ты особено одарёный и про прочтение поста Вексоринафа считаеш что ты понял миро создание. НО КОНСТАНТНЫЕ и НЕ константные функции пременые и т.п. находятьса в одной таблице... =) (тож было проверино) т.е. близзы хотели сделать но не сделали что то подобное.
+ количество переменых или массивов НЕ влияет на их быстродействие. с локальными переменами беда в том что таблиа создаётьса (и разширяетьса) динамически т.е. инциализировать много локалок в бстро вызываемых функция не желательно.

и вообще ты пишеш оприраясь на чужие факты... я пишу по тому что я нормально тестировал и не 1 раз...

короче не шарю что тебе не нравитьса =) я? ну слава богу =)
Старый 13.01.2008, 00:53
Ответ

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

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

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

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



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