Перейти к контенту

Справочник по функциям и классам


Рекомендуемые сообщения

По совету Artos-а решил изложить материал, касающийся работы с coroutine тут, поскольку данная таблица входит в пакет Lua СТАЛКЕР-а, и более подходящей темы трудно найти.

Нужность/ненужность данной информации оставлю на рассмотрение malandrinus-а, т.к. практическое использование подпрограмм пока находится под большим вопросом.

Тем не менее есть люди интересующиеся, поэтому продолжу...

Итак, обо всё по порядку (malandrinus-у. Можно я буду писать частями? Хочется сделать не только информативно, но и придать внешний вид. А вот со свободным временем у меня не очень.) :

----------------------------------------------------------------------------------------------------------------------------------------

Операции для работы с подпрограммами собраны в виде подбиблиотеки базовой библиотеки и содержатся внутри таблицы coroutine.

Эта таблица содержит всего шесть функций :

 

create

wrap

resume

yield

status

running

 

Я их подразделяю на основные :

create и wrap - создают подпрограмму

resume - запускает или продолжает выполнение подпрограммы

yield - приостанавливает выполнение подпрограммы

 

И служебные :

status - возвращает состояние подпрограммы

running - возвращает саму подпрограмму

 

Рассмотрим их подробнее.

  coroutine.create (Показать)
Изменено пользователем Cyclone
  • Полезно 1
Ссылка на комментарий

Ранее я рекомендовал не использовать операцию конкатенации цепочкой в стиле s1..s2..s3..s4, поскольку счёл из общих соображений, что должен происходить степенной рост времени выполнения и резкое замедление работы при росте числа соединяемых строк. Я это утверждение не проверил, и выяснилось, что я ошибался. RvP провёл тесты и сравнил три разных метода конкатенации. Привожу его тест для чистого Lua в сокращённом виде с результатами измерений в комментариях.

  тестовый скрипт (Показать)
Изменено пользователем malandrinus
  • Полезно 2
  Полезный утиль (Показать)
Ссылка на комментарий

Хотелось бы узнать конкретнее про ф-цию parent у игровый объектов. У меня она возвращала объект, у которого находится предмет.

К примеру:

local oParent = db.actor:object("bread"):parent()

Вернет объект актора.

 

Так а что ещё конкретнее надо? Всё сам и сказал. Где объект лежит, того и вернёт. Очевидно имеет смысл только для инвентарных предметов.

И кстати, я это писал в посте про game_object.

Malandrinus

Изменено пользователем malandrinus
Ссылка на комментарий

malandrinus, RvP

По следам разбора конкатенации...

Найду свободное время - поэкперементирую, но пока вот мои результаты в SciTE (??? не вписываются в заключение ???) :

table     1.875
concat    0.344
format    1.5

 

Добавлено через 9 мин.:

Ага. Увеличил размер строки и всё стало на свои места.

malandrinus, удали пожалуйста мой пост. При разных длинах строк происходят совершенно интересные вещи.

Разберу - отпишусь конкретнее.

Изменено пользователем Gun12
Ссылка на комментарий

Да, попробуйте сделать строки длиной по 99 символов (ужасная задержка), а затем по 100 (обыгрывает concat) и сравните результаты. Это только у меня format так себя ведет?

Изменено пользователем Gun12
Ссылка на комментарий

Gun12, при длине всех строк 99 символов(строки разные), имею результат:

table 1.781

concat 0.734

foramt 8.719

 

а при длине 100 формат выполняется за 1.4, непонятно...

Изменено пользователем RvP

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

Всё дело в том, что в зависимости от длины строки, модификатор 's' обрабатывается разными методами. Вот кусок кода, отвечающего за данный модификатор, из исходника метода обработки функции string.format:

  Раскрывающийся текст (Показать)

Опаа-а!!! Ливер вылез!

Ссылка на комментарий

singapur22

Вот спасибо. Теперь можно внести дополнение в определение - "При работе с заведомо длинными строками (100 и более символов) следует использовать

string.format, который будет работать быстрее чем table.concat"

Ссылка на комментарий

Теперь я забираю свои слова, сказанные выше, назад.

Если поставить все тестовые варианты в равные условия, то результаты сильно изменяться.

Изначально я создал таблицу строк, а потом использовал обращение к ней из каждого варианта.

Для string.format создал идеальные условия, т.к. иначе проигрыш будет слишком очевиден.

  код (Показать)
Изменено пользователем Gun12
Ссылка на комментарий
Gun12, Хм. А теперь замерь время работы функции unpack() и вычти результат от значения пременной t2. Только в этом случае ты получишь истиное время выполнения функции format.

Опаа-а!!! Ливер вылез!

Ссылка на комментарий

Изначально, вместо unpack я писал tb[1], tb[2], tb[3], tb[4], tb[5].

Результат был ещё хуже. Как бы ещё немного помог ей.

P.S.

Что-то мне подсказывает, что мы не в той теме общаемся. Нам бы в "Скриптование..." перейти.

Изменено пользователем Gun12
Ссылка на комментарий

Gun12, Поэкспериментировал с вашей функцией format. Максимальную скорость получил только в данном случае:

local a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaa" --100 символов
local b = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbb" --100 символов
local c = "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccc" --100 символов
local d = "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddd" --100 символов
local e = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeeeeee" --100 символов

function f(...)
    t = os.clock()
    local q
    for i=1, 100000 do
        q = string.format("%s%s%s%s%s", ...)
    end
    print("format", os.clock() - t)
end

f(a,b,c,d,e)

Причём, обязательно как отдельную функцию, с использованием неявного списка аргументов. (при использовании явных аргументов, время увеличивается)

Но и в этом случае, конкатенация работает немногим быстрее.

 

P.S.

  посскриптум (Показать)
Изменено пользователем singapur22

Опаа-а!!! Ливер вылез!

Ссылка на комментарий

singapur22, Gun12

А я бы осмелился посоветовать подобные разборки/ковырялки в скриптах/классах/методах/функциях проводить в рабочих топиках типа "Скриптование, ...", откуда позже уже проверенные и важные материалы вносить в "Справочник ...".

А излишки/издержки - можно будет подчищать и в рабочем топике.

ИМХО. ;)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Если-бы у меня спросили о темах постоянно возникающих у меня вопросов - я бы ответил так:

 

x-Ray: программирование на Lua.

x-Ray: создание, настройка и управление объектами.

x-Ray: создание интерфейсов.

 

[X]

 

 

 

 

 

Изменено пользователем 7.9

всё легко

Ссылка на комментарий

Не один раз на разных форумах задавали вопрос о том что-же такое шаблон и с чем его едят.

Совсем недавно подобный вопрос всплыл и тут. Вот и решил , за отсутствием специализированного топика по lua, выложить материал тут.

Но прежде всего хочу сказать, что всё сказанное мною относиться к заре моего познавания Lua.

Сейчас нет времени исправлять то, чего не знал, не так объяснил и не правильно понимал. Поэтому выкладываю как было на тот момент.

Всё же лучше чем сухие предложения из официального мануала.

С вопросами (а также тонкостями) составления шаблонов обращаться либо в ПМ, либо (лучше в плане всеобщего образования) в теме "Скриптование, спавн и логика ".

Хватит лирики, вот ссылка на страничку из моего манула по Lua 2-x двухгодичной давности :

http://ifolder.ru/25675390

Изменено пользователем Gun12
Ссылка на комментарий

И ещё раз о скоростях вычислений в Lua. В частности затронем тему работ с таблицами.

Как не странно, работая с таблицами (особенно с "массивными"), нужно учитывать, как мы её будем итерировать, в том, или ином случае.

Строго-индексированные таблицы, многие предпочитают итерировать посредством функции ipairs(). Данный способ наиьолее удобный, но работает он в два раза медленнее стандартного числового итерирования:

  Пример (Показать)
Изменено пользователем singapur22

Опаа-а!!! Ливер вылез!

Ссылка на комментарий

singapur22,

:)

    for i=0, 1000000 do j = tbl[1] end

Время то хоть зависит от длины цикла?

 

  Цитата
Далее. Имеется различие в скорости считывания данных из таблицы, при числовых и строчных ключах. Работая с алгоритмами матриц, обратил внимание, что строчные ключи считываются на ~10...50% быстрее, чем числовые(индексированные), не зависимо от длин имён. По крайней мере, при длинах имён в 1 и 10 символов, различий замечено не было:

Следующий тест не проверяет, что индексированные медленнее. У тебя там нет никакого индексированного доступа, так как это уже хеш-таблица.

Изменено пользователем abramcumner
Ссылка на комментарий
  Цитата
u - знаковое значение

s - беззнаковое значение

Скорее наоборот.

  Цитата
Обратите внимаение, что для типа s8 (знаковый байт) нет метода записи. Подозреваю, что вместо него можно использовать соответствующий метод для беззнакового типа.

Сохранив в пакет через метод u8 число -10, а прочитав с помощью s8, я получил 0, читая с помощью u8 - 246.

То есть нельзя сохранить и прочитать отрицательное число?

 

malandrinus, Извиняюсь, всё работает.

Изменено пользователем Real Wolf
Ссылка на комментарий

Real Wolf,

  Цитата
Скорее наоборот.

Очепятался. Спасибо, что заметил.

 

  Цитата
Сохранив в пакет через метод u8 число -10, а прочитав с помощью s8, я получил 0, читая с помощью u8 - 246.

Это странно, поскольку я проверил весь допустимый диапазон [-128, 127] и работает именно так, как я написал. Т.е. пишем с помощью w_u8 отрицательное число и без проблем читаем его с помощью r_s8. Какой движок используешь для теста? Приведи пожалуйста код.

 

P.S.: информацию в посте поправил.

  Полезный утиль (Показать)
Ссылка на комментарий

Недавно, изучая нет-пакеты, наткнулся на описание интерфейса "cse_alife_inventory_item", некоторые его параметры вызывают любопытсво, особенно: кватернионы, угловые и линейные скорости, импульсы, позиции - всё это явно физика. Никто не сможет рассказать, как это всё связано с "инвентарностью" объекта?

 

  Часть описания этого интерфейса. Взято из "Universal ACDC (Показать)
Изменено пользователем 7.9

всё легко

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...