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

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

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
Логические конструкции в примерах
Логика это мышление вопреки общему мнению только правильная логика может быть оптимизацией, наличие или отсутствие утечек с оптимизацией не имеет ничего общего по определению.

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

1) Немного теории – Устройство условного оператора и его виды:
A = Прямой – не использующий цикл, последовательно проверяющий некоторую величину на соответствие каким либо условиям, в фиксированных рамках, например

Проверка на вхождение числа в диапозон от 10 до 15
Код:
if I > 10 then
    первое условие выполнено, продолжить
    if I < 15 then
        второе условие выполнено, число входит в диапозон
        return true
    endif
else
    условия провалены, одно или оба не имеет значения
    return false
endif


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

Вот этот пример выявляет строгое соответствие числа 10 или 15, как видите это строго линейный оператор
Код:
if I == 10 then
    return true
elseif I == 15 then
    return true
else
    return false
endif


Б = С использованием цикла, при помощи которого проверка идёт до тех пор пока условие не выполнено, хотя бы одно из условий, как пример:


Код:
loop
    exitwhen X == true
    exitwhen I == 10
    exitwhen I == 20
    set X = true
endloop


Вот например при помощи такого оператора можно выяснить является ли число 10 или 20
если нет то цикл прервётся на втором запуске

Длина и количество условий - неограниченны.

Как пример возможностей оптимизации я предлагаю вам вот такой код:

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

Код:
call GroupEnumUnitsInRange(Grou_G_1,Xcoo_R_1,Ycoo_R_1,600,null)
        loop
            set Temp_U_1 = FirstOfGroup (Grou_G_1)
            exitwhen Temp_U_1 == null
            if IsUnitType(Temp_U_1,UNIT_TYPE_HERO) and IsUnitEnemy(Dead_U_1,GetOwningPlayer(Temp_U_1)) then
                call GroupRemoveUnit(Grou_G_1,Temp_U_1)
                if not IsPlayerInForce(GetOwningPlayer(Temp_U_1),Forc_F_1) then
                    call ForceAddPlayer(Forc_F_1,GetOwningPlayer(Temp_U_1))
                    различные действия
                endif
            else
                call GroupRemoveUnit(Grou_G_1,Temp_U_1)
            endif
        endloop

Как вы можете видеть некоторое количество ненужных сложностей на лицо, ну будем исправлять.

Для получения того, что необходимо самым правильным методом требуется составить план, что бы, не тупить.
Итак, план вы должны составить максимально понятным и чистым.

1)Собираем всех юнитов
2)Для владельцев выполняем действия

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

1)Собираем юнитов для каждого игрока в отдельности
2)Выполняем действия

Как видите количество действий изменилось

Единственное что нам понадобиться по мимо локальных переменных это одна глобалка
для сверки номера игрока

Код:
loop
    exitwhen I == 12
    call GroupEnumUnitsInRangeCounted(Grou_G_1,Xcoo_R_1,Ycoo_R_1,600,Condition(function Player(I)),1)
    
    if FirstOfGroup(Grou_G_1) != null then
        различные действия
    endif
    
    call GroupClear(Grou_G_1)
    set I = I + 1    
endloop

Отредактировано DioD, 04.11.2006 в 14:03.
Старый 03.11.2006, 21:00
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Логика это мышление вопреки общему мнению только правильная логика может быть оптимизацией, утечки тут вообще нипричём.

хочеш сказать что если я нормально построю код, но удалять обьекты не буду, то это будет грамотная оптимизация?
Старый 03.11.2006, 21:02
DioD

offline
Опыт: 45,134
Активность:
увы если ты код построишь неправильнотолку от удалениябудет нуль
Старый 03.11.2006, 21:22
J
expert
offline
Опыт: 48,447
Активность:
DioD но и на оборот тоже нуль, такчто логический вывод - утечки всеже причем
Старый 03.11.2006, 21:33
NETRAT

offline
Опыт: 83,712
Активность:
Диод, а разве это
Код:
call GroupEnumUnitsInRange(Grou_G_1,Xcoo_R_1,Ycoo_R_1,600,null)
        set Temp_S_2 = "+"+I2S(Gold_I_1/3+1)
        loop
            set Temp_U_1 = FirstOfGroup (Grou_G_1)
            exitwhen Temp_U_1 == null
красивое решение? или ты что-то другое хочешь показать?
Старый 03.11.2006, 21:37
DioD

offline
Опыт: 45,134
Активность:
ты не понял фишку
щас всё будет
Старый 03.11.2006, 21:42
J
expert
offline
Опыт: 48,447
Активность:
хм... ты будеш описывать все логические упрощения всех комбинаций кодов?
Старый 03.11.2006, 21:45
NETRAT

offline
Опыт: 83,712
Активность:
Угу, просто такие вещи меня обычно напрягают =\ итератор против многократного бинарного поиска
Старый 03.11.2006, 21:46
DioD

offline
Опыт: 45,134
Активность:
я выбрал этот код так как писал его изначально для этой цели, сделать неоптимизированымапотом довести до ума
Старый 03.11.2006, 21:46
NETRAT

offline
Опыт: 83,712
Активность:
И расскажи что она собственно делает, эта система
Старый 03.11.2006, 21:50
J
expert
offline
Опыт: 48,447
Активность:
ты вроде пишеш тоже что писал я.. только немного беспольезнее... вроде никого не будут интересовать твои упрощения кодов, если никому они непонадобятся... нужно говорить "как?" "почему?" и "зачем?" что я и говорил, а переделывать коды.... имхо, это разве что по заказу:)
ну а вообщем - продолжай

Отредактировано Jon, 03.11.2006 в 21:56.
Старый 03.11.2006, 21:51
DioD

offline
Опыт: 45,134
Активность:
смысл в том что у нас есть АОС, там идут крипы и остальной хлам, так вот если кто-то умирает, и рядом есть герой игрока, этот игрок получит часть награды, проблем здесь масса, от фильтров что не пускают параметры до пробега по группам, что как вы уже виделилечиться достаточно оригинальным методом, пишутолько потому, что никто ранее эти проблемы не освещал, многие джазеры высого уровня страдают от невозможности мыслить глобально
план
  1. группы
  2. вычисления
  3. булеан
  4. оптимизация памяти
  5. о локалках
  6. о типах
на этом коде я расскажу очень многое, то что он делает неважно, важно только как он это делает
Старый 03.11.2006, 21:56
Ответ

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

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

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

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



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