WarCraft 3: Поток выполнения

Выполнение кода и обращение к данным
Теперь немного о потоках.
Стоит заметить, что поток в Warcraft 3 - немного не то же самое, что поток
в приложении операционной системы - отличие в том, что даже несколько потоков jass
не могут выполнить что-то в один и тот же момент времени физически, поэтому их
не надо синхронизировать, однако, я буду говорить "одновременно" для лучшего понимания.
Разберем с начала.
Мы уже знаем, что при запуске карты, создаётся один поток-триггер инициализации, который запускает функцию main.
Операции выполняются шаг за шагом, функция за функцией, пока он не дойдет до конца функции main и тогда он завершит свое выполнение. Каждая операция выполняется строго после предыдущей.
Если мы напишем в одной из функций TriggerSleepAction(1), то сценарий зависнет на 1 секунду, после чего продолжит свое выполнение. Это и есть поток, т.е. последовательная обработка заданной цепочки команд.
Однако, когда срабатывает событие, например, "Юнит атакован", запускается новый поток.
Этот поток начинается с функции-условия, заданной в триггере. После неё выполняется функция-действие. Но ничто не мешает вам и в самом действии задавать if-then-else.
С физической точки зрения, между функцией-условием (condition) и функцией-действием (action) есть 3 отличия:
  • Условия обрываются, если в них выполнить TriggerSleepAction;
  • Условия должны возвращать значения boolean, действия ничего не возвращают;
  • Действия не выполняются, если условие того же триггера вернуло false.
Лучше можно рассмотреть на рисунке - сверху вниз показано, какие потоки отрабатывают в какой момент времени.
Красным справа показано, что таймер порождает всё новые и новые потоки, несмотря на то, что процессор не успел отработать предыдущий. Вместе с утечками памяти - это и есть та причина, почему карта начинает тормозить и зависать.
Исходя из выше написанного, каждая отработка события триггера запускает новый jass-поток, который работает почти независимо от остальных.
После выхода из карты, все потоки завершаются.

Просмотров: 1 474

map_maiker #1 - 5 лет назад 0
интересно