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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Очень интересная реализация Lua OOP представлена в комплекте Lua for Windows (для тех у кого есть) по адресу ...\5.1\lua\loop

Там есть чему поучиться.

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

Сравнил скорость работы реализации классов, которая здесь вчера обсуждалась:

  код (Показать)
Изменено пользователем Shredder
Ссылка на комментарий

Это не то, чтобы "полезный" вариант, это единственный вариант реализации ООП в Lua.

Что касается сабжа - неужто те, классы, которые реализуют различные менеджеры, так "тормозят"? Время их работы никчёмно, и разница в десять раз на одном миллионе итераций смотрится просто жалко, к тому же класс profile_timer считает время МИКРОсекундах, получается приблизительно полсекунды на весь процесс - это также не делает из этого бесполезной тратой времени и ресурсов. ИМХО, овчинка выделки не стоит.

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

Shredder,

  Цитата
Конечно, значительного прироста производительности это не даст, но зачем платить лишнее, если можно по-дешёвке взять.

Ненужная оптимизация - зло. Вот рядом жирные фризы от перебора всех предметов на каждом апдейте, неправильных моделей, создания огромных таблиц с одним и тем же содержимым при каждом входе в функцию, которая вызывается на каждом апдейте, горомоздкие (и часто ненадёжные) операции со строками, листинги десятков if ... elseif ... elseif вместо однострочной выборки из таблицы и прочее в этом духе. Положа руку на сердце, скажи, это всё уже изжили полностью? Если нет, то к чему вся эта мышиная возня вокруг микросекундных затрат на вызовы? Это не то что ненужно, но это даже вредно, поскольку в итоге делает код менее понятным при отсутствии видимой выгоды. При этом, ты тратишь своё время, которое мог бы потратить на более полезные вещи (см. выше какие). Т.е. ты конечно поступай как хочешь, но я бы рассуждал именно так.

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

Чтобы изжить, то что ты перечислил и больше, нужно много времени, просматривать код, искать, анализировать, исправлять. Здесь же исправлений очень мало. Создать функцию, которая будет создавать такой класс, скажем NewClass в _g.script. И останется заменить только class "BlaBlaBla" на BlaBlaBla = NewClass() и соответственно конструкторы BlaBlaBla() на BlaBlaBla:new(). Это можно делать время от времени, в поисках того, что ты перечислил.

Ты прав конечно, это капля в море, но она не требует особых затрат. ИМХО.

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

Раз поднялась тема про оптимизацию... Я давно думал об этом, но руки не дошли, да и все не упомнишь. Может есть желание у кого нибудь составить список проблемных мест в скриптах? Именно по файлам. В одну каску это почти нереально - прошелестить все скрипты, но вдруг уже знают глючные модули.

ТЧ 1.0004. SAP и Trans mod

github

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

Даже если и возникнет желание, давайте его обсуждать не здесь, создайте по соседству тему, кто желает, будем обсуждать там, а то мы и так здесь нафилософствовали...

Далее, пожалуйста, по существу: конкретный вопрос - конкретный ответ.

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

Покумекал тут над "классами". Написал функцию на замену луабинд. Кому-то может будет полезно. Кто-то может укажет на недостатки или, не дай Бог, ошибки:

  NewClass (Показать)
  • Нравится 1
Ссылка на комментарий

Shredder, а вот с оптимизацией примера логики проколочка... Это только затормозит работу. :)

Причина проста - выборка из таблицы с одним элементом происходит быстрее, чем с несколькими. Опять же таки разница во времени ничтожна, поэтому это скорее не на оптимизацию похоже, а на приведение в божеский вид...

Хотя где-где, а в логике есть что оптимизировать, например если взглянуть на функцию cfg_get_switch_conditions в файле xr_logic.script, то можно прийти к не до умению с вопросом: почему именно так?

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

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

 

В качестве некоторого оффтопа.

Я как-то провёл эксперимент. Удалил с уровня все объекты, очистил биндер актора, короче, убрал почти всю нагрузку, так или иначе связанную со скриптами или вызываемую скриптами. В итоге, fps конечно подрос, но не сказать чтобы прямо драматически. На динамике и в зависимости от настроек графики на большом уровне типа Кордона fps вырастал процентов на 20-30, а то и меньше. Основная нагрузка, получается, приходится на рендер. И это я ведь вообще всё убрал, а на самом деле вряд ли можно ожидать, что всякими оптимизациями можно убрать хотя бы 5-10% от скриптовой нагрузки. В итоге, условно говоря, можно ожидать от самой хардкорной оптимизации ну скажем 3-5% итогового выигрыша в fps.

Разумеется, не всё так линейно и просто. Иногда оптимизировать можно и нужно, но в целом, как видно, оптимизация ради самого процесса оптимизации ничего не даёт, кроме потери времени. Если на самом деле выловили большую часть грубых алгоритмических косяков, то в чём тогда проблема то? Пользуйтесь на здоровье и не парьтесь.

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

Я не понял, почему затормозит работу?

Если верить описанию функции parse_condlist:

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

Подскажите пожалуйста, какой вариант менее затратный по времени?

1. NewClass.new

2. ...

function NewClass:Get()

return self.new

end

 

соответственно и присваивание в таком же духе

 

ЗЫ это так, ради интереса и ИМХО первый вариант менее затратный, верно?

Изменено пользователем Viнt@rь
Ссылка на комментарий

Shredder,

  Цитата
в ТЧ на баре онлайн только около 50 рестрикторов, в ЗП 260.

...

если убрать логику в скрипты и удалить рестрикторы, это может поднять производительность?

Это количество само по себе ни о чём не говорит. Во-первых, не все рестрикторы имеют логику. Многие, если не большинство, работают по своему основному назначению, рестрикторами т.е., и никакой скриптовой нагрузки не создают. Это, к примеру, все рестрикторы костров. Во-вторых, не такую уж и нагрузку создают эти рестрикторы, даже если и с логикой. Сама логика может быть большую часть времени с неактивной секцией. Если и активная, то там максимум стоит периодическая проверка на попадание какого-то непися или актора в этот рестриктор. Это достаточно малозатратная операция (к слову сказать, рестрикторы со сферическим шейпом в этом смысле намного предпочтительней боксов). Опять же, делается это с пониженной частотой, в ТЧ - всего 5 раз в секунду.

Т.е. не так уж всё плохо в первом приближении. Конечно, надо предметно измерять, тогда и можно будет сказать точно. В ЗП я этого не измерял, поэтому с гарантией не скажу.

  Полезный утиль (Показать)
Ссылка на комментарий
  16.01.2013 в 21:46, Viнt@rь сказал:

Подскажите пожалуйста, какой вариант менее затратный по времени?

Смысл второго варианта, если он вызывает первый вариант внутри себя, для чего такая обёртка?

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

Shredder, после этой функции будет вызвана ещё одна - pick_section_from_condlist, которая будет проверять эти самые условия и перебирать она будет все элементы, именно вот здесь, проверка единственного значения в таблице будет быстрее проверки из четырёх, ко всему в последствии, в саму функцию check_npc_name, передадутся четыре параметра, где вновь будет идти их перебор.

ИМХО, как сказал Саша, всё это настолько мелочно, что бороться за производительность, жертвуя читабельностью кода, - глупо. Одна загрузка модели с анимациями займёт больше времени, чем 1М итераций с инициализацией переменной. Скорее, нужно просто сделать по "человечески" чтобы код был понятнее и глядя на него становилось ясно, что он делает, плюс по возможности использовать какие-то техники оптимизации кода, что тоже будет не плохо. Одним словом - нужно искать компромисс.

 

malandrinus, да, я знаю, что она вызывается при инициализации схемы, т.е. в момент перехода на какую-то секцию. Почему я упоминул её - она максимально выбивается из общего вида, такое чувство, что её дописывали потом, при этом делал это уже посторонний человек. Непонятное именование переменных, минимум оптимизации - всё это можно было бы сделать иначе, культурнее и быстрее.

  Показать

 

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

Вот именно, что в оригинале мы будем иметь 4 условия, каждое из которых содержит =check_npc_name(sim_default) и =npc_in_zone(zat_a2_sr_noweap), и того получаем 2 * 4 = 8, это если уж совсем просто рассуждать

После "оптимизации" будет одно условие, каждое содежит одну =check_npc_name(sim_default:stalker_raider:zat_b14_stalker_:artefact_hunter) и одну =npc_in_zone(zat_a2_sr_noweap). Т.е. получим 4 + 1 = 5. В любом случае утверждение "Это только затормозит работу" не верно. А если ещё немного модифицировать функцию check_npc_name, чтобы после первого совпадения был return, то и того лучше.

Изменено пользователем Shredder
Ссылка на комментарий
  16.01.2013 в 21:46, malandrinus сказал:

к слову сказать, рестрикторы со сферическим шейпом в этом смысле намного предпочтительней боксов

Интересно узнать, почему? Я все время думал наоборот, исходя из логики: объект бокса имеет меньше полигонов (которые нужно проверять) чем сфера.

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

Clayman, какие полигоны в абстрактной сфере? Это всего лишь точка, вокруг которой программно описывается сфера с указанным радиусом, визуального отображения нет, т.е. модель отсутствует.

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

Теперь понятно, а бокс как программно проверяется? Ну просто интересно, раз-уж поднял тему :))

 

Как можно "нарисовать" параллелепипед, если известны координаты его центра, длина, ширина и высота?

Здесь разница в алгоритмах построения не более, очевидно, что сферу "построить" легче.

ColR_iT

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

Ребята, предлагаю прекратить полемику, сильно смахивающую на оффтоп, касательно данной темы и либо закончить, либо открыть соседнюю тему по данному вопросу.

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

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

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

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

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

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

Войти

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

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

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