Самая последняя строчка!!! Производит вызов функции при кэшировании файла.
И еще вопрос:
Из функции start_del:
Код:
db.actor:set_fastcall(del_changer, db.actor)
Это значит, что функция del_changer начинает постоянно апдейдиться, я правильно понял?
Правильно!
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Эмм, не совсем понял.А когда(при каких условиях) файл кешируется?
При любом, первом обращении к файлу. Если хоть одна функция в файле вызывается из-вне, то файл будет кэширован автоматически, при загрузке. Если с внешними файлами связи нет, то производить это нужно в ручную, методом prefetch("имя_модуля").
P.S. На предыдущей странице тема кэширования файлов уже обсуждалась.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Хотя тема 'кеширования' уже ообсуждалась на пред.страничке, но ... предлагаю ее еще немного помусолить :-).
Во-первых подолью немного масла в огонь: есть еще такой файлик db.script, и если его поисследовать то ... можно увидеть что и это метатаблица, включающая в себы те же модули, что и в _G. 'Теже' - тут условно, т.к. некоторых может и не быть, некоторые могут быть искусственно приравнены к 'false' или за'nil'ены.
Во-вторых, стОит вероятно пояснить 'новичкам' и малоопытным собственно термин 'кеширование', применительно к обсуждаемому контексту. Все же это больше жаргонарий программеров, а не точное определение сути.
singapur22: Если хоть одна функция в файле вызывается из-вне, то файл будет кэширован автоматически, при загрузке. Если с внешними файлами связи нет, то производить это нужно в ручную, методом prefetch("имя_модуля").
Попробую немного пояснить/поправить, дабы 'новичкам' было попонятнее почему же 'автоматически' и для чего же 'вручную':
Собственно файлы-скрипты - это тексты-сценарии, которые встроенным в движек игры интерпретатором LUA читаются, парсятся (разбираются на компоненты) и выполняются.
Возьмем типовой случай, когда в биндер актора (bind_stalker.script) добавлена своя функция (my_function) из своего файла-скрипта (my_scriptfile): function actor_binder:update(delta)
...
my_scriptfile.my_function()
...
end
Интерпретатор, читая построчно файл 'bind_stalker.script' доходит до строчки: my_scriptfile.my_function()
Разобрав ее, получаем компоненты: требуется обращение к файлу/модулю 'my_scriptfile' в котором требуется вызвать функцию 'my_function'. Если это первое обращение - файл 'my_scriptfile' считывается в метатаблицу '_G', т.е. можно считать - кешируется, хотя более точное определение (ИМХО) - буферируется. При последующих обращениях все вызовы для этого файла идут уже не из фактического файла, а из его копии в буфере (_G[my_scriptfile]).
Однако, в случаях неявного вызова функции/переменной из стороннего файла типа:
my_func = my_scriptfile.my_function() обращение к файлу происходит только в момент использования переменной 'my_func', т.е. отложено во-времени и соответственно отложено кеширование/буферизация в метатаблицу _G.
Почему же требуется 'ручной' вызов своего файла-скрипта?
Возьмем пример вызова своей функции из своего файла из диалогов, что нередко при том же спавне объекта из диалога: my_scriptfile.my_function
или типа: my_scriptfile.my_function
В этом случае отсутствует прямое обращение к модулю, а в диалоге запоминается требуемый элемент из этого модуля.
По моим наблюдениям именно в подобных случаях происходят фатальные ошибки (безлоговые!) если ранее данный модуль (my_scriptfile) не был включен в метатаблицу '_G'.
И не обязательно использовать что -то типа prefetch("my_scriptfile"), достаточно и: if my_scriptfile then
my_scriptfile.my_function()
end
Т.е. при проверке условия 'if my_scriptfile then' происходит первичное обращение, приводящее к 'кешированию' данного модуля в метатаблицу и уже последующие вызовы обращены к уже существующей копии ...
Да там их чуть больше десятка (с симбионовским не сравнивай). А в _G их несколько сотен. Есть разница?! :-) Соответственно, упомянутое выражение не слишком сюда подходит. То, что db --глобальная метотаблица, это и ежу понятно. Всётаки файл с глобальными переменными. Но в любом случае загрузка этих модулей не будет произведена, пока к файлу не будет получена хоть одна ссылка (обращение) из уже загруженного файла (модуля).
отредактировал(а) singapur22: 31-08-2010 13:53 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Возможно ли проверить дистанцию ГГ до Сидора, находясь не на кордоне,а в Баре, например?Думаю, тут не будут работать стандартные способы для проверки дистанции.
singapur22
Ежу то понятно, но я пишу больше не для 'ежей', а 'ежат'. :-)
Да и ... ежам понятна большей частью верхний уровень, а нюансы и их понимание/использование, как правило, отложены на потом ... Но думаю если это будет интересно, то 'подлитое масло' можно будет и дальше поразбирать или ... забыть.
singapur22
: Но в любом случае загрузка этих модулей не будет произведена, пока к файлу не будет получена хоть одна ссылка (обращение) из уже загруженного файла (модуля).
а вот тут ты оч.сильно заблуждаешься.
Когда я ковырялся с динамическим под(от)ключением опциональных модулей, то не все было так просто. При определенных условиях даже обнуленный в db.script (db[module] = nil/false) познее был полностью там восстановлен, хотя и не было никаких его вызовов.
(предлагаю немного по-порядку, а то кусочное обсуждение будет довольно запутанным).
Для загрузки всех модулей файла, не обязательно производить обращение к каждому модулю. Достаточно обратиться к файлу, или к одному из его модулей, и все его модули будут загружены (востановлены).
Ладно. Давай по порядку.
отредактировал(а) singapur22: 31-08-2010 14:08 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
TYOPA, я говорю про МЕТОД увеличения зума, т.е. через скрипт. Например, при любом оружии или вообще без оружия можно увеличить зум на столько-то. По-любому должно быть. В луа хелпе увидел это:
const kCAM_ZOOM_IN = 21;
const kCAM_ZOOM_OUT = 22;
Но мне кажется, что НЕ через этот метод надо увеличивать зум в игре.
singapur22
1. Под модулем в данном обсуждаемом контексте я пока подразумеваю файл-скрипт, а не элементы этих файлов. Т.о. говоря о загрузке модуля - подразумеваю загрузку в метатаблицы _G или _db именно таблиц файлов, а не их отдельных элементов (_G["module_name"], db["module_name"]).
2. Все же следует при наших рассуждениях учитывать, что собственно имеется три этапа (временнЫх отрезка):
- старт игры и инициализация всех требуемых элементов (услловно окончание: загрузка всех объектов игры и/или device().precache_frame == 0);
- собственно игра ...
- остановка игры, запись различных параметров/элементов и разинициализация всеЯ.
Про 3-ий этап пока нет смысла говорить, а вот про первые два как раз и идет речь.
singapur22: Достаточно обратиться к файлу, или к одному из его модулей, и все его модули будут загружены (востановлены).
Если на 1-ом этапе различные обращения вызовы модулей(файлов) приводят к появлению их копий в метатаблицах, то уже на 2-м этапе это несколько иначе. Как минимум, если в метатаблице уже есть ненулевая запись о модуле (например db["module_name"] == false), то на 2-м этапе эта запись неизменна при попытках вызова данного модуля, а вот на 1-ом этапе - таблица модуля кешируется/восстанавливается. С _G["module_name"] я пока не экспериментировал за ненадобностью, но подозреваю аналогию.
Т.о. твоя фраза корректна для 1-го этапа, да и то вероятно не при всех моментах, а для 2-го - только если запись в метатаблице отсутствует или занилена. (о cse_abstract и смене ID для съеденного хлеба).
Собственно при первичной инициализации объекта игры его табличка параметров 'cse_abstract' создается с нуля, т.е. в ней нет никаких данных, кроме шаблонных дефолтных значений. Отсутствует и имя и секция и пр. параметры. Не могу точно утверждать о моменте выделения ID для объекта, то подозреваю, что его закрепление происходит именно при инициализации. Т.о. 'плавающие' идентификаторы, которые ты читал в момент начала инициализации объекта, вполне понятны.
То, что после съедания (да и иного исчезновения из игры) объекта его идентификатор освобождается и может быть выдан любому вновь созданному объекту - это вроде как очевидно.
Artos На счёт модулей, всё понял. Спасибо за разъяснение. А вот на счёт cse_..., немного не так. Кстати выяснил, что и с клиентскими классами та же лабуда, если не задавать имя секции объекта. Я незнаю как это даже описа**50316ea8aab1bb10eeba**писка показываемых. Щас попробывал произвести такую подноготню:
файл _s.script с классом:
[code]class "ss" (cse_alife_human_stalker)
function ss:__init()
end[/code]
тестовый файл запускаемый при юзаньи ре-аптэчки:
[code]if db.b == nil then
db.b = _s.ss()
news_manager.send_tip(db.actor, tostring("spawn"))
else
local sobj = alife():object(db.b.id)
if sobj then
alife():release(sobj, true)
news_manager.send_tip(db.actor, tostring("release"))
else
news_manager.send_tip(db.actor, tostring("a netu"))
end
end[/code]
При всём этом, также выводится его id на монитор. Если тестируемого объекта в db.b нэту, то сообщается.
[code]local ff = db.b
dat = dat.. string.format("%s\\n", tostring(ff and ff.id or "объект удалился"))[/code]
Результаты тэста:
1. id не удаляется, но смена айдишек начинает вести себя немного иначе (появляются новые)
2. id удалённого объекта продолжает появляться с той же интенсивностью. Но объекта с данной айдишкой он уже не находит.
3. после удаления порядка 10 объектов игры, удалился и сам тестируемый объект. (видимо всётаки он имеет своё айди, и оно так же появляется в списке)
отредактировал(а) singapur22: 31-08-2010 16:18 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Сорри, или мы о чем то разном или ... я недопонимаю.
по мере счёта времени в игре (даже если мы совсем ничего не будем делать), значение айди нашего объекта будет постоянно колебаться.
Если под 'айди' мы оба подразумевает игровой идентификатор объекта: object.id (для серверного) или object:id() (для клиентсого), то этот ID никогда для данного объекта не меняется/колеблется! Он постоянен на протяжении всей игровой жизни объекто, т.е. с момента его создания и до момента его удаления из игры.
Мне непонятно из каких таких данных ты делаешь заключение о колебаниях этих идентификаторов. Приведи, плз, куски кодов, из которых можно было бы понять как ты их считываешь ... Модет быть у тебя считывается идентификатор НЕ с одного и того же объекта?!
Если же объект удален из игры, то как уже и писал ранее, этот идентификатор освобождается и естественно при появлении в игре нового объекта ему выделяется идентификатор, которым запросто может быть ранее закрепленный за уже бывшим объектом в игре и теперь удаленным.
В игре постоянно идет ротация игровых идентификаторов. Объекты удаляются -> ID освобождается -> Объект создается -> выделяется свободный ID. И естественно это до бесконечности (до окончания игры).
Именно поэтому, различные запоминатия идентификаторов в таблицы/переменные требуют и очистки при смерти/поедании/... т.е. при удалении объектов из игры и/или перепроверке при использовании идентификатора: а тому ли объекту он принадлежит, что был ранее запомнен.
Слушайте товарищи, а как сделать новый генерирующийся диалог, типа: Можешь чего интересного рассказать. Я знаю что это довольно таки... эмм непросто, но может быть у кого-то остался тутор\статья по этому делу, или кто-то сам знает и без проблем мне объяснит что к чему. Да я видел, здесь давно Максим Р. писал тутор по этому, но теперь найти его пост, врятли кому нибудь удастся. (я искал - не нашел)
Новый проект в разработке, ищи в моём журнале.
В теории - всё легко, а вот на деле - гораздо сложнее.
В Моде FreeplayStart 1.2 убрано подскакивание и сверкание артефактов. Вопрос - как вернуть подскакивание, сверкание, а также, если возможно, как добавить артефактам цвет на определённый радиус? Просто видел в каком-то моде давно (кажется, АМК), как артефакты помимо сверкания и подскакивания, ещё и светились, например, синим, красным, фиолетовым и т.п. цветами. Как всё это можно провернуть?
Слабый пол сильнее сильного в силу сильной слабости сильного пола к слабому. Ну да поможет Вам F1, да сохранит Вас F2. Во имя Control`a, Alt`a и святого Delet`a. Enter.
Horrible area modВидео в журнале
--------------------------------------------------------------------
Важнейшая задача цивилизации - научить человека мыслить
Fantom2323
И я знаю, как создавать подобные диалоги, и другие ... однако тутора НЕ имею и не знаю 'чужих'. А вот 'без проблем объяснить' - это врядли, т.е. это не использование правки пары цифирек в конфиге или написание небольшойй функции из штатных методов ...
Собственно всё для подобных диалогов можно посмотреть в 'dialog_manager.script'.
Хочешь - глянь как создаются аналогичные диалоги охотников в Симбионе (m_hunters.Add_IntroPhrase(sStr) и m_hunters.CHunterManager:Generate_News())
СидырыЧЪ
Ты балбес! Спрячь свою бодягу под спойлер! 8-)
И вот загляни Сообщение #1265010 специально для таких лентяев как ты выложил :dry:
Artos
Честно говоря - ожидал другой более емкий (по инфе) ответ, ну что ж, как говориться: Да возрадуйся малому, тогда и великое придет. :-) Будем копать\искать дальше сами. :ye)
Новый проект в разработке, ищи в моём журнале.
В теории - всё легко, а вот на деле - гораздо сложнее.
Fantom2323
Т.к. предполагая, что ответ по сути врядли кто стал бы писать, а псевдо-ответы от малознающих/малопонимающих бессмысленны, также не зная тутора по созданию подобных диалогов, все же решал дать тебе хотя бы исходные материалы ...
Разбирать как и что в dialog_manager.script - это не для подобного топика.
Упомянутая в ответе 'm_hunters.Add_IntroPhrase(sStr)' уже достаточно информативна для начала самостоятельного ковыряния.
Возникнут отдельные вопросы - велкам! Писать же туторы - увольте.
Повторю свой вопрос, ибо уже новая страница - вряд ли кто-то глянет на предыдущуюю, поэтому:
В Моде FreeplayStart 1.2 убрано подскакивание и сверкание артефактов. Вопрос - как вернуть подскакивание, сверкание, а также, если возможно, как добавить артефактам цвет на определённый радиус? Просто видел в каком-то моде давно (кажется, АМК), как артефакты помимо сверкания и подскакивания, ещё и светились, например, синим, красным, фиолетовым и т.п. цветами. Как всё это можно провернуть?
Слабый пол сильнее сильного в силу сильной слабости сильного пола к слабому. Ну да поможет Вам F1, да сохранит Вас F2. Во имя Control`a, Alt`a и святого Delet`a. Enter.
Artos
Да без проблем, я все понимаю. И согласен что лучше худой ответ реально знающего человека, чем бессмысленная и бесконечная демагогия от школоты. Правда симбу вашу ещё не качал, ну да и ладно, раз ответ кроеться там, то почему бы её не скачать? :-)
Писать же туторы - увольте.
Да я и не просил как бэ &P Т.к понимаю какая это нудная и долгая работа :-)
Ну что ж, и на том спасибо коллега :-beer)
Новый проект в разработке, ищи в моём журнале.
В теории - всё легко, а вот на деле - гораздо сложнее.
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.