Темы:
State, llResetScript, llGetFreeMemory
Сегодня мы подробнее рассмотрим state и немного узнаем об ограниченном количестве памяти, которое выделяет сервер для скриптов пользователей.
State
С официальным определением понятия state вы можете ознакомиться на соответствующих порталах, посвященных LSL, например, здесь.
Свое же объяснение я постараюсь сделать более простым. Даже если вы раньше имели опыт программирования, то вряд ли сталкивались с подобным. State - это что-то среднее между скриптом в скрипте и процедурами, правда, сходство поверхностное. Проще всего state показать на примере.

Пример 1
Разберемся с порядком выполнения скрипта. После того, как мы сохранили скрипт (reset), state default запускается на выполнение и ожидает срабатывания события прикосновения к объекту. Далее, после того, как к объекту прикоснулись, он выводит в общий чат "State default" и передает управление state my, который описан ниже. Тот, в свою очередь, опять ждет выполнения события touch_start, при его выполнении пишет в общий чат "state my" и возвращает управление обратно в state default, и так далее. Пример полностью рабочий, можете попробовать его в деле.
Вроде бы не сложно, но зачем это нужно, спросите вы? Немного терпения!
Теперь для примера напишем то же самое, но только в одном state. Для этого нам понадобится глобальная переменная и условия ветвления.

Пример 2
После сброса скрипта глобальной переменной "on" присваивается значение TRUE, и далее скрипт ожидает нажатия на объект. Как только это событие происходит, выполняется условие проверки глобальной переменной - если оно TRUE, то в общий чат выводится "One", переменной присваивается значение FALSE и обработка события прекращается до следующего нажатия на объект, и так далее. Помимо того, что мы усложнили скрипт, внеся в него глобальную переменную и условие, в этом случае мы потеряли и в простоте кода. Надеюсь, теперь основная суть state ясна.
Существуют два события, относящиеся к state. Это state_entry, которое выполняется при передаче управления в state (см. LSL. Основы. Часть 1), и state_end, которое выполняется при завершении работы текущего state. Следует помнить, что событие state_end выполнится раньше события state_start в state, которому передается управление. Также напомню, что в любом скрипте обязательно должен присутствовать state default, при этом перед ним не нужно писать служебное слово state, иначе компилятор вернет ошибку.
Кроме того, не забывайте, что событие state_entry не срабатывает, когда вы достаете предмет из инвентаря, кладете на землю или одеваете на себя. Это очень частая ошибка новичков. Для подобной реакции объекта существует событие on_rez() и/или функция llResetScrpt().

Пример 3
В данном случае как раз и достигается нужный эффект - после того как вы достанете объект из инвентаря, сработает событие on_rez и запустится функция llResetScript.
Максимальное количество state в одном скрипте ограничено количеством 144, включая default state.
llResetScript
Синтаксис: llResetScript()
Описание: Происходит сброс скрипта, все значения устанавливаются по умолчанию, все ожидающие события останавливаются. Управление передается в default state, и выполняется событие state_entry, если оно описано. Совместима с функцией llResetOtherScript. Выполнить llResetScript также можно из редактора скриптов, нажав на кнопку Reset.
Ограничения
Следует помнить, что размер скрипта ограничен 16 килобайтами! Сюда входят код, переменные, события и так далее, и размер оставшейся памяти может уменьшаться даже во время работы скрипта. После превышения этого объема вам будет выдано сообщение об ошибке. Существует функция llGetFreeMemory, которая может показать вам, сколько памяти еще доступно для вашего скрипта.

Пример 4
Не будем пока рассматривать магическое string, это тема для будущих занятий, сейчас вам только следует запомнить, что на размер скрипта накладывается ограничение, и объем оставшейся свободной памяти можно узнать вышеприведенным способом. Не следует буквально воспринимать оставшиеся байты, бытует мнение, что цифра весьма приблизительна.
|
Dryke 17:20, 28.05.07 ссылка
Поскольку это всё пишется для неспециалистов, то стоило бы заострить внимание на определении слова "скрипт" - в каком контексте оно означает программу как действие, в каком текст с набором инструкций. Скрипт в скрипте, память для скриптов, сохранили скрипт. У Линденов получилась весьма оригинальная схема наборов событийных обработчиков. Кстати, скрипт - это набор интерпретируемых инструкций. А в lsl текст программы компилируется в промежуточный код. Ответить |














