Изменения

7352 байта добавлено ,  11:04, 5 августа 2013
Закончил перенос главы.
Строка 84: Строка 84:     
Переменная ''src''  используется как раз для этого. Когда src спящей операции удаляется, сама операция отменяется. Это почти всегда дает желаемый результат и проблема точной проверки отпадает. Если вы не хотите, чтобы операция отменилась, вам всегда следует ставить переменную ''src'' на ноль перед засыпанием. Это делает операцию независимой от существования ''src'' объекта.
 
Переменная ''src''  используется как раз для этого. Когда src спящей операции удаляется, сама операция отменяется. Это почти всегда дает желаемый результат и проблема точной проверки отпадает. Если вы не хотите, чтобы операция отменилась, вам всегда следует ставить переменную ''src'' на ноль перед засыпанием. Это делает операцию независимой от существования ''src'' объекта.
 +
 +
=== Тиканье часов ===
 +
 +
Сервер разделяет время на сегменты, называемые '''тиками'''. При каждом тике серверных часов, любые запланированные спящие операции начинают работать. Если ожидают несколько операций сразу, то они начнут работать друг за другом в том порядке, в каком засыпали.
 +
 +
Обычно сервер завершает обработку всех ждущих операций с запасом времени до конца тика. В оставшееся время он обрабатывает входящие данные, а если их нет - просто ждет. Если есть операции, требующие много времени для завершения, сервер может затрачивать дополнительное время. В этом случае тик будет длиться дольше, чем должен и вводные данные игрока могут притормаживать.
 +
 +
Это называется '''лагами''' сервера. С точки зрения игрока, это похоже на лаги сети, но в этом случае отставание может идти в обе стороны — и вводные, и выходные данные могут тормозить во время передачи. Чтобы узнать какие лаги у вас, вы можете проверить переменную ''world.cpu''. Она показывает, сколько процентов тика используется. Если около 100 и больше, то ваш сервер лагает.
 +
 +
Очевидно, что можно поставить более быстрый компьютер или писать более эффективные операции – это поможет снизить лаги сервера. Другой способ – поддаться и увеличить время тика. Это можно сделать, изменив ''world.tick_lag''. Чем длиннее тик, тем меньше лишних ресурсов компьютера используется для работы мира. Кстати, клиенты ограничены тем, что могут отправить только одну команду за тик, так что его удлинение может помочь уменьшить отставание вводных данных. Конечно, вы платите за это ценой замедления клиента, но лучше так, чем иметь жутко тормозящий сервер.
 +
 +
Все расчеты времени в игре основываются на ближайшем тике. Это значит, что если вам нужна быстрая синхронизация, вам нужно уменьшить ''world.tick_lag'' до приемлемого уровня. Стандартно - это 1, значит, что сервер тикает 10 раз в секунду. Уменьшая его, вы также можете ускорить темп, в котором игроки движутся и действуют. Однако, делая это, вы хорошо нагружаете сервер и сеть, что может привести к лагам.
 +
 +
=== Последовательность действий ===
 +
 +
Как вы уже заметили, и ''sleep'', и ''spawn'' можно использовать без параметра. В этом случае задержка настолько короткая, насколько возможно (т.е. только один тик). То же самое верно и в случае, если промежуток времени меньше длины тика. Иногда эта особенность используется, когда задержка нужна только для контроля порядка, в котором происходят события.
 +
 +
Например, предположим, вы хотите отобразить сообщение, когда мобы выходят из комнаты. Допустим, что вы не хотите, чтобы существа, выходящие в течение одного и того же тика с сообщением,  видели его. Проблема в том, что вы не знаете, кто захочет выйти в этот момент. В таком случае, вы можете просто отложить сообщение на мгновение. Это позволяет всем желающим выйти из комнаты до того, как сообщение отобразиться для других посетителей.
 +
 +
area/room
 +
    Exit()
 +
      . = ..()
 +
      if(. && usr) spawn src << "[usr] leaves."
 +
 +
Заметьте, как этот пример устанавливает значение для возвращения дополнительно к результату родительской операции. Это гарантирует, что выход операции точно разрешен. В противном случае, ''нулевое'' значение для возвращения не даст игроку выйти.
 +
 +
Кстати, обратите внимание на то, как мы проверяли, что ''usr'' не равно ''нулю''. Иначе сообщение будет генерироваться не только для мобов, но и для объектов, покидающих комнату тоже.
 +
 +
=== Бессонный Сервер ===
 +
 +
Осталось только кое-что прояснить, чтобы у вас не возникло лишних проблем. Спящие операции замораживают текущий процесс, вызывающие его процессы, процессы, которые вызывают вызывающий процесс и так далее, на определенный промежуток времени. Как вы уже видели, можно использовать spawn(), чтобы избежать ожидания за спящей операцией.
 +
 +
То, как это происходит, очень похоже на то, как сервер действует, когда вызывает операцию. Операции, вызванные сервером, включают в себя различные встроенные действия, наподобие ''Enter'', ''Exit'' и ''Login''. Если вы заснете в одной из таких операций, выполнение сервера немедленно продолжится, как будто вы возвратились из своей операции. Запомните, что действия сервера, наподобие движения объекта, не откладываются результатом.