Форум портала о WarCraft Форум портала о WarCraft
порно чат

Вернуться   Форум портала о WarCraft > Вселенная WarCraft > World Editor > Статьи
Регистрация Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Ответ
 
Опции темы Опции просмотра
Старый 24.07.2010, 22:41   #1
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Немного об оптимизации кода.

Немного об оптимизации кода.



Оптимизация - упрощение и уменьшение объема программного кода с целью экономии ресурсов (в том числе временных). В предыдущих статьях об этом уже заходила. Редактор очень неграмотно генерирует скрипт с точки зрения оптимизации и удобства чтения. Чем сложнее триггер, тем больше будет код, созданный редактором. В одном триггере редактор может ассоциировать десятки ненужных функций, причем если триггеры похожи, то все равно для каждого из них будет создан этот огромный список. В этом можно будет легко убедится, конвертировав обычный триггер, желательно большой и сложный, в текстовый. Кроме обычных функций инициализации, условия и действия там, скорее всего, будет несколько десятков других с такими названиями (пусть триггер называется MyTrig): Trig_MyTrig_Function_xxxxxxxx, где xxxxxxxx - набор из чисел. Эти числа генерируются по специальной схеме - ее объяснять не буду, она достаточно простая. Обычно такие функции возвращают boolean и служат для проверки каких-то условий. В 90% случаев они нужны только самому редактору для упрощения построения триггерных схем. Исключение составляют некоторые функции, которые, например, используются в структурах 'Pick Every Unit in Group and do Action...' - такие функции ничего не возвращают. Больше всего получается сократить размер условия - сначала смотрим функцию Trig_MyTrig_Conditions - что из нее вызывается, идем туда и переносим содержимое тех функций в условие, после чего сами функции удаляем. Так можно избавиться от многих лишних функций, сократить объем кода и увеличить скорость выполнения программы. Еще одна из "ошибок" редактора - неграмотное использование синтаксиса операторов и функций. Пример (еще очень короткий) неграмотного условия:

function Trig_MyTrig_function_00000010 takes nothing returns boolean
if not (GetTriggerUnit() == 'nslf') then
return true
else
return false
endfunction

function Trig_MyTrig_Conditions takes nothing returns boolean
if not (Trig_MyTrig_function_00000010() == true) then
return true
else
return false
endif
endfunction

Это типичный пример условия, генерированного редактором. Функция Trig_MyTrig_function_00000010 является лишней, да и операторы if и return использованы неграмотно. Вот как можно все упростить:

Сначала упростим первую функцию: она возвращает boolean, тогда зачем нужен if? Конечно, не нужен! Можно записать возвращаемое значение так:

return GetTriggerUnit() != 'nslf'

Можете проверить, эта одна строчка делает ТО ЖЕ самое, что и 4 строки в оригинальной функции. Когда GetTriggerUnit() равно 'nslf' - выражение будет равно true, мы его и вернем. Наоборот тоже верно. Теперь смотрим функцию условия - ситуация аналогична, вместо Trig_MyTrig_function_00000010() подставляем (GetTriggerUnit() != 'nslf') в скобках, а то можно напутать приоритеты вычисления! Теперь первую функцию можно смело удалить. Оптимизируем дальше - строку

if not ((GetTriggerUnit() != 'nslf') == true) then

можно упростить до такой строки:

if GetTriggerUnit() == 'nslf' then

А затем вообще избавиться от if:

function Trig_MyTrig_Conditions takes nothing returns boolean
return GetTriggerUnit() == 'nslf'
endfunction

Условие сократилось до одной строки! Вот так. Так что нет ничего удивительного в приведенном ниже выражении - мы присваиваем VarBool true, если A равно B и наоборот.

set VarBool = A == B

В теле функции действия ошибок не меньше - редактор не использует локальные переменные. Так десятки обращений к элементу массива можно осуществить одной локальной переменной integer, которой присвоено необходимое значение. Хотел привести пример реального скрипта из своей карты, но не решился - неоптимизированный код занимал ровно 499 (!) строк и использовал для внутренних расчетов 2 глобальные переменные, а написанный 'от руки' - 67 строк и для расчетов использовал только локальные переменные. Кроме того, 'ручной' код гораздо легче читать и выполняется он намного быстрее. В кажом приведенных примерах вы увидете, какие именно способы оптимизации могут быть применены. Хотя это немного усложняет понимание примеров новичкам.

Автор: Caсоdemon
© WC3.RU, 2002-2010 гг
Нашли ошибки и недоработки в статье? Сообщите нам в раздел Поддержки! С уважением, WC3.RU
__________________
Смотри подругому !
VAV вне форума   Ответить с цитированием
Старый 12.08.2010, 14:39   #2
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Ответ: Немного об оптимизации кода.

Другие статьи:

Основы JASS.
JASS - Общие понятия.
Синтаксис JASS.
JASS - Библиотечные функции. Часть 1.
JASS - Библиотечные функции. Часть 2.
JASS - Операторы.
JASS - Выражения
JASS - Комментарии.
JASS - Функции
JASS - Типы
JASS - Заключение.
Faq по созданию рельефа.
Зачем так много триггеров?
Немного об оптимизации кода.
Текстовые триггеры
Создаем простейшие карты (карты для melee)
Событие с переменным периодом.
Познаем триггеры (Triggers)
Познаем регионы (locations)
Познаем переменные...
Отлавливаем двойной клик мышью.
Массивы и циклы в обычных и текстовых триггерах
Локальные переменные в Custom Text
Камеры, спецэффекты, карта, цвета, кэш...
Добавление своих функций в триггеры
Добавление своих моделей и др. в карту
Делаем очень большую карту...
Делаем огнемет.
Улучшенная версия огнемета...
Глюки worldeditor'a
Random с задаваемой вероятностью - аура.
__________________
Смотри подругому !
VAV вне форума   Ответить с цитированием
Ответ


Опции темы
Опции просмотра

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

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


Часовой пояс GMT +4, время: 17:43.

Design Developed by CompleteGFX
vBulletin® Version 3.6.7.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot