Дядя Миша писал: Ну оно там не вполне квадратичное. В халфе, как мы помним был этот знаменитный множитель на 10.
Да вполне. Множитель не учитывает ни расстояние ни угол, то есть к затуханию отношения не имеет. Он просто позволяет мапперу вбить меньшие числа и всё равно получить нормальный лайт.
Дядя Миша писал: но при этом может рисовать сколько угодно динамических источников света.
Вот кстати некоторые интелы увы не могут только часть рисуют.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Unit писал: Как удаётся совмещать основную работу/вид деятельности и работу над движком, это же уйму времени отнимает, или основная деятельность позволяет параллельно работать на движком
Мне скорее интересно как хватает сил после кодинга еще и какие то статьи на форум писать, да еще и интересные
Ну чтож товарищи. Механизм дельта-компрессии для передачи объекто по сети успешно написан, таким образом сетевой статус Ксаша восстановлен.
Сеть, повторюсь, ждала своего часа с сентября 19-го года, ну и вот.
В новом ксаше больше нет никаких фиксированных структур для передачи данных, типа entity_state_t. Вместо этого - raw-массив фиксированной длины, на данный момент он составляет 256 байт на объект, но его можно без проблем увеличить, это ничего не затронет и не сломает. Достаточно отредактировать одну константу. Массив может быть заполнен произвольными переменными, по выбору пользователя. И эти переменные будут переданы на клиент. Так же появилась возможность передать произвольный набор глобальных переменных. На данный момент я использовал это для передачи переменных, которые в халфе входили в структуру movevars_t. Теперь это больше не движковая, жестко ограниченная структура, а произвольная. Так же появились квары-прокси, к которым можно линковать глобальные переменные. В принципе идея прокси-кваров достаточно старая, они были уже в КрайЭнджине, но почему-то ни до халфы ни до кваки так и не добрались.
Менеджмент передачи переменных на клиент, равно как и вообще доступ движка к переменным осуществляется через свойства (properties). Это гибкий и мощный инструмент языка HeadShot. По своим возможностям свойства наиболее близки к таковым в Delphi, но превосходят и их по гибкости. Вы можете определять что разрешить на чтение, что на запись и как это осуществить - через прокси-функцию или через прямой доступ к памяти. Первый вариант даёт гибкость, второй скорость. Там же, в объявлении свойства определяется и сетевая настройка дельты - кол-во бит, с которым переменная будет передана на клиент. Для переменных с плавающей точкой мантисса и экспонента задаётся двумя наборами бит.
Вы так же можете помечать дельтой целый класс, а не атомарную переменную, в этом случае дельта-калькулятор самостоятельно деконструирует его на базовые типы. Но если класс содержит данные разных типов или вы просто не знаете какие параметры лучше использовать, вы можете оставить это на усмотрение системы.
С учётом иерархии объектов на сервере формируются уникальные дельта-таблицы. Наподобие тех, что в халфе были объявлены в delta.lst, вот только здесь они создаются автоматически и строчки в них сортировать не нужно. Так же эти таблицы отсылаются на клиент, поэтому при приёме переменных вам не надо указывать кол-во бит, с которым переменная должна быть считана - клиентская часть уже знает об этом.
Из недоделанного остался ещё предиктинг, NetAPI и запись\воспроизведение демок, но для сингла это пока что не особо нужно.
А я таким образом могу наконец перейти к самой важной задаче, которая, собственно и делает ксаш - ксашем. К портированию игрового кода Ксаш-мода. По итогам портирования в каком-то смысле я вернусь к исходной точке - т.е. к функционалу Xash3D + XashXT, только без архитектурных ограничений, без множества лимитов и с массой возможностей, которые на старом ксаше были попросту нереализуемы.
Когда ксаш-мод будет успешно портирован на Shot, будет наконец-то достигнута первая точка совместимости.
Crystallize писал: Не думал сделать звук через какой-нибудь OpenAL чтобы он хотя бы сквозь стены не проникал?
OpenAL не работает с окклюзиями, звук так же будет проникать сквозь стены. Это сложная задача, которая будет требовать просчёта физики, Valve заморочились и выкатили свой Steam audio для VR, по сути это физический движок. По тестам оно не хило так нагружает ЦП, вопрос в том стоит ли оно того.
В BSP я думаю это с помощью порталов можно сделать Там же уже заранее предрассчитано кто кого и откуда видит.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша писал: В новом ксаше больше нет никаких фиксированных структур для передачи данных, типа entity_state_t. Вместо этого - raw-массив фиксированной длины, на данный момент он составляет 256 байт на объект, но его можно без проблем увеличить, это ничего не затронет и не сломает. Достаточно отредактировать одну константу. Массив может быть заполнен произвольными переменными, по выбору пользователя. И эти переменные будут переданы на клиент. Так же появилась возможность передать произвольный набор глобальных переменных. На данный момент я использовал это для передачи переменных, которые в халфе входили в структуру movevars_t. Теперь это больше не движковая, жестко ограниченная структура, а произвольная. Так же появились квары-прокси, к которым можно линковать глобальные переменные. В принципе идея прокси-кваров достаточно старая, они были уже в КрайЭнджине, но почему-то ни до халфы ни до кваки так и не добрались.
Менеджмент передачи переменных на клиент, равно как и вообще доступ движка к переменным осуществляется через свойства (properties). Это гибкий и мощный инструмент языка HeadShot. По своим возможностям свойства наиболее близки к таковым в Delphi, но превосходят и их по гибкости. Вы можете определять что разрешить на чтение, что на запись и как это осуществить - через прокси-функцию или через прямой доступ к памяти. Первый вариант даёт гибкость, второй скорость. Там же, в объявлении свойства определяется и сетевая настройка дельты - кол-во бит, с которым переменная будет передана на клиент. Для переменных с плавающей точкой мантисса и экспонента задаётся двумя наборами бит.
Вы так же можете помечать дельтой целый класс, а не атомарную переменную, в этом случае дельта-калькулятор самостоятельно деконструирует его на базовые типы. Но если класс содержит данные разных типов или вы просто не знаете какие параметры лучше использовать, вы можете оставить это на усмотрение системы.
Надеюсь для пользователя этот механизм не будет столь низкоуровневым чтобы ручками самому собирать пакеты приходилось. Сделай ещё закачку ресурсов когда подключаешься к другому серверу во время игры как в UT99
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Там кстати Альбатрос какую то супер закачку у себя в форке сделал, очень быстро работает.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Удалось примерно рассчитать производительность виртуальной машины для Corei3 3.0 GHZ. 200 тысяч инструкций на кадр х 60 кадров ~ 12 MIPS.
Это предельная нагрузочная способность при одноядерной архитектуре в которой остаётся достаточно времени, чтобы все остальным подсистемам движка хватило времени на оставшиеся задачи - дельту, пересылку по сети, интерполяцию, подготовку кадров к рендерингу и фпс при этом не просел ниже 60. Если одно ядро целиком отдать под виртуальную машину и занять его на 100%, то производительность будет около 100 MIPS. Т.е. в 10 раз выше. Порядка двух миллионов инструкций на кадр. А это уже прям сильно за глаза для любой ситуации.
Таким образом есть три пути оптимизации кода на Шоте
1. JIT. Ну тут надо разбираться с генерацией опкодов, с нативными номерами инструкций (поскольку мы будем писать не команды на ассемблере, а их x86 инструкции прямо в номерах опкодов, надо где-то будет найти табличку соответствия, где-то я её видел). У этого подхода есть сразу несколько минусов - во первых он сильно платформозависимый т.е. надо будет написать сразу несколько реализаций, во вторых неприменим в отладочной сборке (а как отлаживать, если один кадр в секунду?), в третьих сложно сказать какой именно прирост он даст. Но полагаю что неплохой, поскольку код на Шоте содержит довольно много динамических условий, которые исчезнут при генерации нативного кода.
Но как решение абсолютно всех проблем он пока что не подходит. Так что пока не планируется к реализации.
2. Мультипоточность. Сервер или даже чисто VM-кадр запускаем на отдельном ядре и получаем очень хороший прирост производительности. Поскольку сервер изолирован от клиента это будет сделать гораздо проще чем в синглплеерной архитектуре без сети. Но есть общий менеджер моделей. Тут либо запретить горячий прекэш, либо очень внимательно отревизить все проблемные места и поставить там тред-локи.
Но пока сеть не финализирована этого делать не следует. А до финализации сети нужна ещё ревизия самого модель-менеджера. Потому что правильно - я им тоже не занимался с 2019-го года. Только добавлял новые типы моделей в уже существующую архитектуру менеджера.
Как оно там всё теперь работает страшно даже представить. Плюс там есть какой-то чудовищный лаг при загрузке даже самых простейших моделей, не представляю себе чем он может быть обусловлен. Надо разбираться. Ну и заодно решить вопрос с докачкой ресурсов. Это всё взаимосвязанные задачи, хотя конечно далеко не такие масштабные, как реализация дельта-компрессии. То есть мы тут опять имеем ситуацию "одно цепляется за другое". Нет, можно конечно игнорировать этот факт, но если делать всё правильно - то только так.
3. Старый добрый приём - если что-то тормозит, вынеси его в нативный код. Здесь у меня очень большое пространство для оптимизации, ибо в данный момент на Шоте написано практически всё. И физика и даже функции трассировки (но сама коллизия конечно в ядре движка, я ещё не сошёл с ума). И судя по результатам профилировки разумеется вся эта физика и отнимает больше всего ресурсов. Что логично и ожидаемо.
В первом квейке как вы помните физику поменять было нельзя вообще.
Она была намертво встроена и пользователь не имел к ней доступа.
Я планирую использовать более гибкий вариант - специальные функции, вызов которых будет осуществлять эволюцию физического кадра. Он так же сможет обращаться к переменным самой энтити, вызывать для нее какие-то каллбэки, менять позицию и углы, это всё будет так же реализовано через доступ по свойствам, которые разрешает именно пользователь. И останется выбор - использовать быструю нативную физику или же самописную. Быстрому внедрению этого варианта мешает тот факт, что надо продумать архитектуру и концепцию абстрактных физических функций, чтобы они годились для большинства игр, например.
А для этого, в свою очередь неплохо бы сначала портировать Ксаш-мод на Shot. И потом уже примерно прикидывать варианты такого абстрактного физического движка.
Мне кажется ядро физики лучше вынести в отдельную нативную либу как это делает физикс или ньютон. И подключать её как отдельный ассет средствами шоты. Тоже касается других модулей где важна производительность, но не требуется особо вмешательство пользователя. При этом у нас всегда есть вариант подключать какие то иные кастомные модули.
Цитата:
Дядя Миша писал: что надо продумать архитектуру и концепцию абстрактных физических функций, чтобы они годились для большинства игр, например.
Ну вот колайдеры, ригидбоди, трасса, пересечения, триггеры, велосити и т.д. это же общие вещи. А вот гибсы или платформы давилки всякие например это уже квейкспецифичные, их можно и на шоте сделать.
Кстати ещё такой вопрос у тебя можно легко и быстро перебросить объект в локальное пространство другого объекта? Ну вот например мы наступили на условную платформу, и теперь двигаемся уже вместе с ней т.к. мы внутри её локального пространства. И так же быстро выпрыгнуть с неё в глобальное?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!