Architecture Overview

В этом разделе представлен обзор архитектуры движка Wudgine, его основных компонентов и принципов работы.

Основные компоненты

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

Ядро (Core)

Базовые системы и утилиты, включая управление памятью, логирование, математические библиотеки и обработку событий.

ECS

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

Рендеринг

Графический движок на основе Vulkan с поддержкой современных техник рендеринга.

Веб-интерфейсы

Интеграция с Ultralight для создания пользовательских интерфейсов с использованием веб-технологий.

Физика

Физический движок для симуляции реалистичного поведения объектов.

Аудио

Система для воспроизведения и управления звуковыми эффектами и музыкой.

Плагины

Расширяемая система плагинов для добавления новых функций.

Архитектурные принципы

Wudgine разработан с учетом следующих принципов:

Модульность

Движок построен из независимых модулей, которые можно включать или исключать в зависимости от потребностей проекта:

// Пример конфигурации модулей в проекте
WudgineConfig config;
config.enableModule(Module::Rendering);
config.enableModule(Module::Physics);
config.enableModule(Module::Audio);
config.enableModule(Module::WebUI);

// Инициализация движка с выбранными модулями
Engine engine(config);

Производительность

Оптимизирован для максимальной производительности:

  • Минимизация выделений памяти во время игрового цикла
  • Многопоточная обработка данных
  • Эффективное использование кэша процессора
  • Оптимизированные алгоритмы для критических операций

Кроссплатформенность

Поддерживает различные платформы:

Десктоп

Windows, macOS, Linux

Мобильные

iOS, Android

Консоли

PlayStation, Xbox, Nintendo Switch

Расширяемость

Система плагинов позволяет расширять функциональность движка:

// Пример создания пользовательского плагина
class MyCustomPlugin : public Plugin {
public:
    void onInitialize() override {
        // Инициализация плагина
    }
    
    void onUpdate(float deltaTime) override {
        // Обновление состояния плагина
    }
    
    void onShutdown() override {
        // Освобождение ресурсов
    }
};

// Регистрация плагина
engine.registerPlugin<MyCustomPlugin>("MyCustomPlugin");

Игровой цикл

Основной игровой цикл Wudgine состоит из следующих этапов:

Сбор и обработка пользовательского ввода (клавиатура, мышь, геймпад)

Последовательное обновление всех активных систем ECS

Обновление физического мира и обработка коллизий

Расчет и применение анимаций к объектам

Обработка и обновление пользовательского интерфейса

Отрисовка сцены, постобработка и вывод на экран

// Упрощенная реализация игрового цикла
void Engine::run() {
    while (!shouldExit) {
        float deltaTime = calculateDeltaTime();
        
        // Обработка ввода
        inputSystem.update();
        
        // Обновление систем ECS
        ecsWorld.update(deltaTime);
        
        // Физическая симуляция
        physicsSystem.update(deltaTime);
        
        // Обновление анимаций
        animationSystem.update(deltaTime);
        
        // Обновление UI
        uiSystem.update(deltaTime);
        
        // Рендеринг
        renderer.render();
        
        // Синхронизация кадра
        syncFrame();
    }
}

Управление ресурсами

Wudgine использует эффективную систему управления ресурсами:

  • Асинхронная загрузка: загрузка ресурсов в фоновом режиме
  • Кэширование: предотвращение повторной загрузки одних и тех же ресурсов
  • Потоковая загрузка: загрузка больших ресурсов по частям
  • Управление памятью: автоматическое освобождение неиспользуемых ресурсов
// Пример асинхронной загрузки ресурсов
auto textureHandle = resourceManager.loadAsync<Texture>("assets/textures/albedo.png");
auto meshHandle = resourceManager.loadAsync<Mesh>("assets/models/character.fbx");

// Проверка готовности ресурсов
if (textureHandle.isReady() && meshHandle.isReady()) {
    auto& texture = textureHandle.get();
    auto& mesh = meshHandle.get();
    // Использование загруженных ресурсов
}

Интеграция подсистем

Взаимодействие между различными подсистемами осуществляется через систему событий и сообщений:

// Пример системы событий
// Определение события
struct CollisionEvent {
    Entity entityA;
    Entity entityB;
    Vector3 contactPoint;
    Vector3 contactNormal;
};

// Подписка на событие
eventSystem.subscribe<CollisionEvent>([](const CollisionEvent& event) {
    // Обработка столкновения
    playCollisionSound(event.contactPoint);
    spawnParticleEffect(event.contactPoint, event.contactNormal);
});

// Генерация события
eventSystem.publish(CollisionEvent{
    entityA, entityB, contactPoint, contactNormal
});

Следующие шаги

Теперь, когда вы ознакомились с архитектурой Wudgine, рекомендуем:

ECS: Глубокое погружение

Изучите подробнее систему компонентов и сущностей.

Рендеринг

Познакомьтесь с графическим конвейером Wudgine.

Веб-технологии

Узнайте, как использовать веб-технологии в вашей игре.

Wudgine • © 2025