Phase Of Horizon | HollowEngine
372 subscribers
152 photos
96 videos
12 files
62 links
Engine for development story-based maps & modpacks.

Support the project:
https://boosty.to/hollowhorizon/
Download Telegram
Автоматическая генерация интерфейсов и конфигов 🚛 | День 68

Пока делал систему компонентов - задумался, а как их редактировать? Не буду же я для десятков разных компонентов ручками пилить интерфейсы... Благо есть KotlinX Serialization, который кстати вчера обновился до 1.10.0
Это позволило мне буквально за пару часов накидать генератор интерфейсов на основе классов, получилось довольно просто и удобно 🤔
Пока что правда работы ещё довольно много, нужно добавить поддержку списков, вложенных структур, полиморфизма (когда есть несколько разных типов того или иного параметра), но как будто для конфигов уже штука полезная 👀
🤯5❤2👍2
Всё ещё работаю над синхронизацией компонентов 🍓| День 69

Пока что прогресс достаточно медленный, поскольку есть очень много моментов, которые стоит учесть:
1) Есть несколько разных подходов к синхронизации и я пока не могу определиться, какой будет эффективнее при большом количестве сущностей
2) В идеале мне нужно использовать подход, при котором компоненты можно будет добавлять через скрипты и без перезапусков
3) Эту систему нужно связать с другой системой из поста выше. Причём прикол в том, что через редактор ведь можно менять все компоненты, а не только синхронизируемые с клиентом 🙃
4) В будущем компоненты будут не только частью нпс или мобов, но смогут быть применены и для блоков с предметами, так что лучше сразу это учесть

Но всё таки, это чуть ли не ядро всего движка, так что думаю если тут схалтурить, то в будущем это может вызвать куда больше проблем, чем сейчас. Особенно, когда уже будут свои проекты, которые не хотелось бы сломать одним переименованным или удалённым компонентом)
👀2
This media is not supported in your browser
VIEW IN TELEGRAM
Синхронизация компонентов теперь работает 🪨 | День 70

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

Ну и нужно будет написать интеграцию компонентов с редактором нпс, после чего можно уже завершать логику системы анимаций и их редактора 🌃
❤7
Media is too big
VIEW IN TELEGRAM
Синхронизация компонентов между измерениями ⌨️ | День 71

Доработал вчерашние проблемы, добавил синхронизацию и трекинг сущностей, теперь вроде всё работает как надо, осталось прикрутить сам редактор и префабы 👀

Думаю со дня на день уже новый билд в сообщество для тестирования отправлю 🙃
❤6
Кому нужен маркап, когда есть маркдавн? ✅ | День 72

Сегодня ещё немного доработал парсер Markdown, появилось много новых фишек:
1) Картинки
2) Нумерованные и маркированные списки
3) Чеклисты
4) Более умные вставки с кодом
5) Цитаты

Похоже скоро кому-то придётся делать документацию :D
❤5👍3🔥2
Оптимизация Minecraft или "Почему лагает даже на RTX 5090"? | День 73

Недавно я начал углубляться в тему рендеринга Vulkan (да и OpenGL), а также изучил подходы к рендерингу в популярных движках вроде Unity или Unreal Engine 5. В связи с этим хочу рассказать про подход Minecraft (да и Hytale в том числе). Пост большой и отношения к HollowEngine практически не имеет, но возможно кому-то будет интересно почитать :)

Думаю все заметили, что при 32 чанках уже начинаются просадки FPS, причём даже на топовом железе, которое легко тянет киберпанк в 165 fps, но Minecraft без теней, отражений, реалистичной воды едва-едва вывозит 80 кадров, но почему?
Прежде всего, при прогрузке мира все чанки упаковываются в уникальные VAO - это что-то вроде большого массива с вершинами, координатами текстур, цветом, освещением и т.п. После чего для каждого чанка вызваются команды вроде "Установить текущий VAO" и "Нарисовать текущий VAO". Вроде бы всё просто и логично? - Но в этом и заключается проблема, когда таких чанков 100-200 штук, это не так уж и страшно, но на деле их тысячи. И проблема даже не в том, что железо слабое. Проблема в том, что эти команды идут примерно по следующему пути: Java (JNI) -> OpenGL -> CPU -> GPU, то есть для каждого чанка приходится постоянно спамить от процессора к видеокарте по одной команде: "Нарисуй этот чанк". И даже если у тебя видеокарта легко справится с сотнями миллионов вершин, ей эти данные будут поступать такими маленькими группами, грубо говоря забивая шину.

И что же с этим делать и почему в других играх такой проблемы нет? - Прежде всего, в других играх всё куда проще, если в Minecraft нужно зарендерить город, видеокарта получает условные 500 команд "Нарисуй этот чанк", а в большинстве других игр это просто 1 команда "Нарисуй мне город целиком". Логично было бы сделать также в Minecraft, но тут возникает нюанс: в Minecraft вы легко можете сломать любой блок в мире, а в других играх - нет, максимум только некоторые допустимые объекты, вроде тех же деревьев. А после ломания блока придётся целиком обновить всю карту и отправить новую на GPU.

Но решения тут всё же есть, по сути их 2: LOD'ы и Indirect-рендеринг. Плюс их можно комбинировать между собой.
Про LOD'ы расскажу лишь кратко: они просто упрощают и объединяют те чанки, что находятся далеко от игрока, тем самым вместо того, чтобы рисовать 9 чанков, может быть нарисован всего один, но упрощённый. Игрок всё равно не заметит разницы, ведь он сильно далеко, но у такого подхода есть 2 больших минуса. Он требует очень много оперативки, ведь нужно хранить геометрию не только для обычных чанков, к тому же и сам мир приходится прогружать на тысячи блоков вперёд. А ещё перестраивать эти LOD'ы очень дорого, поскольку обычно есть где-то 6-8 уровней детализации и объединения нескольких чанков и получается - игрок сломал блок, и теперь придётся все эти LOD'ы строить заново. Тут конечно много хитрых ходов, огромные БД, генерация чанков на GPU и т.п. Но я сам в это дело пока не лез, так что строить теорий не буду.
Второй метод, Indirect-рендеринг, на деле куда интереснее: Вместо того, чтобы делать отдельный VAO под каждый чанк, создаётся один большой массив для всех прогруженных чанков и в этом массиве размечается пространство (грубо говоря, каждые 1024 байта - новый чанк), при добавлении новых чанков они записываются в этот массив и сохраняется индекс этого чанка в массиве, а при удалении этот индекс просто удаляется (при этом сам чанк может и дальше висеть в памяти, со временем его просто заменят другие чанки), а вместо 500 команд "Нарисуй мне этот чанк", создаётся всего одна: "Нарисуй мне объекты из {массив} с индексами [0, 1, 3, 6, 7, ...]".
Появляется логичный вопрос - моджанг нанимают на работу говнокодеров почему в Minecraft сразу так не сделали? А всё просто, такие возможности появились только в OpenGL 4.0, а Minecraft держит совместимость c 3.2 (он вышел в 2009), поэтому никакой оптимизации под современное железо там и не делают.
Разве что с одним уточнением - Sodium использует схожий подход, но с небольшими упрощениями (опять же, для совместимости).
❤4😱2
Не так давно я попробовал сам реализовать нечто подобное в Kool, и вышло достаточно интересно, у него вышло без просадок рендерить 50 000 анимированных объектов без каких либо просадок (без анимации просадки FPS начались уже где-то на 700-800к), причём это не обязательно должны быть кубы, можно было бы использовать и чанки. В общем было бы интересно однажды написать свой аналог Sodium+Iris+Vulkan+NVidium, но работы там много, и сомневаюсь, что оно вообще кому-то надо :D
❤6👻2👀1
Шейдеры и эффекты переходов между локациями ☂️| День 74

Пока тестировал систему шейдеров Kool сделал несколько интересных эффектов 👀
Думаю довольно интересно будет подобное использовать во всяких синематиках, правда придётся для подобных штук конфиги писать, но как будто не так страшно 🤔
Уже не просто затемнение экрана, как в Legacy, не так ли?)

https://www.youtube.com/watch?v=Swl5So71zYM
❤7👏4
Могут ли нейросети помочь в моддинге? 🤖 | День 75

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

Так что советую посмотреть, пост бесплатный 🙂
❤3🔥2
Виталик стал Геммой 😨 | День 76

Раз уж вчера зашла речь про нейронки, то держите новый ролик с ИИ фишками :D
Если коротко, то написал небольшой запрос и как видите, нейронка его придерживается 🤔
Правда тут нужна или облачная модель по подписке или локальная модель весом около 8гб с сильной видеокартой и кучей памяти, на CPU ответы генерятся по 40-120 секунд)

https://youtu.be/P9eef8NLJLM
🥴6❤1
2 миллиона скачиваний 💎| День 77

Ну что, пришёл ещё один миллион скачиваний, а изменилось ровным счётом ничего 🙃
Мод, созданный за 4 часа просто из-за того, что мне не понравилось оформление квестов в одной сборке стал популярнее HollowEngine более чем в 200 раз)

Ну, а насчёт движка, я постепенно возвращаюсь к активной разработке, так что ждём версию где можно будет потыкать редактор компонентов 🧠
❤7
Дорабатываю компоненты 🎓 | День 78

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

Следующая задача: Префабы, чтобы эти компоненты уже можно было настраивать через редактор, а не костыли с командами. Несколько постов назад показывал его прототип интерфейса, но там всё ещё стоит доработать валидаторы (например, чтобы нельзя было указать несуществующую модель)
👍2
Как работает генерация структур в Minecraft? ⛰ | День 78

Недавно решил посмотреть как устроен современный генератор мира и структур в Minecraft, оказывается многое изменилось со времён 1.16.5, когда я последний раз его анализировал :D (именно полноценно, а не просто по гайду структуру добавить и пару циферок в конфиге поменять)

И на удивление нет ни одного нормального ролика или статьи на эту тему, придётся сделать это самому... По сути все генерация сводится к 4 этапам:
Этап 1: Математика
Шум Перлина: Для каждой точки (x,z) вычисляются абстрактные параметры: Температура, Влажность, "Континентальность", Эрозия.
Выбор Биома: Игра смотрит в таблицу: "Тут жарко и сухо? Значит, будет Пустыня". Биом назначается региону, но блоки ещё не ставятся.
Планирование Структур (Structure Placement):
- С некоторым шансом и при определённых условиях игра решает: "Здесь будет центр Деревни".
- Берётся структура, собирается её полноценный вариант (все домики и трапинки в деревне) и вычисляются её размеры (BoundingBox).
- Важно: В чанк записывается невидимая метка StructureStart ("Здесь занято!"), но физически в мире всё ещё пустота. (Но это позволяет использовать команду /locate или даже визуализировать размеры структуры при наличии определённых модов)

Этап 2: Формирование Ландшафта
Расчет высоты: Генератор спрашивает: "Какой высоты тут должна быть гора?".
Вмешательство (страшная штука под названием Beardifier):
- Если рядом есть метка структуры (из Этапа 1), Beardifier говорит: "Стоп! Тут должен быть дом, тут нужно сглаживание".
- Шум плавно искажается под структуру. (Примерно как в видео)
Базовая заливка: Только сейчас пространство заполняется базовыми блоками (Камень, Глубинный сланец, Вода) согласно форме ландшафта.

Этап 3: Резьба и Покраска
Карверы: Специальные черви-алгоритмы прогрызают в камне пещеры и каньоны. Они, наоборот, удаляют блоки.
Обычно они настроены не трогать места, помеченные как Структура. Чтобы вдруг посреди данжа не появилось пещеры))
Поверхность: Верхние слои камня заменяются на блоки биома (Трава, Песок, Снег, Мицелий).

Этап 4: Наполнение
Только теперь игра берет тот виртуальный план из Этапа 1 и физически ставит доски, стены, сундуки, заменяя собой воздух или камень.
Декорации (Features):
Генерируются руды, деревья, цветы. Причём самое забавное, что те же руды вполне могут заменить блоки камня в структуре, так что имейте это ввиду :D
Перед спавном дерева игра проверяет: "Я не внутри структуры?". Если внутри - дерево не растет.

Ну и уже потом, когда мир начинает тикать, начинают спавниться мобы, тикают блоки и т.п.

Я конечно многое упростил, поскольку этапов так немножко больше:
empty → structure_starts → structure_references → biomes → noise → surface → carvers → liquid_carvers → features → light → spawn → full
Но думаю и так тема не самая простая, пока что остановимся и на этом 🙃

P.S. Ролик с подстановкой окружения под структуру не поместился, так что отправлю следующим постом
❤2🔥2👀1
This media is not supported in your browser
VIEW IN TELEGRAM
Если прям упрощённо, то есть мир и при наличии структуры эта штука как бы сглаживает ландшафт в пользу структуры, которая тут будет расположена, короче говоря довольно хитрый алгоритм интерполяции на максималках 👀
❤2❤‍🔥1