Войти
ПроектыФорумОцените

Самодельный движок и клиент для игры secondlife.

#0
22:07, 18 сен 2022

Представляю вашему вниманию самодельный трёхмерный движок.
Первоначально хотелось повысить свой скилл в программировании и в качестве задачи был выбран проект по созданию своего клиента для игры secondlife. Но с совершенно другой архитектурой.
На сегодняшний момент движок работает от данных сетевого обмена реального клиента - автоматическая генерация трехмерных примитивов, положение объектов и сопоставление моделей и текстур - по результатам разбора записанного сетевого трафика игры.
Модели и текстуры грузятся по мере необходимости из облака LindenLab и сохраняются в 2 кешах - в исходном виде (формат Jpeg2000 и проприетарный упакованный формат LL для мешей) и в обработанном виде для быстрой загрузки.
Рендерер самописный на основе OpenGL.
Стримминг ассетов асинхронный многопоточный.

для примера на видео показано как движок отображает один из регионов игры - происходит разбор записанного сетевого трафика, на его основе строится трёхмерный мир.

Посмотреть видео тут

Использованные сторонние библиотеки:
SDL - для создания окна и обработки событий от клавиатуры.
openjpeg - для декодирования jpeg2000
STB - разбор текста, сжатие текстур dxt3 dxt5, разбор ttf и создание атласа текстур
debug_break - для отладки
handmademath - базовые математические функции с векторами и матрицами
imgui - GUI
libs от https://github.com/mattiasgustavsson/libs - используется только загрузчик файлов по http

#1
22:29, 18 сен 2022
Изображение
#2
(Правка: 10:46) 10:46, 19 сен 2022

А что оценить надо? На видео какая-то жесть из 90х. Исходники? Описание фичей?

#3
10:50, 19 сен 2022

А мне нравится

#4
10:59, 19 сен 2022
Изображение
#5
11:05, 19 сен 2022

inc_ani
> На видео какая-то жесть из 90х.
ну в 90х было сложно забить текстурами дофига гигабайт памяти, просто потому что их не было.

#6
11:47, 20 сен 2022

Сколько на этот движок было потрачено времени?

#7
13:44, 24 сен 2022

Для начала немного описания что из себя представляет мир Secondlife и его особенности с позиции программирования движка.
Во первых это бесконечный мир - песочница. Весь мир делится на регионы типичного размера 256х256 метров, но могут быть и регионы и других размеров - это есть в спецификации но не используется . Каждому региону соответствует свой игровой сервер - симулятор который отвечает за всё что происходит на этом участке пространства.  Регионы могут примыкать друг к другу и тогда можно одновременно видеть в кадре несколько регионов и можно свободно перемещаться между ними. Перемещаться между регионами могут  как аватары так и объекты.  Каждый объект может иметь родителя - тогда его координаты и положение в пространстве высчитываются от положения объекта - родителя.  Все объекты в игре - уникальные - у каждого есть UUID.

Любой объект в любой момент времени может измениться - это основная особенность.

Теперь более подробно об игровых объектах.
1) Поверхность земли представлена картой высот, передается от сервера кусками по 16х16 метров. каждый  кусок запакован проприетарной версией DCT.
2) Примитивы - объекты сгенерированые на стороне клиента по  данным от сервера (параметры кривых - направляющая и образующая) в результате получается некий примитивный трёхмерный объект типа кубика, сферы, тороида, пирамиды и пр. возможно наличие  отверстия и поворота плоскостей. Максимальное количество сгенерированных мешевых поверхностей (граней) - 12.  Если от сервера приходят новые параметры то надо удалить старые поверхности и сгенерировать новые.
3) Гибкие примы - при их генерации на направлющую воздействуют параметры движения - линейная и угловая скорость и ускорения, скорость и направление ветра. Их приходится перегенерировать каждый кадр и сответственно отправлять в видеопамять.
4) Скульпты - Сначала скачивается и распаковывается текстура, где цвет каждой пикселя соответствует сдвигу точки на поверхности сгенерированного прима. потом по размеру этой текстуры генерится примитив с нужными параметрами сетки у каждой грани и потом "раздувается" и передаётся в видеопамять.
5) Мешевые модели - 4 лода и максимум по 8 поверхностей в каждом лоде. может содержать данные рига.

Теперь про особенности сборки всего этого для рендеринга:
Одна и та же геометрия может использовать разный набор текстур/способов наложения текстур - и эти текстуры могут постоянно меняться, есть анимация текстур.
Ничего не получится сильно оптимизировать.

Мир подгружается по сети постоянно и постоянно его надо выгружать из памяти ибо даже топовые компы легко получат несварение от таких объёмов данных. Я для экспериментов накопил 500 Гб кэша текстур jpeg200 и 300 Гб моделей (каждая модель передаваемая из облака упакована gzip)- и это без особых стараний.

Например - на том видео в первом посте все текстуры уже были сконвертированы их jpeg200 в формат dds что позволяет их грузить сразу в видеопамять.  Если не конвертировать а использовать только jpeg200 для на видео вы увидите как будет медленно происходить декодирование - примерно 20 минут на 8 потоков одновременно.
После декодирования dds файлы даже с учётом что я их сжимаю DXT3/5 - получаются примерно в 3 раза больше по объёму чем jpeg200.

Все текстуры разные по размеру и количеству каналов ( 3 или 4) поэтому неполучится использовать 3D текстуры в видеоускорителе. Приходится либо по старинке - биндить каждую текстуру для каждого объекта либо bindless текстуры- но тогда только при наличии соответствующего расширения в opengl.
Модели и текстуры загружаются пользователями - они не оптимизированы и подчас такой хлам, но тем не менее движок должен их переваривать.

Сейчас для отображения всего мира я применил один буфер VBO на все модели и свой менеджер видеопамяти.

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

Если кому интересно - расскажу подробнее про внутреннюю архитектуру.

#8
9:29, 25 сен 2022

vka123
> После декодирования dds файлы даже с учётом что я их сжимаю DXT3/5 - получаются
> примерно в 3 раза больше по объёму чем jpeg200.

Имеется ввиду jpeg2000. По объёму где? На жестком диске или в видеопамяти?
Вы понимаете что у вас ваши jpeg2000 распаковываются в обычные текстуры без сжатия?

ПроектыФорумОцените