Рефакторинг 22 000 строк C++: Как победить класс-монстр в Vulkan-движке [Анонс стрима]
Привет, Хабр!
Меня зовут Shagu, и последние несколько месяцев я в одиночку пишу Shuttle Engine — экспериментальный 3D-рендерер и редактор сцен на C++20 и Vulkan 1.3/1.4. Проект ориентирован на современные графические технологии: GPU-driven pipeline (Indexed Indirect Drawing, Compute-пассы для подготовки геометрии), Bindless Descriptors, Buffer Device Address (BDA) и PBR/IBL освещение.
Но, как это часто бывает в инди-разработке, за быстрым прогрессом и красивой картинкой скрывается технический долг.
История одной боли: Эволюция монолита
Изначально весь проект начинался как прототип, и вся инициализация Vulkan, окон и отрисовки находилась… в одной гигантской функции main(). Когда масштабы стали критическими, я перенес этот код в класс Application.
Но теперь и Application превратился в классический «Класс-Бог» (God Class). В одном месте у меня намешано всё:
Инициализация устройств и очередей Vulkan;
Создание Swapchain и управление кадрами;
Запись барьеров (pipelineBarrier2) прямо внутри кадра рендеринга;
Редакторский интерфейс ImGui и логика загрузки ассетов.
Добавление любого нового пасса рендеринга (например, теней или SSAO) превращается в ручное дописывание сотен строк кода в этот монолит и риск сломать синхронизацию Vulkan. Пора это исправить.
Что будем делать на стриме?
В эту пятницу, 5 сентября в 19:00 по МСК (UTC+3), я проведу свой первый LIVE-стрим, который будет полностью посвящен фундаментальному архитектурному рефакторингу Shuttle Engine.
Мы превратим класс Application в легкий и понятный оркестратор (Mediator), разбив его на три независимых модуля:
Application Module (PAL): Полностью изолируем работу с ОС (Win32/SDL), событиями ввода и созданием нативных окон.
Engine Module (Vulkan Runtime): Перенесем туда всю работу с графическим API, VMA, RenderGraph и сценой.
UI Module (RmlUi + ImGui): Выделим интерфейс в отдельный слой.
Этот рефакторинг — критически важный шаг, который подготовит фундамент для следующих тем: асинхронного многопоточного рендеринга и перехода на полноценную архитектуру RenderGraph.
Детали трансляции:
Если вам интересны низкоуровневая графика, Vulkan, C++ и проектирование сложных систем реального времени — подключайтесь к трансляции. Это будет живой, нерепетированный процесс написания кода, обсуждения архитектурных компромиссов и поиска решений.
P.S. Проект разрабатывается независимо. Если вы хотите поддержать создание Shuttle Engine и помочь автору в обустройстве новой рабочей базы в это непростое время, вы можете сделать это на моей странице поддержки: https://boosty.to/shagunov. Любой вклад очень помогает продолжать работу над движком!
До встречи на стриме!