16

Вся наша жизнь спираль: Синтез субатомных частиц

Серия Вся наша жизнь спираль

Прошел год с моего последнего поста, пора пилить следующий.

Сегодня снова поговорим о сети и об организации мира Синтеза.


Главное изменение сетевой модели, который получил Синтез - это полный авторити сервер.

Тем не менее, проблемы, которые я описывал ранее в L.I.M.A., никуда не делись, поэтому появился другой модуль, позволяющий обсчитывать сразу несколько "карт" и сливать их в одну карту, с репликой, по необходимости, на клиенты. Модуль имеет открытый исходный код и может быть найден тут: https://github.com/Delta-Proxima-Team/UE4-Module-RelatedWorl...

Если описать простым языком, то он работает по принципу инстанцев в небезызвестной Elite: Dangerous, с той лишь разницей, что можно передавать информацию сразу с нескольких инстанцев в единое мировое пространство клиента.


Карта, в отличии от L.I.M.A. в Синтезе полностью статична. Каждая звездная система заботливо расположена руками, а т.к. место действия происходит в отдельном шаровом звездном скоплении, то их не много. Но конкретно о карте и ее топологии поговорим в другой раз, т.к. при разговоре о ней, нужно будет коснуться и фракций, которые в ней обитают, а об этом, на данный момент я говорить не готов. Вместо этого поговорим об общем ее строении и проблемах, связанных с ней.


Мир Синтеза, как и в L.I.M.A. бесшовный. При полетах игрок не видит никаких загрузок. Перелет между системами выглядит плавным, между звездными системами можно встретить всякие интересности, или приключения на свою задницу. Это частично достигается новым сетевым модулем, а частично системой представления удаленных объектов. Она основана на методе пересчета размера небесных тел через их угловой размер. Об этом немного поподробнее.


Подсчет углового размера любого небесного тела можно представить вот таким-вот образом:

, где D - расстояния от наблюдателя до границы объекта, а d - диаметр этого объекта.

Если расстояние D известно, то можно через обратное преобразование получить его радиус.

Грубо говоря, если объект находится на расстоянии 1 светового года от наблюдателя, то мы можем передвинуть объект на расстояние, допустим в 1км, и, зная его угловой размер пересчитать его радиус таким образом, что для наблюдателя он будет неотличим от объекта, если бы он был расположен на расстоянии одного светового года.

В ходе нехитрых преобразований, мы получим вот такую вот формулу:

В коде, конечно-же, формула будет выглядеть как VisibleDistance * (RealRadius/RealDistance), т.к. отношение RealRadius к RealDistance безразмерный коэффициент. Это была первая проблема.


Вторая проблема это float и разница в единицах измерений (от сантиметра до светового года).

Как известно, если говорить, о целой части float, то она дает достаточную точность для целых чисел, значение которых можно уложить в 3 байта. Если дать больше конкретики, то это число 16 777 215 (16,7 км в единицах анрила). Дальше начинаются проблемы с точностью. Для обхода этой проблемы, и помня, как была решена проблема с размерами объектов, было принято решение делать "Continuous calculation". В такой системе, при подаче некоторого числа на вход, необходимо так-же указать его единицы, и, если оно выше или ниже некоего предела оно будет последовательно переведено в более подходящее для этого числа единицы (пример: если мы дадим на вход 100 000 см. то сначала будет выполнен перевод в 1 000 м, а потом в 1 км ). Таким образом, какое бы расстояние мы бы не передали, то на выходе, оно всегда будет занимать меньше трех байт. Погрешности, конечно-же, никуда не делись, но они нивелируются по мере уменьшения масштаба вычислений. Условно, чем ближе наблюдатель к объекту, тем меньше погрешность. Ну и соответственно, чем дальше, тем погрешность больше, но из-за большого расстояния - глазу не заметно и она не имеет тенденции к накоплению.


Третья проблема - туманности. Т.к. космос бесшовный, то они должны быть 3д. Как нарисовать 3д туманность? Эксперименты показали, что метод Density RayMarcher подойдет лучше всего.

(полученную из фрактала текстуру следует подчистить от артефактов)

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


Ну вот пока и все. Да, я знаю, что обещал рассказать более подробно о самой Вселенной синтеза, но пока, увы, не готов этого сделать. А значит, отложим это на следующий раз.


Как бонус: один из ранних рендеров безатмосферных планет.

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества